爱奇艺视频弹幕爬取之《小舍得》
本文作者:陈丹慧,中南财经政法大学金融学院
本文编辑:尚晨曦
技术总编:王子一
Stata&Python云端课程来啦!
好雨知时节,当春乃发生。为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~原价2400元的Python编程培训课程,现在仅需100元,详情请查看推文《Python云端课程福利大放送!0基础也能学~》。关于Stata,爬虫俱乐部推出了系列课程,内容包括字符串函数、正则表达式、爬虫专题和文本分析,可以随心搭配,价格美丽,物超所值,更多信息可查看Stata系列推文《与春天有个约会,爬虫俱乐部重磅推出正则表达式网络课程!》、《与春天有个约会,爬虫俱乐部重磅推出基本字符串函数网络课程》等。变的是价格,不变的是课程质量和答疑服务。对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦!
登录爱奇艺视频,播放电视剧《小舍得》,我们会发现弹幕是动态加载的。查看网页源代码,其中果然没有弹幕相关信息。因此,我们需要找到储存弹幕的真实链接。打开浏览器的开发者工具,点击“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 requests
from lxml import etree
import re
#获取全部视频编号
source="https://www.iqiyi.com/a_19rrhkzp95.html"
html=requests.get(source)
str=html.text
id=re.findall('"tvId":+(\d+)+,"shortTitle"',str) #利用正则表达式提取tvId
首先,由于弹幕数据储存在压缩文件中,我们需要通过zlib库对源文件进行解压。其次,如下图所示,弹幕文件Preview的内容是乱码,解压源文件后,我们还需要对其解码才能提取信息。
并且,为了反爬,最好提交headers。代码如下:
import zlib
headers={
"您的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
xpath
定位到文本节点//content/text()
,即可提取弹幕。i=1
for 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元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
200万投资者关注!!哪家公司这么牛?
带你领略一天天气之变化
利用pyecharts看微博粉丝地区分布
零值太多怎么办?解锁Stata17新命令ziologit
初识PyStata
辞旧迎新——Stata17之Do-file编辑器优化
Stata17新亮点——解放表格输出生产力
【爬虫+可视化】链家网北京租房信息
手把手教你如何获取股票数据和可视化
Countvalues——数数的超级小帮手
下拉选择框如何变成“小猫咪” | selenium小技巧
Python中的运算符知多少?
快来get缺失值的正确打开方式
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。