豆瓣图书评分数据的可视化分析

news2024/12/26 11:07:18

亿牛云代理.jpg

导语

豆瓣是一个提供图书、电影、音乐等文化产品的社区平台,用户可以在上面发表自己的评价和评论,形成一个丰富的文化数据库。本文将介绍如何使用爬虫技术获取豆瓣图书的评分数据,并进行可视化分析,探索不同类型、不同年代、不同地区的图书的评分特征和规律。

概述

本文的主要步骤如下:

  • 使用scrapy框架编写爬虫程序,从豆瓣图书网站抓取图书的基本信息和评分数据,保存为csv格式的文件。
  • 使用亿牛云爬虫代理服务,提高爬虫效率和稳定性,避免被豆瓣网站屏蔽或封禁。
  • 使用pandas库对爬取的数据进行清洗和处理,提取出需要的字段和特征。
  • 使用matplotlib库对处理后的数据进行可视化分析,绘制各种类型的图表,展示不同维度的评分分布和关系。

正文

爬虫程序

首先,我们需要编写一个爬虫程序,从豆瓣图书网站抓取图书的基本信息和评分数据。我们使用scrapy框架来实现这个功能,scrapy是一个强大而灵活的爬虫框架,可以方便地定义爬虫规则和处理数据。我们需要定义一个Spider类,继承自scrapy.Spider类,并重写以下方法:

  • start_requests:该方法返回一个可迭代对象,包含了爬虫开始时要访问的请求对象。我们可以从豆瓣图书首页开始,获取所有分类的链接,并构造请求对象。
  • parse:该方法负责处理start_requests返回的请求对象的响应,并解析出需要的数据或者进一步的请求。我们可以使用scrapy自带的选择器或者BeautifulSoup等第三方库来解析HTML文档,提取出图书列表页的链接,并构造请求对象。
  • parse_book:该方法负责处理parse返回的请求对象的响应,并解析出图书详情页的数据。我们可以使用同样的方式来提取出图书的基本信息和评分数据,并将其保存为字典格式。
  • close:该方法在爬虫结束时被调用,我们可以在这里将抓取到的数据保存为csv格式的文件。

为了提高爬虫效率和稳定性,我们还需要使用亿牛云爬虫代理服务,该服务提供了大量高质量的代理IP地址,可以帮助我们避免被豆瓣网站屏蔽或封禁。我们只需要在settings.py文件中设置代理服务器的域名、端口、用户名和密码,以及启用中间件HttpProxyMiddleware即可。

首先配置爬虫代理,你可以按照以下步骤在Scrapy项目的settings.py文件中进行配置:
确保已经安装了Scrapy以及相关依赖。然后,打开你的Scrapy项目的settings.py文件,并添加以下配置:

# 启用HttpProxyMiddleware中间件
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 1,
}

# 设置亿牛云 爬虫代理服务器的配置
HTTPPROXY_AUTH_ENCODING = 'utf-8'  # 编码格式

# 亿牛云 爬虫代理服务器的域名、端口、用户名和密码
HTTPPROXY_HOST = 'www.16yun.cn'
HTTPPROXY_PORT = 12345
HTTPPROXY_USER = '16YUN'
HTTPPROXY_PASS = '16IP'

以下是爬虫程序的代码:

# -*- coding: utf-8 -*-
import scrapy
import csv

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['book.douban.com']
    start_urls = ['https://book.douban.com/']

    # 定义保存数据的列表
    data = []

    def start_requests(self):
        # 从豆瓣图书首页开始
        yield scrapy.Request(url=self.start_urls[0], callback=self.parse)

    def parse(self, response):
        # 解析首页,获取所有分类的链接
        categories = response.xpath('//div[@class="article"]/div[@class="indent"]/table//a')
        for category in categories:
            # 构造分类页面的请求对象
            url = category.xpath('./@href').get()
            yield scrapy.Request(url=url, callback=self.parse_book)

    def parse_book(self, response):
        # 解析分类页面,获取图书列表
        books = response.xpath('//li[@class="subject-item"]')
        for book in books:
            # 构造图书详情页的请求对象
            url = book.xpath('./div[@class="info"]/h2/a/@href').get()
            yield scrapy.Request(url=url, callback=self.parse_detail)

        # 获取下一页的链接,如果存在则继续爬取
        next_page = response.xpath('//span[@class="next"]/a/@href')
        if next_page:
            url = next_page.get()
            yield scrapy.Request(url=url, callback=self.parse_book)

    def parse_detail(self, response):
        # 解析图书详情页,获取图书的基本信息和评分数据
        item = {}
        item['title'] = response.xpath('//h1/span/text()').get() # 标题
        item['author'] = response.xpath('//span[contains(text(),"作者")]/following-sibling::a/text()').get() # 作者
        item['publisher'] = response.xpath('//span[contains(text(),"出版社")]/following-sibling::text()').get() # 出版社
        item['pub_date'] = response.xpath('//span[contains(text(),"出版年")]/following-sibling::text()').get() # 出版年
        item['price'] = response.xpath('//span[contains(text(),"定价")]/following-sibling::text()').get() # 定价
        item['rating'] = response.xpath('//strong/text()').get() # 评分
        item['rating_num'] = response.xpath('//a[contains(@href,"rating")]/span/text()').get() # 评分人数
        item['tags'] = response.xpath('//div[@id="db-tags-section"]/div[@class="indent"]/span/a/text()').getall() # 标签

        # 将数据添加到列表中
        self.data.append(item)

    def close(self, spider, reason):
        # 爬虫结束时,将数据保存为csv格式的文件
        with open('douban_books.csv', 'w', encoding='utf-8', newline='') as f:
            writer = csv.DictWriter(f, fieldnames=self.data[0].keys())
            writer.writeheader()
            writer.writerows(self.data)

数据清洗和处理

接下来,我们需要对爬取的数据进行清洗和处理,提取出需要的字段和特征。我们使用pandas库来实现这个功能,pandas是一个强大而灵活的数据分析和处理库,可以方便地读取、操作和转换数据。我们需要做以下几个步骤:

  • 读取csv文件,将数据转换为DataFrame对象。
  • 去除空值和重复值,保证数据的完整性和唯一性。
  • 对部分字段进行类型转换,如将评分和评分人数转换为数值类型,将出版年转换为日期类型。
  • 对部分字段进行拆分或合并,如将作者拆分为中文作者和外文作者,将标签合并为一个字符串。
  • 对部分字段进行分组或分类,如根据评分区间划分为高分、中等、低分三类,根据出版年划分为不同的年代。

以下是数据清洗和处理的代码:

# -*- coding: utf-8 -*-
import pandas as pd

# 读取csv文件,将数据转换为DataFrame对象
df = pd.read_csv('douban_books.csv')

# 去除空值和重复值,保证数据的完整性和唯一性
df.dropna(inplace=True)
df.drop_duplicates(inplace=True)

# 对部分字段进行类型转换,如将评分和评分人数转换为数值类型,将出版年转换为日期类型
df['rating'] = pd.to_numeric(df['rating'])
df['rating_num'] = pd.to_numeric(df['rating_num'])
df['pub_date'] = pd.to_datetime(df['pub_date'])

# 对部分字段进行拆分或合并,如将作者拆分为中文作者和外文作者,将标签合并为一个字符串 
df[‘tags’] = df[‘tags’].apply(lambda x:,.join(x))

# 对部分字段进行分组或分类,如根据评分区间划分为高分、中等、低分三类,根据出版年划分为不同的年代
df[‘rating_level’] = pd.cut(df[‘rating’], bins=[0, 7, 8.5, 10], labels=[‘低分’, ‘中等’, ‘高分’]) 
df[‘pub_year’] = df[‘pub_date’].dt.year 
df[‘pub_decade’] = (df[‘pub_year’] // 10) * 10
#数据清洗和处理完成,保存为新的csv文件
df.to_csv(‘douban_books_cleaned.csv’, index=False)

数据可视化分析

最后,我们需要对处理后的数据进行可视化分析,绘制各种类型的图表,展示不同维度的评分分布和关系。我们使用matplotlib库来实现这个功能,matplotlib是一个强大而灵活的数据可视化库,可以方便地创建各种风格和格式的图表。我们需要做以下几个步骤:

  • 导入matplotlib库,并设置中文显示和风格。
  • 读取清洗后的csv文件,将数据转换为DataFrame对象。
  • 使用matplotlib的子模块pyplot来绘制各种图表,如直方图、饼图、箱线图、散点图等。
  • 使用matplotlib的子模块axes来调整图表的标题、标签、刻度、图例等属性。
  • 使用matplotlib的子模块figure来保存图表为图片文件。

以下是数据可视化分析的代码:

# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import pandas as pd

# 导入matplotlib库,并设置中文显示和风格
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False # 设置负号显示
plt.style.use('ggplot') # 设置风格

# 读取清洗后的csv文件,将数据转换为DataFrame对象
df = pd.read_csv('douban_books_cleaned.csv')

# 绘制直方图,显示不同评分区间的图书数量
plt.figure(figsize=(8, 6)) # 设置画布大小
plt.hist(df['rating'], bins=20, color='steelblue', edgecolor='k') # 绘制直方图
plt.xlabel('评分') # 设置x轴标签
plt.ylabel('数量') # 设置y轴标签
plt.title('豆瓣图书评分直方图') # 设置标题
plt.savefig('rating_hist.png') # 保存图片

# 绘制饼图,显示不同评分等级的图书占比
plt.figure(figsize=(8, 6)) # 设置画布大小
rating_level_counts = df['rating_level'].value_counts() # 计算不同评分等级的图书数量
plt.pie(rating_level_counts, labels=rating_level_counts.index, autopct='%.2f%%', colors=['limegreen', 'gold', 'tomato']) # 绘制饼图
plt.title('豆瓣图书评分等级饼图') # 设置标题
plt.savefig('rating_level_pie.png') # 保存图片

# 绘制箱线图,显示不同年代的图书评分分布
plt.figure(figsize=(8, 6)) # 设置画布大小
decades = df['pub_decade'].unique() # 获取不同年代的列表
decades.sort() # 对年代进行排序
ratings_by_decade = [df[df['pub_decade'] == decade]['rating'] for decade in decades] # 获取每个年代对应的评分列表
plt.boxplot(ratings_by_decade, labels=decades) # 绘制箱线图
plt.xlabel('年代') # 设置x轴标签
plt.ylabel('评分') # 设置y轴标签
plt.title('豆瓣图书不同年代评分箱线图') # 设置标题
plt.savefig('rating_by_decade_box.png') # 保存图片

# 绘制散点图,显示评分和评分人数的关系
plt.figure(figsize=(8, 6)) # 设置画布大小
plt.scatter(df['rating'], df['rating_num'], color='steelblue', alpha=0.5) # 绘制散点图
plt.xlabel('评分') # 设置x轴标签
plt.ylabel('评分人数') # 设置y轴标签
plt.title('豆瓣图书评分和评分人数散点图') # 设置标题
plt.savefig('rating_num_scatter.png') # 保存图片

结语

本文介绍了如何使用爬虫技术获取豆瓣图书的评分数据,并进行可视化分析,探索不同类型、不同年代、不同地区的图书的评分特征和规律。通过本文,我们可以学习到以下几点:

  • 如何使用scrapy框架编写爬虫程序,从豆瓣图书网站抓取图书的基本信息和评分数据,保存为csv格式的文件。
  • 如何使用亿牛云爬虫代理服务,提高爬虫效率和稳定性,避免被豆瓣网站屏蔽或封禁。
  • 如何使用pandas库对爬取的数据进行清洗和处理,提取出需要的字段和特征。
  • 如何使用matplotlib库对处理后的数据进行可视化分析,绘制各种类型的图表,展示不同维度的评分分布和关系。

希望本文能够对你有所帮助,如果你对爬虫技术或者数据可视化有兴趣,可以继续深入学习和探索。谢谢你的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1004500.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何做好医药产品说明书翻译?

近年来,随着世界各国之间的交流日渐紧密,医药产业发达国家的药品和医用器械对于其他国家的输出日益增多,但这些医疗产品在流通过程中,往往需要专业的医药翻译人员进行产品说明书的精确翻译。那么,如何做好医药产品说明…

掌动智能:提升硬件连通性测试效率与精确度

在当今数字化时代,各种智能设备和硬件组件在我们的日常生活和工作中扮演着越来越重要的角色。为确保这些设备正常运行,并实现跨设备的无缝连接,硬件连通性测试变得至关重要。为了提高测试效率与精确度,让我们介绍掌动智能作为一家…

物理层(408)

一、通信基础 【2009】在无噪声的情况下,若某通信链路的带宽为3kHz,采用4个相位,每个相位具有4种振幅的QAM调制技术,则该通信链路的最大数据传输速率是(B) A、12kb/s B、24kb/s C、48kb/s …

A股风格因子看板 (2023.09 第01期)

该因子看板跟踪A股风格因子,该因子主要解释沪深两市的市场收益、刻画市场风格趋势的系列风格因子,用以分析市场风格切换、组合风格暴 露等。 今日为该因子跟踪第1期,指数组合数据截止日2023-08-31,要点如下 近1年A股风格因子收益走…

《DevOps实践指南》- 读书笔记(五)

DevOps实践指南 Part 4 第二步 :反馈的技术实践14. 建立能发现并解决问题的遥测系统14.1 建设集中式监控架构14.2 建立生产环境的应用程序日志遥测14.3 使用遥测指导问题的解决14.4 将建立生产遥测融入日常工作14.5 建立自助访问的遥测和信息辐射器14.6 发现和填补遥…

元宇宙全球市场规模到2030年将达9805亿美元!

元宇宙是一种新兴的概念,它指的是一个虚拟的世界,由人工智能、虚拟现实、区块链等技术构建而成。元宇宙的起源可以追溯到上世纪90年代的虚拟世界“第二人生”,但直到近年来,随着技术的不断发展,它才逐渐成为了人们关注…

labelme2voc 标签重叠/覆盖问题

使用labelme自带的 labelme2voc.py转换voc数据集时可能标签重叠

C语言实现单链表和双向循环链表

全文目录 链表单链表实现申请节点头插尾插头删尾删任意节点后插入删除单链表的销毁 带头双向循环链表实现链表初始化申请节点头插尾插头删尾删任意节点后插入删除链表的销毁 链表和顺序表对比总结 链表 概念:链表是一种物理存储结构上非连续、非顺序的存储结构&…

GO语言篇之发布开源软件包

GO语言篇之发布开源软件包 文章目录 GO语言篇之发布开源软件包新建仓库拉取到本地初始化项目编写代码提交代码发布引用软件包 我们写GO语言程序的时候难免会引用第三方的软件包,那么你知道别人是怎么发布自己的软件包吗,别急,这篇博客教你怎么…

Apache DolphinScheduler 如何实现自动化打包+单机/集群部署?

Apache DolphinScheduler 是一款开源的分布式任务调度系统,旨在帮助用户实现复杂任务的自动化调度和管理。DolphinScheduler 支持多种任务类型,可以在单机或集群环境下运行。下面将介绍如何实现 DolphinScheduler 的自动化打包和单机/集群部署。 自动化…

【Oracle】数据库导入导出

Oracle数据库导入导出 文章目录 Oracle数据库导入导出一、expdp导出1、管理员身份登录2、删除以前测试的用户及对应的数据3、创建表空间(源表--待导出的表)4、创建用户,给用户设置默认表空间和临时表空间5、给用户授权(创建表和视…

Unity+百度文心大模型驱动AI小姐姐数字人

1.简述 最近看到新闻,说是百度、字节、商汤、百川、智普等几家企业及机构所发布的生成式大语言模型,通过了《生成式人工智能服务管理暂行办法》,成为首批获得官方备案的大语言模型服务提供商。虽然一直在使用包括文心一言、chatglm这些大语言…

怒赞了,阿里P8面试官推荐的Java高并发核心编程文档

前言 学完阿里P8面试官推荐的Java高并发核心编程文档后,终于拿到了蚂蚁p6的offer,这份文档包含的内容有点多。 Java高并发核心编程文档《尼恩Java高并发三部曲》获读者怒赞!获取方式见文末 文章目录 前言尼恩Java高并发三部曲卷1&#xff1…

适合引流的运动步数打卡抽奖小程序源码开发

要健康也要瘦?那么有一个可以让你悄悄改变还可以获取奖品的小程序简直不要太入心。用运动步数兑换奖品,每天运动一下,换点小礼品,简直不要太惬意。 运动步数兑换小程序核心亮点: 小程序与微信运动做了关联&#xff…

Android环境配置笔记

文章目录 一、各环境文档二、参考 一、各环境文档 Gradle官方的兼容性文档:Java Compatibility 更新日期:2023.9.12 Android Gradle插件版本:Android Gradle Plugin 二、参考 参考文章:Android问题记录

SS928搭建NNN环境

环境要求:ubuntu18.04 参考文件: 《ATC工具使用指南》《应用开发指南》《驱动和开发环境安装指南》 《昇腾模型压缩工具使用指南(ONNX)》 交叉编译器的安装-----------------------------------------------------------------…

C语言“牵手”淘宝商品评论数据方法,淘宝商品评论接口,淘宝商品评价接口,淘宝API接口申请指南

淘宝商品评论API是淘宝开放平台为开发者提供的一套应用程序编程接口,通过该接口,开发者可以获取到店铺所有商品的评价数据。 淘宝商品评论API包含以下接口: taobao.item.reviews.get:用于获取指定商品的评价数据,输入…

凯迪正大— 氧化锌避雷器检测仪

一、概述 RBZ-3B氧化锌避雷器直流参数测试仪是专门用于检测10kV及6KV电力系统用无间隙氧化锌避雷器MOA阀电间接触不良的内部缺陷,根据《电力设备预防性试验规程》DL/T596-1996中14.2的规定,发电厂、变电所在每年雷雨季前和必要时应该对金属氧化物避雷器…

基于ssm的商场管理信息系统的设计与实现

基于ssm的商场管理信息系统的设计与实现 前言 这个项目适合初学者熟悉框架的项目系统,前端框架采用layui全新回归版本2.8,界面更加丝滑。需要的记得扣我发源码哦! 项目脑图 项目技术 前端技术:layui框架,JavaScrip…

USB适配器应用芯片 国产GP232RL软硬件兼容替代FT232RL DPU02直接替代CP2102

USB适配器,是英文Universal Serial Bus(通用串行总线)的缩写,而其中文简称为“通串线”,是一个外部总线标准,用于规范电脑与外部设备的连接和通讯。是应用在PC领域的接口技术, 移动PC由于没有电池,电源适配…