查看原文
其他

有一种夏天叫做宫崎骏的夏天

爬虫俱乐部 Stata and Python数据分析 2023-01-01

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

本文编辑:万   浩

技术总编:王子一


Stata&Python云端课程来啦!

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

相信大家都看过宫崎骏的动漫吧,蓝蓝的天空中飘着如同棉花糖般的白云,树荫底下徐徐而来的微风,舒适的画面,天马行空的想象,治愈的美食,无不让人十分向往,网上甚至流传着这样一句话:有一种夏天叫做宫崎骏的夏天,夏天到了,让我们一起来感受一下宫崎骏的夏天吧!

一、观察网页寻找弹幕存储url
我们首先在B站上打开视频所在的网页, 接着打开谷歌的开发者模式,然后如下图所示,按照红框顺序依次进行点击,就能看到如下储存弹幕的以"seg.so?"开头的链接,然后我们把该链接的url复制下来:

复制的url为:
https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=168454964&date=2022-04-26
接着我们通过浏览器预览这个url下的数据,可以看到:

二、单页爬取,解析内容
在找到存储弹幕内容的url之后,我们通过如下程序来获取弹幕内容:
##单页爬取import requestsimport reimport time
request_url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so'data = { 'type': '1', 'oid': '168454964', 'date': '2022-04-26' } headers = { "cookie": "输入自己的cookie", "user-agent": "输入自己的user-agent"}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列表,实现多页爬取

观察4月26日和4月27日弹幕存储的url:

#2022-04-26https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=168454964&date=2022-04-26#2022-04-27https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=168454964&date=2022-04-27
我们发现这两个链接具有相同的部分:"https://api.bilibili.com/x/v2/dm/web/history/seg.so",type参数均为1,oid参数是B站每个视频编码,相同视频不同历史弹幕中保持不变,唯一变化的就是date参数,也就是日期参数。如果想要实现多日期爬取,只需要改变date参数就行。
import requestsimport reimport time
#通过循环语句实现多页爬取headers = { "cookie": "输入自己的cookie", "user-agent": "输入自己的user-agent"}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': '168454964', 'date': '2022-04-{: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"文档,内容如下:

执行上述语句之后,打开生成的"danmulist.txt"文档,内容如下进行完上述操作,我们就获取了4月份大家在B站视频--《有一种夏天叫宫崎骏的夏天,希望疫情早点过去夏天早点到来》上发的所有弹幕。

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

得到了历史弹幕文件,我们通过绘制词云图,看看大家在弹幕里都说了些什么。
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("魔女宅急便.jpg"))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('1.png') # 保存图片image.show()
得到的图如下所示:

从图片中我们可以看到,大家打出了部分动漫的名字,其中呼声较高的有千与千寻、哈尔的移动城堡、萤火虫之墓、魔女宅急便等,有些观众认为这些片段很治愈,将其评价为人间烟火,是不是也勾起了你的向往,打算再重温一下呢。
好啦,今天的分享就到这里,大家可以跟着上述教程操作一下,打开B站,也来感受一下“夏天”的气息~

END

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


腾讯课堂课程二维码








            


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











往期推文推荐

换装术|多个Excel文件如何一键转为dta格式

【基础篇】Python可变对象与不可变对象

Stata绘图系列——细节掌控绘图区域!

 4月A股的收官战之概念板块哪家强?

解放双手!你必须要会的两个命令—inlist & inlist2

【基础篇】字符串之判断方法

Stata绘图系列——让你的直方图随心所欲

【爬虫篇】湖人无缘季后赛,球迷如何回应

客官,要来份四象限图吗?

Python实现简繁体转换

Stata与Python交互方法及数据传递

 “青铜”爬“王者”

 留下想要的变量,你会几种方法?

 Python:朋友圈配图,我承包了

 绘制全国祠堂密度地图

 如何使用Stata绘制一幅好看的柱状图?

【爬虫篇】基于selenium爬取美团评论

 双标的莱万——足球无关政治?!

 Stata处理重复值:duplicates

It's time to send a flower to your lover!        2021各省GDP新鲜出炉

 爬虫实战-采集全国各省疫情数据

 log——为你的操作保驾护航

 一行代码教你玩转emoji

 票房遇冷的春节档口碑冠军丨《狙击手》影评分析

 学习丰县,营造良好营商环境!

 大国丢娃图:从川渝到徐州!

 丰县“失火”,殃及徐州:股市超跌近30亿!

 Unicode转义字符——编码与解码

        徐州!徐州!

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

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

        丰沛之地:备足姨妈巾

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

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

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

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

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

关于我们 


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

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



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

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

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




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

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