如何用Python爬取弹幕
小编给大家分享一下如何用Python爬取弹幕,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨方法吧!
整篇文章分为两部分:1.爬取爱奇艺中该剧第一集的弹幕 2.对爬取出来的弹幕做处理,并制作词云。
1.爬取爱奇艺弹幕
相比于其他视频网站来说,爱奇艺的弹幕难爬一些,为啥呢,因为你爬取出来的文件是乱码的(下边会贴图),需要自己再把该文件二进制编码之后才能用。具体步骤如下:
首先,打开浏览器,进入爱奇艺页面,点开该剧,弹幕打开,然后F12,浏览器下方或者右侧会弹出一些界面,选择Network,在我图上标注的框中输入“bullet”搜索弹幕相关的文件,为啥输入这个搜索呢,因为这个单词的意思就是弹幕,程序员命名东西一般也是有规律的,还有大多视频网站的弹幕相关文件都是这个名字哈哈。如果你F12搜索之后无内容,那直接点击下浏览器刷新按钮即可。下图中箭头指的分别是Network、搜索框、弹幕文件名和弹幕内容(你可以看到,弹幕内容是乱七八糟的乱码)。还有说明一点,弹幕文件一集不止一个,爱奇艺5分钟加载一个弹幕文件(为啥5分钟,下边会解释)。
接下来,观察弹幕文件出现的规律以及弹幕文件地址中的规律,总结为以下:
弹幕文件链接规律为
https://cmts.iqiyi.com/bullet/tvid倒数4位的前两位/tvid最后两位/tvid_300_x.z;
x的计算方式为片子总时长除以300秒向上取整,即按每5分钟一个包。
tvid是啥呢,就是你URL导航栏里的这块,x为啥按5分钟一个包呢,是因为我F12之后查看两个相邻的弹幕文件包,它就是5分钟加载一个。
那第一集总共时长77分钟,按5分钟加载一个弹幕文件的话,向上取整,我们总共要抓取16个(77/5+1)弹幕文件。
抓取代码为:
importzlibimportrequestsforxinrange(16):x+=1#x是从1到16,16怎么来的,第一集总共77分钟,爱奇艺每5分钟会加载新的弹幕#77除以5向上取整url='https://cmts.iqiyi.com/bullet/92/00/9000000005439200_300_'+str(x)+'.z'bulletold=requests.get(url).content#这步取出来的文件是乱码的bulletnew=bytearray(bulletold)#将上一步的乱码文件用二进制再编码下xml=zlib.decompress(bulletnew,15+32).decode('utf-8')#把编码好的文件分别写入16个xml文件中(类似于txt文件),方便后边取数据withopen('./iqiyi'+str(x)+'.xml','a+',encoding='utf-8')asf:f.write(xml)f.close()
抓取出来的xml文件为下图,能看出来content字段就是弹幕:
将xml文件中的content字段取出来存为dan_mu.txt文件,方便我们之后做词云:
fromxml.dom.minidomimportparseimportxml.dom.minidomforxinrange(16):x+=1DOMTree=xml.dom.minidom.parse(r"C:\Users\dmj\PycharmProjects\test\iqiyi"+str(x)+".xml")collection=DOMTree.documentElement#在集合中获取所有entry数据entrys=collection.getElementsByTagName("entry")print(entrys)forentryinentrys:content=entry.getElementsByTagName('content')[0]print(content.childNodes[0].data)i=content.childNodes[0].datawithopen("dan_mu.txt",mode="a+",encoding="utf-8")asf:f.write(i)f.write("\n")
dan_mu.txt文件大概长这样:
2.制作词云
制作词云使用python的wordcloud库和jieba库,代码如下:
fromwordcloudimportWordCloudimportjiebaimportmatplotlib.pyplotasplt#读取弹幕txt文件withopen('./dan_mu.txt',encoding='utf-8',mode='r')asf:myText=f.read()myText="".join(jieba.cut(myText))list=myText.split("")#清洗无用数据foriinrange(len(list)-1,-1,-1):iflen(list[i])==1orlist[i]=="这个"or\list[i]=="不是"orlist[i]=="这么"\orlist[i]=="怎么"orlist[i]=="这是"\orlist[i]=="还是":list.remove(list[i])#print(list)myText="".join(list)print(myText)#制作词云wordcloud=WordCloud(background_color="white",font_path="simsun.ttf",height=300,width=400).generate(myText)#图片展示plt.imshow(wordcloud)plt.axis("off")plt.show()#将词云图片导出到当前文件夹wordcloud.to_file("wordCloudMo.png")
在此处可能会遇到的问题是,wordcloud这个外部库你在下载的时候可能会遇到各种花式报错,如何解决呢,参见下边这位老哥的方法:
https://blog.csdn.net/qq_42813128/article/details/82020510
词云图结果如下:
从词云图中我们可以看到,“真实”,“孩子”,“严良”,“普普”,“演技”等词语出现的频率很高。“真实”,“演技”,“厉害”等词语是大家对这部剧的肯定;“孩子”指的是这三个主演的小孩;“普普”的演技真的很不错,大家都猜测她会不会成为下一个张子枫。
总体来讲,弹幕中大家对这部剧基本都是好评,所以还是值得一看的。
看完了这篇文章,相信你对如何用Python爬取弹幕有了一定的了解,想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。