数据采集:亚马逊畅销书的数据可视化图表

## 导语

亚马逊是全球最大的电子商务平台之一,它提供了各种类别的商品,其中包括图书。亚马逊每天都会更新它的畅销书排行榜,显示不同类别的图书的销量和评价。如果我们想要分析亚马逊畅销书的数据,我们可以使用爬虫技术来获取网页上的信息,并使用数据可视化工具来绘制图表,展示图书的特征和趋势。本文将介绍如何使用Python和Scrapy框架来编写爬虫程序,以及如何使用亿牛云爬虫代理服务来提高爬虫效果。本文还将介绍如何使用Matplotlib库来绘制亚马逊畅销书的数据可视化图表。

## 概述

本文的目标是编写一个爬虫程序,从亚马逊网站上获取畅销书的数据,并绘制数据可视化图表。具体步骤如下:

- 创建一个Scrapy项目,定义一个Spider类,设置起始URL和解析规则。

- 使用亿牛云爬虫代理服务,设置代理IP,避免被网站屏蔽或限制。

- 使用Scrapy的Item类,定义需要获取的数据字段,如书名、作者、价格、评分等。

- 使用Scrapy的Pipeline类,将获取的数据保存到CSV文件中。

- 使用Matplotlib库,读取CSV文件中的数据,绘制柱状图、饼图、散点图等,展示不同类别的图书的销量和评价。

## 正文

### 创建Scrapy项目和Spider类

首先,我们需要安装Python和Scrapy框架。Python是一种流行的编程语言,Scrapy是一个用于爬取网页和提取数据的开源框架。我们可以使用pip命令来安装Scrapy:

```python

# 在命令行中输入以下命令

pip install scrapy

```

然后,我们需要创建一个Scrapy项目,命名为amazon_books。我们可以使用scrapy命令来创建项目:

```python

# 在命令行中输入以下命令

scrapy startproject amazon_books

```

这样就会在当前目录下生成一个名为amazon_books的文件夹,里面包含了项目所需的文件和目录。其中最重要的是spiders目录,这里存放了我们定义的Spider类。Spider类是用于爬取网页和提取数据的核心组件,它需要指定起始URL和解析规则。

我们可以在spiders目录下创建一个名为books_spider.py的文件,并在其中定义一个名为BooksSpider的Spider类。我们可以从scrapy.Spider类继承,并设置以下属性:

- name:Spider类的唯一标识符,用于运行爬虫程序。

- start_urls:起始URL列表,指定了爬虫程序要访问的网页。本文以亚马逊美国站点上[Best Sellers in Books](https://www.amazon.com/best-sellers-books-Amazon/zgbs/books)为例。

- parse:解析方法,用于处理响应对象,并提取所需的数据或生成新的请求对象。

以下是BooksSpider类的代码:

```python

# 导入scrapy模块

import scrapy

# 定义BooksSpider类

class BooksSpider(scrapy.Spider):

    # 设置name属性

    name = 'books_spider'

    # 设置start_urls属性

    start_urls = [

        'https://www.amazon.com/best-sellers-books-Amazon/zgbs/books'

    ]

    # 定义parse方法

    def parse(self, response):

        # 在此处编写解析规则

        pass

```

### 使用爬虫代理服务

当我们使用爬虫程序访问网站时,有可能会遇到一些问题,如网站的反爬虫机制、IP被屏蔽或限制、网速慢等。为了提高爬虫效果,我们可以使用代理IP来隐藏我们的真实IP地址,从而避免被网站识别或拒绝。代理IP是指一个中间服务器,它可以接收我们的请求,并将其转发给目标网站,然后将响应返回给我们。这样,目标网站就无法知道我们的真实IP地址,只能看到代理IP地址。

亿牛云是一个专业的爬虫代理服务提供商,它提供了海量的高质量的代理IP,支持多种协议和地区,还有专业的技术支持和客服。我们可以在亿牛云官网注册一个账号,并购买相应的套餐,然后就可以获取代理IP的域名、端口、用户名和密码。例如,我们可以获取以下信息:

- 域名:www.16yun.cn

- 端口:8080

- 用户名:16YUN

- 密码:16IP

为了使用亿牛云爬虫代理服务,我们需要在Scrapy项目中设置代理IP。我们可以在settings.py文件中添加以下代码:

```python

# 导入base64模块

import base64

# 设置代理IP的域名和端口

PROXY_SERVER = 'http://www.16yun.cn:8080'

# 设置代理IP的用户名和密码,并进行base64编码

proxy_user_pass = '16YUN:16IP'

encoded_user_pass = base64.b64encode(proxy_user_pass.encode())

# 设置代理中间件

DOWNLOADER_MIDDLEWARES = {

    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 400,

    'amazon_books.middlewares.ProxyMiddleware': 410,

}

```

其中,PROXY_SERVER是代理IP的域名和端口,proxy_user_pass是代理IP的用户名和密码,并进行base64编码,以便于传输。DOWNLOADER_MIDDLEWARES是下载器中间件的设置,它可以在请求和响应之间执行一些操作。我们需要启用HttpProxyMiddleware中间件,并自定义一个名为ProxyMiddleware的中间件,用于设置请求对象的代理属性。

我们可以在middlewares.py文件中添加以下代码:

```python

# 导入settings模块

from amazon_books import settings

# 定义ProxyMiddleware类

class ProxyMiddleware(object):

    # 定义process_request方法

    def process_request(self, request, spider):

        # 设置请求对象的proxy属性为代理IP的域名和端口

        request.meta['proxy'] = settings.PROXY_SERVER

        # 设置请求对象的Proxy-Authorization属性为代理IP的用户名和密码(base64编码)

        request.headers['Proxy-Authorization'] = 'Basic ' + settings.encoded_user_pass.decode()

```

这样,我们就完成了使用亿牛云爬虫代理服务的设置。

### 使用Scrapy的Item类和Pipeline类

当我们从网页上提取数据时,我们需要定义一个数据容器来存储数据。Scrapy提供了一个Item类,用于表示爬取到的数据。Item类是一个简单的容器对象,它有一些属性和值,类似于字典。我们可以在items.py文件中定义一个名为BookItem的Item类,并设置以下字段:

- title:书名

- author:作者

- price:价格

- rating:评分

以下是BookItem类的代码:

```python

# 导入scrapy模块

import scrapy

# 定义BookItem类

class BookItem(scrapy.Item):

    # 设置title字段

    title = scrapy.Field()

    # 设置author字段

    author = scrapy.Field()

    # 设置price字段

    price = scrapy.Field()

    # 设置rating字段

    rating = scrapy.Field()

```

当我们获取到一个BookItem对象时,我们需要将其保存到CSV文件中,以便于后续的数据分析和可视化。Scrapy提供了一个Pipeline类,用于处理爬取到的数据。Pipeline类是一个可插拔的组件,它可以对每个Item对象执行一些操作,如验证、清洗、存储等。我们可以在pipelines.py文件中定义一个名为BooksPipeline的Pipeline类,并设置以下方法:

- open_spider:在Spider开启时执行,用于打开CSV文件并写入表头。

- close_spider:在Spider关闭时执行,用于关闭CSV文件。

- process_item:对每个Item对象执行,用于将其写入CSV文件。

以下是BooksPipeline类的代码:

```python

# 导入csv模块

import csv

# 定义BooksPipeline类

class BooksPipeline(object):

    # 定义open_spider方法

    def open_spider(self, spider):

        # 打开一个名为books.csv的文件,并设置写入模式和编码格式

        self.file = open('books.csv', 'w', encoding='utf-8')

        # 创建一个csv.writer对象,并设置分隔符为逗号

        self.writer = csv.writer(self.file, delimiter=',')

        # 写入表头,即BookItem类的字段名

        self.writer.writerow(['title', 'author', 'price', 'rating'])


    # 定义close_spider方法

    def close_spider(self, spider):

        # 关闭文件

        self.file.close()


    # 定义process_item方法

    def process_item(self, item, spider):

        # 将item对象转换为列表,并写入文件

        self.writer.writerow(list(item.values()))

        # 返回item对象,以便于后续的处理

        return item

```

为了启用BooksPipeline类,我们需要在settings.py文件中添加以下代码:

```python

# 设置ITEM_PIPELINES选项,指定BooksPipeline类及其优先级(越小越高)

ITEM_PIPELINES = {

  'amazon_books.pipelines.BooksPipeline': 300,

}

```

这样,我们就完成了使用Scrapy的Item类和Pipeline类的设置。

### 使用Matplotlib库绘制数据可视化图表

当我们将爬取到的数据保存到CSV文件中后,我们就可以使用Matplotlib库来绘制数据可视化图表。Matplotlib是一个用于绘制二维图形的Python库,它支持多种格式和样式,还有丰富的接口和工具。我们可以使用pip命令来安装Matplotlib:

```python

# 在命令行中输入以下命令

pip install matplotlib

```

然后,我们可以创建一个名为books_plot.py的文件,并在其中导入Matplotlib库和其他相关库:

```python

# 导入matplotlib.pyplot模块,并简写为plt

import matplotlib.pyplot as plt

# 导入pandas模块,并简写为pd

import pandas as pd

# 导入numpy模块,并简写为np

import numpy as np

```

接下来,我们可以使用pandas模块的read_csv函数,读取books.csv文件中的数据,并将其转换为一个DataFrame对象。DataFrame对象是一个二维的表格型数据结构,它有行索引和列索引,可以方便地进行数据的查询、筛选、分组、聚合等操作。

```python

# 读取books.csv文件中的数据,并将其转换为一个DataFrame对象,命名为df

df = pd.read_csv('books.csv')

```

然后,我们可以使用Matplotlib库的各种函数,绘制不同类型的图表,如柱状图、饼图、散点图等。我们可以使用plt.figure函数,创建一个Figure对象,表示一个绘图窗口。我们可以使用plt.subplot函数,创建一个或多个Axes对象,表示一个或多个子图。我们可以使用plt.bar函数,绘制柱状图。我们可以使用plt.pie函数,绘制饼图。我们可以使用plt.scatter函数,绘制散点图。我们还可以使用plt.title函数,设置图表的标题。我们还可以使用plt.xlabel函数和plt.ylabel函数,设置坐标轴的标签。我们还可以使用plt.legend函数,设置图例。我们还可以使用plt.show函数,显示图表。

以下是一些示例代码:

```python

# 创建一个Figure对象,设置大小为10*10

plt.figure(figsize=(10, 10))

# 创建一个2*2的网格布局,并在第一个位置创建一个Axes对象

plt.subplot(2, 2, 1)

# 绘制柱状图,显示不同类别的图书的数量

# 使用df['title']列的值作为x轴的数据

# 使用df['title']列的值按照类别分组,并计算每组的数量作为y轴的数据

# 使用df['title']列的值按照类别分组,并获取每组的第一个值作为x轴的标签

# 设置柱子的宽度为0.8

# 设置柱子的颜色为蓝色

# 设置柱子的边缘颜色为黑色

plt.bar(x=df['title'], height=df.groupby('title')['title'].count(), tick_label=df.groupby('title')['title'].first(), width=0.8, color='blue', edgecolor='black')

# 设置标题为Books by Category

plt.title('Books by Category')

# 设置x轴标签为Category

plt.xlabel('Category')

# 设置y轴标签为Count

plt.ylabel('Count')

# 创建一个2*2的网格布局,并在第二个位置创建一个Axes对象

plt.subplot(2, 2, 2)

# 绘制饼图,显示不同评分区间的图书的占比

# 使用df['rating']列的值按照评分区间分组,并计算每组的数量作为饼图的数据

# 使用df['rating']列的值按照评分区间分组,并获取每组的第一个值作为饼图的标签

# 设置饼图的颜色列表为红、橙、黄、绿、青、蓝、紫

# 设置饼图中每个部分与中心的距离列表为0.1、0.1、0.1、0.1、0.1、0.1、0.1(表示突出显示)

# 设置饼图中每个部分对应的百分比格式为%.1f%%

# 设置饼图中每个部分对应的百分比与标签之间的距离为0.1

# 设置标题为Books by Rating

plt.pie(x=df.groupby(pd.cut(df['rating'], bins=[0, 1, 2, 3, 4, 5], right=False))['rating'].count(), labels=df.groupby(pd.cut(df['rating'], bins=[0, 1, 2, 3, 4, 5], right=False))['rating'].first(), colors=['red', 'orange', 'yellow', 'green', 'cyan', 'blue', 'purple'], explode=[0.1] * 7, autopct='%.1f%%', pctdistance=0.1)

plt.title('Books by Rating')

# 创建一个2*2的网格布局,并在第三个位置创建一个Axes对象

plt.subplot(2, 2, 3)

# 绘制散点图,显示不同类别的图书的价格和评分的关系

# 使用df['price']列的值作为x轴的数据

# 使用df['rating']列的值作为y轴的数据

# 使用df['title']列的值作为散点的颜色,根据类别分配不同的颜色

# 使用df['title']列的值作为散点的大小,根据数量分配不同的大小

# 设置标题为Books by Price and Rating

plt.scatter(x=df['price'], y=df['rating'], c=df['title'], s=df.groupby('title')['title'].count() * 10)

plt.title('Books by Price and Rating')

# 设置x轴标签为Price

plt.xlabel('Price')

# 设置y轴标签为Rating

plt.ylabel('Rating')

# 设置颜色条,并添加标签为Category

plt.colorbar(label='Category')

# 创建一个2*2的网格布局,并在第四个位置创建一个Axes对象

plt.subplot(2, 2, 4)

# 绘制柱状图,显示不同作者的图书的平均评分

# 使用df['author']列的值按照作者分组,并计算每组的评分均值作为y轴的数据

# 使用df['author']列的值按照作者分组,并获取每组的第一个值作为x轴的标签

# 设置柱子的宽度为0.8

# 设置柱子的颜色为绿色

# 设置柱子的边缘颜色为黑色

plt.bar(x=df.groupby('author')['author'].first(), height=df.groupby('author')['rating'].mean(), width=0.8, color='green', edgecolor='black')

# 设置标题为Books by Author and Rating

plt.title('Books by Author and Rating')

# 设置x轴标签为Author

plt.xlabel('Author')

# 设置y轴标签为Rating

plt.ylabel('Rating')

# 设置x轴刻度旋转45度,以便于显示长标签

plt.xticks(rotation=45)

# 调整子图之间的间距,避免重叠

plt.tight_layout()

# 显示图表

plt.show()

```

运行books_plot.py文件后,我们可以看到图表

## 结语

本文介绍了如何使用Python和Scrapy框架来编写爬虫程序,从亚马逊网站上获取畅销书的数据,并使用亿牛云爬虫代理服务来提高爬虫效果。本文还介绍了如何使用Matplotlib库来绘制亚马逊畅销书的数据可视化图表,展示图书的特征和趋势。通过本文,我们可以学习到爬虫技术的基本原理和方法,以及数据可视化的基本技巧和应用。我们还可以利用本文提供的代码,自己尝试爬取其他网站上的数据,并绘制不同类型的图表,探索数据背后的信息和价值。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容