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


    显示器4.jpg

    导语

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

    概述

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

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

    正文

    创建Scrapy项目和Spider类

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

    # 在命令行中输入以下命令
    pip install scrapy
    
    • 1
    • 2

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

    # 在命令行中输入以下命令
    scrapy startproject amazon_books
    
    • 1
    • 2

    这样就会在当前目录下生成一个名为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类的代码:

    # 导入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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    使用爬虫代理服务

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

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

    • 域名:www.16yun.cn
    • 端口:8080
    • 用户名:16YUN
    • 密码:16IP

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

    # 导入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,
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

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

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

    # 导入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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

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

    使用Scrapy的Item类和Pipeline类

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

    • title:书名
    • author:作者
    • price:价格
    • rating:评分

    以下是BookItem类的代码:

    # 导入scrapy模块
    import scrapy
    
    # 定义BookItem类
    class BookItem(scrapy.Item):
        # 设置title字段
        title = scrapy.Field()
        # 设置author字段
        author = scrapy.Field()
        # 设置price字段
        price = scrapy.Field()
        # 设置rating字段
        rating = scrapy.Field()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

    • open_spider:在Spider开启时执行,用于打开CSV文件并写入表头。
    • close_spider:在Spider关闭时执行,用于关闭CSV文件。
    • process_item:对每个Item对象执行,用于将其写入CSV文件。

    以下是BooksPipeline类的代码:

    # 导入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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

    # 设置ITEM_PIPELINES选项,指定BooksPipeline类及其优先级(越小越高)
    ITEM_PIPELINES = {
       'amazon_books.pipelines.BooksPipeline': 300,
    }
    
    • 1
    • 2
    • 3
    • 4

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

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

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

    # 在命令行中输入以下命令
    pip install matplotlib
    
    • 1
    • 2

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

    # 导入matplotlib.pyplot模块,并简写为plt
    import matplotlib.pyplot as plt
    # 导入pandas模块,并简写为pd
    import pandas as pd
    # 导入numpy模块,并简写为np
    import numpy as np
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    # 读取books.csv文件中的数据,并将其转换为一个DataFrame对象,命名为df
    df = pd.read_csv('books.csv')
    
    • 1
    • 2

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

    以下是一些示例代码:

    # 创建一个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()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72

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

    结语

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

  • 相关阅读:
    前端-(3)
    神经网络画图?PPT就够了
    8 个常用的 Wireshark 使用技巧,一看就会
    网关限流功能性能优化
    [emditor] 去掉其中的空行
    解决括号相关匹配问题
    网络安全新架构:零信任安全
    如何将模拟器端小程序包源码下载到本机电脑
    PostgreSQL 逻辑复制搭建
    Spire.Office 8.9.3 for .NET cRACK
  • 原文地址:https://blog.csdn.net/ip16yun/article/details/132806958