查看原文
其他

B站弹幕爬虫——今天你”帕梅拉“了吗?

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

本文作者:刘子艳,河南大学经济学院

本文编辑:张孟晗

技术总编:王子一

Stata&Python云端课程来啦!

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

对于想要减脂降脂的人来说,有一个人听过爱过恨过——帕梅拉,火遍全网的美女健身博主。当她出新的视频时,总有一群人开始新一轮的“从开始到放弃”、“马过就是练过”。“帕姐虐我千百遍,我待帕姐如初恋”,这句口号成为无数“帕人”的口头禅。久闻这位健身博主威名,小编一时好奇,想探究一下帕梅拉视频里出现频次最高的弹幕词语会是“加油”、“坚持”还是什么?好奇催生行动,今天大家就和小编一起来see一眼帕姐B站主页里播放量最高的视频《帕梅拉 - 10分钟HIIT燃脂!高强全身燃脂训练 无器械》里的弹幕高频词!




一、观察网页寻找弹幕存储url

以前的B站弹幕视频,打开浏览器的开发者模式,点击查看历史弹幕,会返回一个json数据,包含了所有的弹幕内容。但是现在点击历史弹幕数据,同样是有数据加载出来,但是里面的都是乱码了。

依次点击上图中的红框,就能看到如下的以seg.so?开头的链接,把它复制下来:

https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=226724985&date=2021-12-02

通过浏览器预览这个url下的数据是乱码,但请求这个链接还是会得到想要的数据内容。

只需要使用正则表达匹配中文字符就将弹幕内容匹配出来。


二、单页爬取,解析内容

在找到存储弹幕内容的url之后,弹幕内容的爬取就手到擒来。

#导入爬取网页需要的库import requestsimport reimport time
#单页爬取request_url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so'data = { 'type': '1', 'oid': '226724985', 'date': '2021-12-02' } headers = { 'user-agent': '填入你的user-agent', 'cookie': '填入你的cookie'}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)

在执行完上面的语句之后,我们得到了下面的结果:



三、循环请求url列表,实现多页爬取

观察12月2日和12月3号弹幕存储url:

https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=226724985&date=2021-12-02https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=226724985&date=2021-12-03

https://api.bilibili.com/x/v2/dm/web/history/seg.so为固定部分type参数均为1,oid参数是B站每个视频编码,相同视频不同历史弹幕中保持不变,唯一变化的就是date参数,也就是日期参数。如果想要实现多日期爬取,只需要改变date参数就行。

#导入爬取网页需要的库import requestsimport reimport time
#通过循环语句实现多页爬取headers = { 'user-agent': '填入你的user-agent', 'cookie': '填入你的cookie'}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': '226724985', 'date': '2021-11-{: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文档,内容如下:


至此,大家和小编一起爬得了《帕梅拉 - 10分钟HIIT燃脂!高强全身燃脂训练 无器械》十一月份共计45000条历史弹幕

四、根据弹幕内容,绘制词云图

得到了历史弹幕文件,我们通过绘制词云图,看看大家在弹幕里都说了些什么。
#导包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")) # 调用包PIL中的open方法,读取图片文件,通过numpy中的array方法生成数组word = WordCloud( font_path='C:/Windows/Fonts/SIMYOU.ttf', # 设置字体,本机的字体 scale=4, #设置图片的清晰度 mode = "RGBA", mask = mask_pic, # 设置背景图片 background_color='FloralWhite', # 设置背景颜色 max_font_size=150, # 设置字体最大值 ).generate(space_word_list) word.recolor(color_func=ImageColorGenerator(mask_pic))image = word.to_image()word.to_file('2.png') # 保存图片image.show()
得到的图如下所示:

从图片中我们能看到网友们坚持打卡的痕迹:“第一天”、“第二天”等,也从“救命”、“再见”等词中感受到了大家被帕梅拉支配的恐惧。

五、词频统计:获取前10最高频的词

#导包import jiebaimport numpy as npfrom collections import Counterfrom matplotlib import pyplot as plt
# 词频统计:获取前10最高频的词text = open(r'.\处理过的分词.txt', 'r', encoding='gbk').read()word_list = jieba.cut(text)word_new=[]for word in word_list: if len(word)>=2 and len(word)<=4: #控制词语长度在2—4中间 word_new.append(word)word_counts_top = Counter(word_new).most_common(10)word_fenci=[]word_pinshu=[]for i in word_counts_top: word_fenci.append(i[0]) word_pinshu.append(i[1])x1 = word_fenci[:10]y1 = word_pinshu[:10]plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(10,5))plt.bar(x1,y1,color = '#FF7F50',width = 0.5,alpha=0.7) plt.title('帕梅拉燃脂视频弹幕高频词汇') plt.xlabel('词语') plt.ylabel('次数') plt.savefig('./高频词汇.jpg',dpi=1000,bbox_inches = 'tight')plt.show()
得到的图如下所示:

从结果中我们可以看到,即使天气寒冷大家也在坚持运动打卡。但明显三天打鱼两天晒网的“帕人”较多,频数最多的词语“第一天”达七千五百,而“第二天”就降为三千二百,后面的天数就更少了。此外结合“老婆”以及词云图中出现的“宋亚轩”、“刘耀文”等明星名字,不得感叹B站视频弹幕里,是存在最多的明星家属的地方!
好啦,今日份分享就到这里了,喜欢的话就给俺点个赞叭。运动是最解压的解压方法,当你悲叹“人生在世不称意”之时,不如打开B站,跟着帕梅拉来一次全身运动,也许就会心境开阔。毕竟人生需达命,有酒且长歌!

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




腾讯课堂课程二维码








            


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











往期推文推荐

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

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

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

        正则表达式--懒惰模式

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

正则表达式--贪婪模式

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

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

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

Seminar丨附近的公司:利用卫星图像研究本地信息优势

线性同余法生成伪随机数 

[技能篇]多线程爬虫

“好哭”是衡量一部好电影的标准吗?

Stata&Python云端课程来啦!

带你了解Stata中的矩阵

Seminar|总统的朋友:政治关联与企业价值
爬虫实战 | 爬取中国天气网

爬虫实战 | 爬取东方财富网经济数据——以居民消费价格指数(CPI)为例

Seminar|媒体关联董事对融资和外部治理的影响神奇的组内交叉合并 PDF分章节转TXT并实现可视化——以胡景北知青日记1971至1978年为例

万物皆可开——shellout妙用

无处不在的系列配置项|从零开始的Pyecharts(三)

使用Python制作自动聊天机器人  

fillin一下,平衡回来~

order命令——快速改变变量顺序的利器 Ajax应用场景——以获取雪球网港股代码及公司名称为例

关于我们 


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

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



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

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

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


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

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