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

2023-09-11 14:59:53 浏览数 (3)

亿牛云代理亿牛云代理

导语

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

概述

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

  • 创建一个Scrapy项目,定义一个Spider类,设置起始URL和解析规则。
  • 使用亿牛云爬虫代理服务,设置代理IP,避免被网站屏蔽或限制。
  • 使用Scrapy的Item类,定义需要获取的数据字段,如书名、作者、价格、评分等。
  • 使用Scrapy的Pipeline类,将获取的数据保存到CSV文件中。
  • 使用Matplotlib库,读取CSV文件中的数据,绘制柱状图、饼图、散点图等,展示不同类别的图书的销量和评价。

正文

创建Scrapy项目和Spider类

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

代码语言:python代码运行次数:0复制
# 在命令行中输入以下命令
pip install scrapy

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

代码语言:python代码运行次数:0复制
# 在命令行中输入以下命令
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为例。
  • parse:解析方法,用于处理响应对象,并提取所需的数据或生成新的请求对象。

以下是BooksSpider类的代码:

代码语言:python代码运行次数:0复制
# 导入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代码运行次数:0复制
# 导入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代码运行次数:0复制
# 导入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代码运行次数:0复制
# 导入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代码运行次数:0复制
# 导入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代码运行次数:0复制
# 设置ITEM_PIPELINES选项,指定BooksPipeline类及其优先级(越小越高)
ITEM_PIPELINES = {
   'amazon_books.pipelines.BooksPipeline': 300,
}

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

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

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

代码语言:python代码运行次数:0复制
# 在命令行中输入以下命令
pip install matplotlib

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

代码语言:python代码运行次数:0复制
# 导入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代码运行次数:0复制
# 读取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代码运行次数:0复制
# 创建一个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库来绘制亚马逊畅销书的数据可视化图表,展示图书的特征和趋势。通过本文,我们可以学习到爬虫技术的基本原理和方法,以及数据可视化的基本技巧和应用。我们还可以利用本文提供的代码,自己尝试爬取其他网站上的数据,并绘制不同类型的图表,探索数据背后的信息和价值。

1 人点赞