查看原文
其他

爱奇艺视频弹幕爬取之《小舍得》

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:陈丹慧,中南财经政法大学金融学院

本文编辑:尚晨曦

技术总编:王子一

Stata&Python云端课程来啦!

好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!

导 读
电视剧《小舍得》的播放已经结束了一段时间,但热度仍不减少。《小舍得》主要讲述了两个“小升初”家庭对孩子教育方式有着不同的看法,以及逐渐受到外界的影响而改变的故事,写照了当代中国的家庭教育、学校教育、课外辅导机构等教育生态环境。掀起了网民们对“鸡娃”、“内卷”、“填鸭式教育”、“焦虑”等话题的激烈讨论。微博上讨论得热火朝天,爱奇艺视频里大家发弹幕的热情也十分高涨。根据本文5月上旬爬取的弹幕数据所示:第一集弹幕高达18789条,随后各集弹幕数虽有所波动,但都保持在了16000条以上,大结局弹幕数为18435条,再次创造高峰。本文将带领大家爬取《小舍得》全集弹幕,并在最后对弹幕内容进行分析,探讨视频观看用户对《小舍得》的看法。
 一、查找真实链接 

登录爱奇艺视频,播放电视剧《小舍得》,我们会发现弹幕是动态加载的。查看网页源代码,其中果然没有弹幕相关信息。因此,我们需要找到储存弹幕的真实链接。打开浏览器的开发者工具,点击“Network”,再“Ctrl+R”刷新,随着视频的播放,会不断出现很多文件链接,让人眼花缭乱。为了找到储存弹幕的真实链接,我们可以试图“Ctrl+F”在页面查找与“弹幕”有关的英文关键词,如“bullet”和“danmu”。笔者经过尝试发现,通过查找“bullet”,会出现一系列相关文件链接,可能储存着弹幕,如下图所示:

继续播放视频,不断获取链接,分析链接规律。我们发现,可以构造如下链接来获取信息:https://cmts.iqiyi.com/bullet/%s/00/%s_300_%s.z (%s表示占位符)。第一集的前300秒视频弹幕文件链接如下:https://cmts.iqiyi.com/bullet/68/00/3285370500686800_300_1.z

其中,参数"3285370500686800"是第一集的tv_id,可以理解为分集参数;参数“68”是tv_id的倒数第三、四位数;参数1表示该集第一个弹幕文件,每集约有46分钟,每300秒获取一个压缩文件,一集大概有10个压缩文件;".z"是压缩文件的后缀。原链接是br压缩文件,为了方便后续用zlib库解压,在此改为.z后缀文件,不影响内容。

为了获取全集弹幕内容,我们需要找到每一集的tv_id。进入《小舍得》的剧集列表网站(https://www.iqiyi.com/a_19rrhkzp95.html)。

查看网页源代码,在页面查找“tvId",我们发现42集tvId全部在第2404行中:

因此,获取网页源代码后,使用正则表达式即可获取全部视频的分集参数,代码和部分结果如下:

import requestsfrom lxml import etreeimport re#获取全部视频编号source="https://www.iqiyi.com/a_19rrhkzp95.html"html=requests.get(source)str=html.textid=re.findall('"tvId":+(\d+)+,"shortTitle"',str) #利用正则表达式提取tvId
 二、提取信息 

首先,由于弹幕数据储存在压缩文件中,我们需要通过zlib库对源文件进行解压。其次,如下图所示,弹幕文件Preview的内容是乱码,解压源文件后,我们还需要对其解码才能提取信息。

并且,为了反爬,最好提交headers。代码如下:

import zlibheaders={ "您的Requests Headers"}#爬取源文件,解压并解码def get_raw(url): raw=requests.get(url,headers=headers).content decode=zlib.decompress(bytearray(raw),15+32).decode('utf-8') xml=get_xml(decode) return xml#将字符串格式化,方便用xpath提取信息def get_xml(decode): byte_input= bytes(bytearray(decode, encoding = 'utf-8')) #lxml不支持解析带有encoding 声明的字符串,因此需要先转化为bytes tree=etree.fromstring(byte_input) return tree
以《小舍得》第一集的弹幕链接https://cmts.iqiyi.com/bullet/68/00/3285370500686800_300_1.z为例:最终解码后的内容如下图所示。利用xpath定位到文本节点//content/text(),即可提取弹幕。

最后,利用之前爬取的分集tvId和每集不同时段的参数进行循环,即可获得全部集数的弹幕文件,代码和部分结果如下:
i=1for j in id: file="第%s集弹幕.txt"%i i=i+1 danmu_list=[] for k in range(1,11): url="https://cmts.iqiyi.com/bullet/%s/00/%s_300_%s.z"%(j[-4:-2],j,k) try: text=get_raw(url) danmu=text.xpath("//content/text()") danmu_list.extend(danmu) except: print(k) for line in danmu_list: with open(file,"a",encoding="utf-8") as f: f.write(line+"\n")

 三、弹幕内容分析 

本次爬虫总共获取了约74万条弹幕。

全集词云图


 第一集词云图

 最后一集词云图

《小舍得》运用了对照的表现手法,对田雨岚与南俪这两大女主的刻画尤为突出,因此,本文结合弹幕内容着重分析了网友对她们的看法。

在42集弹幕中,有11605条弹幕提到了“田雨岚”三字,有16578条弹幕提到了“南俪”或“南丽”(女主南俪被相当一部分网民误称为“南丽”)。对提及二人的弹幕内容进行情感分析和词云图制作。如下所示:

从情感分析图可以看出,各种情绪指数都有一定的分布,网友对两人的态度,极化现象虽然并不严重,但存在一定差异。

结合弹幕具体内容可知,网友对田雨岚初期”凡尔赛“、”逼迫孩子“、”挑事“等行为十分不满、但其后期的转变得到了网友的理解,且受对演员蒋欣本人好感的加持,田雨岚一角色并未像以往电视剧中的恶角一样受到铺天盖地的网络暴力,很多观众在关心她的原生家庭对她造成的性格缺陷。而南俪一角色在前期得到赞许,后期成为弹幕的主要炮轰对象。“佛系妈妈”南俪本来坚守轻松教育的理念,但在周围的影响下,南俪也变得狼性,迷失了自己,对家庭造成了伤害。用网友的话来说,她“田雨岚化”了、魔怔了。虽然在大结局她幡然醒悟,但弹幕中的指责不减。有“舍”才有“得”。电视剧《小舍得》已经告一段落,但我们的人生课题、社会的教育课题仍在继续。

最后,我们为大家揭秘雪球网(https://xueqiu.com/)最新所展示的沪深证券和港股关注人数增长Top10。


对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!

往期推文推荐  
数据可视化利器——Matplotlib
从第七次人口普查看中国人口变化|Stata与Python交互绘图

200万投资者关注!!哪家公司这么牛?

带你领略一天天气之变化

利用pyecharts看微博粉丝地区分布

零值太多怎么办?解锁Stata17新命令ziologit

Stata17新功能之Python API
小罗肥归升级啦|解锁Stata17之新命令xtmlogit
速度大比拼之Stata17有多快?

初识PyStata

辞旧迎新——Stata17之Do-file编辑器优化

Stata17新亮点——解放表格输出生产力

【爬虫+可视化】链家网北京租房信息

手把手教你如何获取股票数据和可视化

Countvalues——数数的超级小帮手

frame框架进阶篇

下拉选择框如何变成“小猫咪” | selenium小技巧

Python中的运算符知多少?

快来get缺失值的正确打开方式

frame框架——我到底在哪个“房间”
如何使用Pandas读取txt文件?
基于MySQL数据库实现增量式爬取
寻找春日气息|本月最受欢迎的景点都在这里!
问世间情为何物,大数据也想参悟——后考研时代,何以解忧?唯有数据!
Python与数据库交互—浅述pymysql
偷懒小妙招|selenium之玩转鼠标键盘操作--鼠标篇
大家用Stata来“找茬”

关于我们 


微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。



此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存