抓取了《大秦赋》所有数据,我发现了这些秘密

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

本文由黄勇老师特约供稿

学习人数超13万人的<Python入门到实战一卡通>作者

网易、360、华为特约Python讲师

前言

最近大火的电视剧《大秦赋》,给朋友圈的小伙伴都拉回到那个风云激荡的春秋战国时期,大家都在热情的讨论着大秦一统,秦始皇嬴政、商人吕不韦的那些尔虞我诈、恩怨情仇。那到底小伙伴们都在讨论什么,对历史人物有什么看法,对《大秦赋》这部电视剧剧情和角色有什么点评?于是我用Python爬取了《大秦赋》下所有的评论数据,进行了一波分析。

1、 数据抓取

巧妇难为无米之炊,我们首先要做的第一步是想办法抓取到评论数据。这里我们抓取的是豆瓣网上关于《大秦赋》的所有评论数据,选择豆瓣网原因很简单,首先是数据比较齐全,其次反爬难度并不大。

 

其次来说下技术栈,用的是Scrapy+JSON的方式实现的。Scrapy框架有脚手架功能,帮我们实现了一个爬虫大部分的功能,我们只要专心于数据解析和存储即可,也是我做爬虫的首选框架。

 

第一步是通过`Scrapy`命令创建一个项目和爬虫:

scrapy startproject daqinfu
scrapy genspider daqinfu "douban.com"

在开始编写爬虫之前,先来看下请求的url,这里我们找到《大秦赋》的评论链接是:

https://movie.douban.com/subject/26413293/comments?start=60&limit=20&status=P&sort=time

,其中start是获取评论的起始位置,limit代表获取多少条评论数据。

在获取完一页数据后,只要再获取下一页的url,然后重复发送请求即可。

了解以上两点后,就可以开始写代码了。当然前提是要对数据的提取比较熟悉,数据提取常用的有BeautifulSoup/Xpath/正则等方式,这里我们用性能和可阅读性都比较好的提取规则——xpath来进行解析。爬虫部分代码如下:

# -*- coding: utf-8 -*-
import re
from ..items import QinItem
class QinSpider(scrapy.Spider):name = 'qin'allowed_domains = ['douban.com']start_urls = ['https://movie.douban.com/subject/26413293/comments?start=0&limit=20']domain = "https://movie.douban.com/subject/26413293/comments"def parse(self, response):comment_items = response.xpath("//div[@id='comments']/div[contains(@class,'comment-item')]")for comment_item in comment_items:pub_time = comment_item.xpath(".//span[contains(@class,'comment-time')]/@title").extract_first()rating_classes = comment_item.xpath(".//span[contains(@class,'rating')]/@class").extract_first()rating = re.search(r'allstar(\d)0 rating',rating_classes).group(1)content = comment_item.xpath(".//p[contains(@class,'comment-content')]/span/text()").extract_first()item = QinItem(pub_time=pub_time,rating=rating,content=content)yield itemquery = response.xpath("//div[@id='paginator']/a[@class='next']/@href").extract_first()if query:yield scrapy.Request(url=self.domain+query,callback=self.parse)print("="*40)print(response.url,query)print("=" * 40)

关于提取规则,这里不再赘述,感兴趣的小伙伴,后台回复:"

大秦赋",可以获取完整代码。

 

爬取规则写好后,会构建一个item对象,这个item对象在yield过去后会发送给pipeline,然后我们在pipeline中把他保存到起来即可。相关代码如下:

import jsondef __init__(self):self.fp = open("comments.json", 'w', encoding='utf-8')def process_item(self, item, spider):self.fp.write(json.dumps(dict(item))+"\n")return itemdef close_spider(self,spider):self.fp.close()

这样,我们通过在命令行输入:scrapy crawl qin,即可运行我们的代码了。

另外,如果大家没掌握Python基础,可以扫描下方二维码学习我与CSDN共同打造的《Python入门到实战星选一卡通》198元即可系统学习Python入门、爬虫、数据采集、数据分析、数据挖掘、人工智能、Python面试。

 2、数据分析:

抓取了评论数据后,我们开始来进行一些分析。

 

首先说一下技术栈,这里我们用的是Anaconda中的Jupyter Notebook来做,然后用到了Pandas+Seaborn做数据处理和可视化。

 

首先将之前保存的JSON格式数据,处理成DataFrame对象。相关代码如下:

items = []
with open("comments.json","r") as fp:for line in fp:comment = json.loads(line)items.append(comment)
item_list = [[item['pub_time'],item['rating'],item['content']] for item in items]
comment_df = pd.DataFrame(item_list,columns=['pub_time','rating','content'])
comment_df['pub_time'] = pd.to_datetime(comment_df['pub_time'])
comment_df.head()

数据处理好以后,就可以进行分析了。这里我们从几个维度来分析,第一个是评论时间,第二个是评分,第三个是评论内容(您也可以自己再多从几个维度来分析)。

2.1. 时间分析:

时间我们分成两点来做,分别是发布日期、发布时间。分析发布日期我们能知道评论的走势,分析发布时间我们可以知道《大秦赋》在什么时间点播放量是最高的。

 

先来看看发布时间,《大秦赋》是在12月1日首播,到目前为止已经半个月了。我们来看看这半个月时间的播放情况。以下是分析代码:

# 分析评论日期
from matplotlib import dates
plt.figure(figsize=(10,5))
# 2. 添加一个新的pub_date
comment_df['pub_date'] = comment_df['pub_time'].dt.date
# # 3. 根据日期分组绘图
comment_date_df = comment_df.groupby(['pub_date']).count()
ax = sns.lineplot(x=comment_date_df.index,y=comment_date_df.content,marker='o')
# 设置显示所有时间
ax.set(xticks=comment_date_df.index)
# 设置x轴旋转
_ = ax.set_xticklabels(comment_date_df.index,rotation=45)
# 设置x轴格式
ax.xaxis.set_major_formatter(dates.DateFormatter("%m-%d"))
ax.set_xlabel("发布日期")
ax.set_ylabel("评论数量")

可以看到评论数量在12月4日之前都是一直处于上升趋势,在12月4日达到顶峰。前面4天属于观众期待期,所以评论量会越来越多,但是在12月4日后出现断崖式下降,说明本剧可能不是很受大家喜爱。

 

再来看下评论的时间,看看大家一般在几点刷剧。这里小编从0点到24点,2个小时为一个时间段统计评论数量。相关代码如下:

# 分析评论时间
time_range = [0,2,4,6,8,10,12,14,16,18,20,22,24]
comment_time_df = comment_df['pub_time'].dt.hour
time_range_counts = pd.cut(comment_time_df,bins=time_range,include_lowest=True,right=False).value_counts()
ax = time_range_counts.plot(kind="bar")
_ = ax.set_xticklabels(labels=time_range_counts.index,rotation=45)
ax.set_xlabel("发布时间")
ax.set_ylabel("发布数量")

可以看到在晚上8点到10点是评论量最多的,也正是电视剧播出时间段。紧接着是22-24,以及0-2点,有一部分晚上很晚才下班的小伙伴,可能会在这段时间追剧。然后又是上午10-12,以及14,16点,这段时间课时工作的最佳时间呀,怎么会用来追剧呢。说明有相当一部分小伙伴,平时工作在摸鱼呀,哈哈。

2.2. 评分分析:

想要知道一部剧好不好,最直接的就是看观众给的评分,通过以下代码分析:


# 评论数据

其中1,2分的最多。说明《大秦赋》真的没有被观众所认可呀。 

另外,如果大家没掌握Python基础,可以扫描下方二维码学习我与CSDN共同打造的《Python入门到实战星选一卡通》198元即可系统学习Python入门、爬虫、数据采集、数据分析、数据挖掘、人工智能、Python面试。

2.3. 分析人物评分

剧中演员的演技,以及故事情节,会对剧的评分产生较大影响,那么《大秦赋》中各个角色的演技,以及这个角色所产生的故事情节如何,我们接下来做一个简单分析。

 

这里我们的算法比较简单(不是很严谨,但是也能说明问题)。举个例子,观众给了1星,然后这个评论内容中出现了几次”秦始皇“,说明观众对”秦始皇“这个角色是比较反感的。这里我们对内容进行分词,然后提取”秦始皇“,”吕不韦“,”赵姬“,”嫪毐“,”李斯“等人进行分析。代码如下:

# 电视剧人物的评分
import jieba
roles = {'嬴政':0,'秦始皇':0,'张鲁一':0,'吕不韦':0,'段奕宏':0,'李斯':0,'嫪毐':0,"赵姬":0,"朱珠":0}
role_names = list(roles.keys())
for name in role_names:jieba.add_word(name)
for row in comment_df.index:rating = comment_df.loc[row,'rating']if rating:content = comment_df.loc[row,"content"]words = list(jieba.cut(content, cut_all=False))names = set(role_names).interp(set(words))for name in names:roles[name] += int(rating)
roles['嬴政'] += roles['嬴政'] + roles['秦始皇'] + roles['张鲁一']
roles['吕不韦'] += roles['吕不韦'] + roles['段奕宏']
roles['李斯'] += roles['李斯']
roles['赵姬'] += roles['赵姬'] + roles['朱珠']
roles.pop("秦始皇")
roles.pop("张鲁一")
roles.pop("段奕宏")
roles.pop("朱珠")
role_df = pd.DataFrame(list(roles.values()),index=list(roles.keys()),columns=['得分'])
role_df.sort_values('得分',inplace=True,ascending=False)
role_df.plot(kind='bar')

嬴政是最受观众关注和喜爱的,也符合一统天下得思想。虽然出镜很多的嫪毐,但是评分却很低。

 

只要你爬虫玩得溜,抓到更多的数据,还有更多有趣好玩的细节等着你来探索!

另外,如果大家想学习Python爬虫,或者从零开始系统学习Python编程,可扫描下方二维码,加入我与6位Python讲师在CSDN共同打造的《Python入门到实战星选一卡通》原价1253元的课程,今日特惠仅需198元!

绝对物超所值!

198元即可享受623节,涵盖:Python入门、爬虫、数据采集、数据分析、数据挖掘、人工智能、Python面试。

学习路线图

上下滑动查看更多↑↑↑

⚠️⚠️⚠️ 友情提醒

线下5位数,线上1000多的课程

今日特惠,仅需198元

(购课免费领价值2000元助学礼包)


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

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

相关文章

精讲23种设计模式-基于观察者模式~设计异步多渠道群发框架

文章目录一、观察者模式1. 观察者模式基本概念2. 观察者模式的应用场景3. 观察者模式的类图二、设计异步多渠道群发框架2.1. 定义消息观察者抽象接口2.2. 创建观察者2.3. 主题通知所有观察者2.4. 观察者注册2.5. 自定义线程池2.6. 签单通知入口2.6. 异步通知接口测试2.7. 依赖三…

君子动手不动口,阿里云喊你做云上体验官啦!

想要免费搭建云上博客&#xff1f;想要玩转全云端开发&#xff1f;想要挑战AI经典命题&#xff1f;想要7天进阶成为云计算专家&#xff1f;想要初始化你的云原生工程&#xff1f;快来阿里云 Hands-on Labs&#xff01; Hands-on Labs 是阿里云全新推出的云上动手实验室&#x…

我是Redis,MySQL大哥被我害惨了!

来源 | 编程技术宇宙责编 | 晋兆雨头图 | 付费下载于视觉中国我是Redis你好&#xff0c;我是Redis&#xff0c;一个叫Antirez的男人把我带到了这个世界上。说起我的诞生&#xff0c;跟关系数据库MySQL还挺有渊源的。在我还没来到这个世界上的时候&#xff0c;MySQL过的很辛苦&a…

联手友盟+打造云上数据增长“样板间”, 好兔视频成功逆势突围

前言&#xff1a;更多关于数智化转型、数据中台内容可扫码加群一起探讨 阿里云数据中台官网 https://dp.alibaba.com/index &#xff08;作者&#xff1a;友盟&#xff09; “消费升级”是近年来的中国消费市场热门词汇&#xff0c;消费升级的同时也驱动了内容消费升级。在这样…

SpringBoot 使用 Caffeine 本地缓存

文章目录一、本地缓存介绍二、缓存组件 Caffeine 介绍2.1. Caffeine 性能2.2. Caffeine 配置说明2.3. 软引用与弱引用三、SpringBoot 集成 Caffeine 方式一3.1. Maven 引入相关依赖3.2. 配置缓存配置类3.3. 定义实体对象3.4. 定义服务接口类3.5. 定义服务接口实现类3.6. Caffei…

《Istio 从懵圈到熟练:二分之一活的微服务》

作者 | 声东 阿里云售后技术专家 <关注阿里巴巴云原生公众号&#xff0c;回复 排查 即可下载电子书> 《深入浅出 Kubernetes》一书共汇集 12 篇技术文章&#xff0c;帮助你一次搞懂 6 个核心原理&#xff0c;吃透基础理论&#xff0c;一次学会 6 个典型问题的华丽操作…

为了追求更快,CPU、内存、I/O都做了哪些努力?

来源 | 编程技术宇宙责编 | 晋兆雨头图 | 付费下载于视觉中国背景曾经&#xff0c;我面试的时候有两个最怕的。一怕问算法&#xff0c;二怕问高并发。算法这个&#xff0c;自从刷了不少LeetCode&#xff0c;发现还是有套路可循的&#xff0c;虽不敢说算法能力有多强&#xff0c…

神结合!一招玩转K8s和微服务治理

发布会传送门 进入直播间还有好礼等你拿&#xff01; EDAS产品免费试用&#xff1a;https://www.aliyun.com/activity/middleware/edaspromotiononmay 首届云原生编程挑战赛正式开战&#xff01;立即报名瓜分330000现金奖&#xff1a;https://tianchi.aliyun.com/specials/p…

精讲23种设计模式-基于装饰模式~设计多级缓存框架

文章目录一、装饰模式1. 回顾多级缓存基本概念2. 装饰模式基本的概念3. 装饰模式应用场景4. 装饰者模式定义5. 基于Map手写Jvm内置缓存二、手写一级与二级缓存2.1. redis工具类2.2. 实体类2.3. 接口2.4. 数据库脚本2.5. 测试案例2.6. 测试效果分享三、设计多级缓存框架3.1. 缓存…

阿里云EDAS 3.0重磅发布,无侵入构建云原生应用

发布会传送门 进入直播间还有好礼等你拿&#xff01; EDAS产品免费试用&#xff1a;https://www.aliyun.com/activity/middleware/edaspromotiononmay 首届云原生编程挑战赛正式开战&#xff01;立即报名瓜分330000现金奖&#xff1a;https://tianchi.aliyun.com/specials/p…

二维数组的偏移量

数组的偏移量&#xff1a; 数组空间起始位置的偏移值。 公式&#xff1a; 例题&#xff1a; 结合图片分析例题和公式&#xff1a;

Akamai “三驾马车”,如何应对疫情后新场景形态下的新考验?

2020年10月14日&#xff0c;CDN行业领头羊、负责提供安全数字化体验的智能边缘平台Akamai&#xff08;阿卡迈技术&#xff09;发布了其边缘计算、媒体交付和安全方面的产品组合的多项更新。其中在Akamai智能边缘&#xff08;Akamai Intelligent Edge&#xff09;、媒体交付、应…

如何使用MaxCompute Spark读写阿里云Hbase

背景 Spark on MaxCompute可以访问位于阿里云VPC内的实例&#xff08;例如ECS、HBase、RDS&#xff09;,默认MaxCompute底层网络和外网是隔离的&#xff0c;Spark on MaxCompute提供了一种方案通过配置spark.hadoop.odps.cupid.vpc.domain.list来访问阿里云的vpc网络环境的Hba…

elementui更改el-table表头背景颜色和字体颜色

博主在使用elementui中的el-table时感觉默认表格样式实在过于简洁&#xff0c;尤其表头与表格内容之间区别较小&#xff0c;不利于辨认&#xff0c;降低了用户体验。如图所示&#xff1a; 于是&#xff0c;博主尝试更改一下表头的背景颜色和字体颜色&#xff0c;方法如下&…

idea 提升幸福感 常用设置(重装机配置)

1.常用快捷键 alt 7 展示类的方法 CtrlH 查看当前所选类的继承关系 CtrlShift上下键 上下移动整行 2.自动导包&#xff1a; 3.自动创建 serialVersionUID IDEA 自动给实现了 Serializable 接口的类创建 serialVersionUID 4.类与方法注释快捷键设置 方法注释模板设置 类与方…

ClickHouse内核分析-MergeTree的Merge和Mutation机制

注&#xff1a;以下分析基于开源 v19.15.2.2-stable 版本进行 引言 ClickHouse内核分析系列文章&#xff0c;继上一篇文章 MergeTree查询链路 之后&#xff0c;这次我将为大家介绍MergeTree存储引擎的异步Merge和Mutation机制。建议读者先补充上一篇文章的基础知识&#xff0…

el-table中奇偶行背景色显示不同的颜色

默认样式 深色主题 border ref"singleTable" highlight-current-row current-change"handleCurrentChange" :row-class-name"tableRowClassName" :header-cell-style"{background:#004d8c,color:#FFFFFF}"事件方法 //奇偶行背景色不…

阿里云专属数据库,重新定义云数据库新形态

阿里云数据库专属集群专属链接 云专属数据库&#xff0c;重新定义云数据库新形态 数据库是一个有着超过40年历史的悠久行业&#xff0c;前期一直被传统的如Oracle等少数几家厂商把持。云计算的先行者AWS在2009年率先推出RDS服务&#xff08;Relational Database Service &…

软考零散知识点

网络命令 多态 强制多态&#xff1a;数字类型运算的自动拆装箱 过载多态&#xff1a;子类重写父类的方法 参数多态&#xff1a;方法的重载 包含多态&#xff1a;父类的引用指向子类的对象 主存和cache映射 RAID RAID RAID0&#xff1a;无冗余备份&#xff0c;带化。每条数据…

ServiceMesh最火项目:Istio架构解析

Istio 是一个开源的服务网格&#xff0c;可为分布式微服务架构提供所需的基础运行和管理要素。随着各组织越来越多地采用云平台&#xff0c;开发者必须使用微服务设计架构以实现可移植性&#xff0c;而运维人员必须管理包含混合云部署和多云部署的大型分布式应用。Istio 采用一…