查看原文
其他

B站弹幕爬虫——冬奥顶流冰墩墩&雪容融

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

本文作者:王玉洁,中南财经政法大学金融学院

本文编辑:孙一博

技术总编:王子一

Stata&Python云端课程来啦!

       为了感谢大家长久以来的支持和信任,爬虫俱乐部为大家送福利啦!!!Stata&Python特惠课程双双上线腾讯课堂~爬虫俱乐部推出了Python编程培训课程Stata基础课程Stata进阶课程Stata文本分析正则表达式网络爬虫基本字符串课程。报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台和腾讯课堂留言哦。我们在这篇推文的最后提供了每门课程的课程二维码,大家有需要的话可以直接扫描二维码查看课程详情并进行购买哦~

引言

大家好呀,又见面了!最近,北京冬奥会正在如火如荼的进行着,会场吉祥物冰墩墩和雪容融已经收获了大批参赛运动员、记者和其他工作人员的喜爱,有关的周边更是卖到脱销,可谓是冬奥会真正的顶流呀!小编对他们也是十分喜欢,所以很想探究一下冬奥吉祥物视频里出现频次最高的弹幕词语会是什么?于是,小编立刻行动起来,在B站里面找到播放量最高的视频《北京2022年冬奥会和冬残奥会吉祥物宣传片》,大家一起跟小编来看看这个视频弹幕里面的高频词吧!

1.寻找弹幕存储的url


打开我们想要爬取的视频,接着打开谷歌的开发者模式,然后如下图所示,依次点击红框和查看历史弹幕,选中当天的日期,找到seg.so?开头的链接,就可以得到储存弹幕的url了。我们可以先把url复制下来:
https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=118104616&date=2022-02-06

我们可以先看一下存储弹幕的网站是什么样的,如下图所示。在爬取过程中,只需要使用正则表达式匹配中文字符就能够将弹幕内容匹配出来。


2.单页爬取,解析内容


找到弹幕存储的url之后,就可以对2022-02-06这天的弹幕进行抓取,具体程序如下:
import requestsimport reimport time
#单页爬取request_url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so'data = { 'type': '1', 'oid':'118104616', 'date': '2022-02-06' } headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', 'cookie':"buvid3=97F2FA35-EFA3-B5C1-61B6-C67907CA8C2A37952infoc; rpdid=|(~mkk~|~RJ0J'uY|RJk~ml); i-wanna-go-back=-1; _uuid=10C1399A10-E91C-26B2-55FA-8298B759EB6A56420infoc; buvid4=70B65C7F-153D-E8C1-8245-0EAF084709DF73006-022020322-aCc7jQNzzY21Vnhxm90Cjg%3D%3D; fingerprint=a4eb01a74eed63a0cf034c0a996c87dc; buvid_fp_plain=undefined; buvid_fp=35e8659b2dc1521fdbc33599087098d9; SESSDATA=894205e2%2C1659451634%2C5898f%2A21; bili_jct=497c9ebc82ebf31ca3b0345e78f07b17; DedeUserID=652311503; DedeUserID__ckMd5=664260912fb6d390; sid=kny720in; b_ut=5; bp_video_offset_652311503=547971529857835800; LIVE_BUVID=AUTO7816439002378839; blackside_state=1; CURRENT_QUALITY=80; CURRENT_BLACKGAP=1; CURRENT_FNVAL=4048; innersign=1; PVID=2; b_lsid=A66F7494_17ECED2CA7E"}res = requests.get(request_url,headers=headers,params=data)html = res.text# print(html)
#匹配弹幕内容resmatch = re.findall(':(.*?)@',html, re.S) danmu_list = []for k in range(len(resmatch)): word = re.findall('[\u4e00-\u9fa5]|\u3002|\uff1f|\uff01|\uff0c',resmatch[k]) # 匹配中文、句号、问号、感叹号以及逗号 danmu = ''.join(w for w in word) danmu_list.append(danmu)print(danmu_list)
执行结果如下:


3.多页爬取


观察2022-02-06和2022-02-05号弹幕存储的url:
#2022-02-06https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=118104616&date=2022-02-06#2022-02-05https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=118104616&date=2022-02-05
https://api.bilibili.com/x/v2/dm/web/history/seg.so?为固定部分,type参数均为1,oid参数是B站每个视频编码,相同视频不同历史弹幕中保持不变,唯一变化的就是date参数,也就是日期参数。如果想要实现多日期爬取,只需要改变date参数就行。
import requestsimport reimport time
#通过循环语句实现多页爬取headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36', 'cookie': "buvid3=97F2FA35-EFA3-B5C1-61B6-C67907CA8C2A37952infoc; rpdid=|(~mkk~|~RJ0J'uY|RJk~ml); i-wanna-go-back=-1; _uuid=10C1399A10-E91C-26B2-55FA-8298B759EB6A56420infoc; buvid4=70B65C7F-153D-E8C1-8245-0EAF084709DF73006-022020322-aCc7jQNzzY21Vnhxm90Cjg%3D%3D; fingerprint=a4eb01a74eed63a0cf034c0a996c87dc; buvid_fp_plain=undefined; buvid_fp=35e8659b2dc1521fdbc33599087098d9; SESSDATA=894205e2%2C1659451634%2C5898f%2A21; bili_jct=497c9ebc82ebf31ca3b0345e78f07b17; DedeUserID=652311503; DedeUserID__ckMd5=664260912fb6d390; sid=kny720in; b_ut=5; bp_video_offset_652311503=547971529857835800; LIVE_BUVID=AUTO7816439002378839; blackside_state=1; CURRENT_QUALITY=80; CURRENT_BLACKGAP=1; CURRENT_FNVAL=4048; innersign=1; PVID=2; b_lsid=A66F7494_17ECED2CA7E"}request_url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so'danmu_list = []for i in range(1,31): data={ 'type': '1', 'oid': '118104616', 'date': '2019-10-{:0>2d}'.format(i) } try: res=requests.get(request_url,headers=headers,params=data,timeout=5) html=res.text resmatch = re.findall(':(.*?)@',html, re.S) for k in range(len(resmatch)): word = re.findall('[\u4e00-\u9fa5]|\u3002|\uff1f|\uff01|\uff0c',resmatch[k]) danmu = ''.join(w for w in word) danmu_list.append(danmu) time.sleep(5) except Exception as e: print('{}这一天的弹幕出错了,原因是{}'.format(data['date'],e)) time.sleep(5) continue
#将存储弹幕内容的列表danmu_list写入txt文件with open(r"./danmulist.txt",'w+') as f: for item in danmu_list: f.write(item) f.write("\n")
执行上述程序后,可以得到danmulist.txt文档,内容如下:


4.绘制词云图


抓取完弹幕之后,我们通过绘制词云图看看弹幕里面大家对冰墩墩和雪容融都说了些什么吧!
import jiebaimport jieba.analyse as anlyimport numpy as npimport PIL.Image as Imagefrom wordcloud import WordCloud,ImageColorGenerator
#去停用词stopwordlist=[]fencilist=[]resultlist=[] with open(r"./停用词表.txt",'r',encoding='utf-8') as f: for i in f: stopwordlist.append(i)with open(r'.\danmulist.txt', 'r',encoding='gbk') as test: for line in test: fencilist.append(line.strip())for i in fencilist: if(i not in stopwordlist): resultlist.append(i)with open(r"处理过的分词.txt",'w',encoding='gbk') as xx: for x in resultlist: xx.write(x)

#分词,画词云图text = open(r'./处理过的分词.txt', 'r', encoding='gbk').read()word_list = jieba.cut(text)space_word_list = ' '.join(word_list)keywords = [] # 创建空列表(list)for x, w in anly.extract_tags(space_word_list,topK=200, withWeight=True): keywords.append(x) # 前200关键词组成的listspace_word_list = ' '.join(keywords)
mask_pic = np.array(Image.open("冰墩墩.png"))word = WordCloud( width=600, height=300, font_path="msyh.ttc", # 设置字体,本机的字体 stopwords=stopwordlist, scale=4, #设置图片的清晰度 mask = mask_pic, # 设置背景图片 background_color='white', # 设置背景颜色 max_font_size=150, min_font_size=3, ).generate(space_word_list) image = word.to_image()word.to_file('5.png') # 保存图片image.show()
得到的词云图如下:

从图片中可以看到,大家对冰墩墩和雪容融的印象是“可爱”、“熊猫”、“灯笼”、”憨憨的“,从这些词也足以看出大家对两大顶流的喜爱了。
以上就是小编介绍的全部内容了,喜欢冰墩墩和雪容融的宝子们可以小试牛刀,赶紧练起来吧!
END

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




腾讯课堂课程二维码








            


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












往期推文推荐 

        不会用Stata做描述性统计表?so easy!

        丰沛之地:备足姨妈巾

 过年啦,用Python绘制一幅属于你的春联吧!

       登上爬虫俱乐部“时光机” |上“机”出发 开启一段奇妙之旅

       【基础篇】查找并输出子字符串的定位

        Stata中的小清新命令——添加观测值

        PCA(主成分分析法)降维——Python实现

       超好用的事件研究法

        如何绘制任泽平《鼓励生育基金》的几幅图

        Python 第六天——字符串

        findname——想要什么找什么

        Python字符串之“分分合合”

        PDF转docx可批量操作?——wordconvert的小技巧

        考研之后,文科生需以“do”躬“do”!

       手绘五星兴家国——用Stata绘制五星红旗

        Seminar丨董事会的性别多样化和企业创新:来自国际的证据

       Python与数据库交互——窗口函数

        Stata之post命令——数据邮递 

        爬虫俱乐部成员的Stata学习经验分享来啦!

       Seminar丨2002年萨班斯·奥克斯利法案的经济后果

        我几乎画出了“隔壁三哥”家的国旗

        Python基础——三大数字类型,你都了解吗?
        如何用Stata绘制带指向性箭头标注的图像       
       Seminar丨荐仆贷款——19世纪中国的信任辅助贷款       【技能篇】多进程队列间通信

Seminar丨公司董事会的人才增长:来自中国的证据

正则表达式--懒惰模式

爬完独立董事的年薪,我的眼镜跌破了!识别旅游“照骗”——看风景名胜是否名副其实主成分分析的Python实现

正则表达式--贪婪模式

Seminar丨谁更重要:高管股权薪酬与财务报告欺诈DOS能量,超乎你想象!

爬虫实战丨走进哈利波特的魔法世界

数据集合并的新路子-frlink命令

关于我们 


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

   武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。



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

投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里
为作者署名,并有赏金分成。

2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众
号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。


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

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