今天你还是“刘畊宏女孩”吗?
本文作者:王玉洁,中南财经政法大学金融学院
本文编辑:张 猛
技术总编:王玉婷
Stata&Python云端课程来啦!
好消息好消息,爬虫俱乐部开辟小鹅通战场!!爬虫俱乐部隆重推出小鹅通网络课程,将Stata基础课程,Stata进阶课程和Python课程都上传至小鹅通平台,欢迎大家多多支持订阅!报名课程即可加入答疑群,对报名有任何疑问欢迎在公众号后台留言哦。如需了解详情,可以通过课程链接(https://appbqiqpzi66527.h5.xiaoeknow.com/homepage/10)或课程二维码进行访问哦~引言
大家好呀,又见面了!最近,“刘畊宏女孩”是全网超热的梗之一。在上海居家隔离的刘畊宏和妻子王婉霏一周五天的网络直播燃脂健身操,数以百万计的“刘畊宏女孩”蜂拥而至,跟着直播间里的“刘教练”跳动燃脂,小编也有跟着运动哦。不过,小编想知道诸位刘畊宏女孩有没有一边跟跳一边喊“救命”呢?我们一起来探究一下B站《30分钟刘畊宏本草纲目毽子操》弹幕中的高频词吧!
一、寻找弹幕存储的url
打开我们想要爬取的视频,然后进入谷歌的开发者模式。如下图所示,依次点击红框和查看历史弹幕,选中当天的日期,找到seg.so?
开头的链接,这就是储存弹幕的url了。为了后续使用方便,单击右键把url link复制下来。
"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=585170342&date=2022-05-31"
将copy的url粘贴到浏览器地址栏,回车,即可看到存储弹幕的网页的具体排版,以便我们后续对该网页中的弹幕文本进行提取。如下图所示,显然我们只需要使用正则表达式之“匹配中文字符”就能够将弹幕内容提取出来。
二、单页爬取,解析内容
找到弹幕存储的url之后,就可以对2022-05-31(在第一步中可以选择日期,或直接修改url中的date参数)的弹幕进行抓取,具体程序如下:
import requests
import re
import time
#单页爬取
request_url = 'https://api.bilibili.com/x/v2/dm/web/history/seg.so'
data = {
'type': '1',
'oid':'585170342',
'date': '2022-05-31'
}
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36',
#一定要更换为自己的cookie
'cookie':"""buvid3=DD402B7D-3414-4EFB-835F-0D1F9E8BD86034777infoc; rpdid=|(u)Ykl~|lR~0J'uYkuRm~YRJ; LIVE_BUVID=AUTO3116264102704575; video_page_version=v_old_home; PVID=1; buvid4=C1B4C18B-2B13-293E-D27C-9E53EC989EB142597-022020714-Vn+FU1nCo/aLfwmo5Znk7w%3D%3D; CURRENT_QUALITY=0; buvid_fp_plain=undefined; i-wanna-go-back=-1; _uuid=3B2B68C3-37107-65F6-73A10-3103E8EF410E7451880infoc; CURRENT_BLACKGAP=0; fingerprint=0e3908141c36bcf4e5b97e09acb276c8; SESSDATA=eaa39716%2C1668078135%2Ca1448%2A51; bili_jct=bc36721c99a97933aa701b54c508552d; DedeUserID=36239417; DedeUserID__ckMd5=28968b7dbf2789fa; sid=jerunfne; buvid_fp=0e3908141c36bcf4e5b97e09acb276c8; fingerprint3=4bf79f697e02869542c37a02783e1633; blackside_state=0; nostalgia_conf=-1; b_ut=5; bp_video_offset_36239417=667875806939185200; b_lsid=256D8773_181571B63D3; bsource=search_baidu; innersign=1; CURRENT_FNVAL=4048; b_timer=%7B%22ffp%22%3A%7B%22333.1007.fp.risk_DD402B7D%22%3A%22181571B69E7%22%2C%22333.337.fp.risk_DD402B7D%22%3A%22181571B7842%22%2C%22333.788.fp.risk_DD402B7D%22%3A%22181571B9CB3%22%7D%7D"""
}
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)
需要特别注意的是,headers
中的cookie
参数必须更换为自己cookie,可以在seo.so?
的Headers栏目下找到,如下图所示:
执行结果如下:
三、多页爬取
观察2022-05-31和2022-05-30号弹幕存储的url:
# 2022-05-31
"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=585170342&date=2022-05-31"
# 2022-05-30
"https://api.bilibili.com/x/v2/dm/web/history/seg.so?type=1&oid=585170342&date=2022-05-30"
https://api.bilibili.com/x/v2/dm/web/history/seg.so?
为其中的固定部分,type
参数均为1,oid
参数为B站每个视频的unique编码,相同视频不同历史弹幕中保持不变,唯一变化的就是date
参数,也就是日期参数。如果想要实现多日期爬取,只需要改变date
参数。
import requests
import re
import time
#通过循环语句实现多页爬取
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/101.0.4951.67 Safari/537.36',
#一定要更换为自己的cookie
'cookie':"""buvid3=DD402B7D-3414-4EFB-835F-0D1F9E8BD86034777infoc; rpdid=|(u)Ykl~|lR~0J'uYkuRm~YRJ; LIVE_BUVID=AUTO3116264102704575; video_page_version=v_old_home; PVID=1; buvid4=C1B4C18B-2B13-293E-D27C-9E53EC989EB142597-022020714-Vn+FU1nCo/aLfwmo5Znk7w%3D%3D; CURRENT_QUALITY=0; buvid_fp_plain=undefined; i-wanna-go-back=-1; _uuid=3B2B68C3-37107-65F6-73A10-3103E8EF410E7451880infoc; CURRENT_BLACKGAP=0; fingerprint=0e3908141c36bcf4e5b97e09acb276c8; SESSDATA=eaa39716%2C1668078135%2Ca1448%2A51; bili_jct=bc36721c99a97933aa701b54c508552d; DedeUserID=36239417; DedeUserID__ckMd5=28968b7dbf2789fa; sid=jerunfne; buvid_fp=0e3908141c36bcf4e5b97e09acb276c8; fingerprint3=4bf79f697e02869542c37a02783e1633; blackside_state=0; nostalgia_conf=-1; b_ut=5; bp_video_offset_36239417=667875806939185200; b_lsid=256D8773_181571B63D3; bsource=search_baidu; innersign=1; CURRENT_FNVAL=4048; b_timer=%7B%22ffp%22%3A%7B%22333.1007.fp.risk_DD402B7D%22%3A%22181571B69E7%22%2C%22333.337.fp.risk_DD402B7D%22%3A%22181571B7842%22%2C%22333.788.fp.risk_DD402B7D%22%3A%22181571B9CB3%22%7D%7D"""
}
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': '585170342',
'date': '2022-05-{: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文档,内容如下:
四、绘制词云图
抓取完弹幕之后,我们通过绘制词云图看看弹幕里面刘畊宏女孩们都说了些什么吧!
import jieba
import jieba.analyse as anly
import numpy as np
import PIL.Image as Image
from wordcloud import WordCloud,STOPWORDS,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关键词组成的list
space_word_list = ' '.join(keywords)
mask_pic = np.array(Image.open("背景图.png"))
word = WordCloud(
width=800, height=400,
font_path="msyh.ttc", # 设置字体,本机的字体
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('词云.png') # 保存图片
image.show()
得到的词云图如下:
从图片中可以看到,大家对健身操最多的感受是“累”、“暴汗”、“打卡”、“第一天”、”倍速“和“坚持”,从这些词也可以看出“刘畊宏女孩”一边吐槽一边锻炼,一边累的不行一边坚持着,大家真的太可爱了!
以上就是小编介绍的全部内容了,刘畊宏女孩们可以小试牛刀,赶紧练起来吧!
END
对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐 JupyterNotebook——如何更换默认文档目录
Stata绘图系列——玩转绘图通用选项(一)
出人意料!这所大学的A级学科总数竟超越清华北大!
Stata数据读入——打开方式不同?
数据类型——Dict、Set与Frozenset简析
Stata小贴士之外部命令安装路径
有一种夏天叫做宫崎骏的夏天
换装术|多个Excel文件如何一键转为dta格式
【基础篇】Python可变对象与不可变对象
Stata绘图系列——细节掌控绘图区域!
4月A股的收官战之概念板块哪家强?解放双手!你必须要会的两个命令—inlist & inlist2
【基础篇】字符串之判断方法
Stata绘图系列——让你的直方图随心所欲
【爬虫篇】湖人无缘季后赛,球迷如何回应
客官,要来份四象限图吗?
Python实现简繁体转换
Stata与Python交互方法及数据传递
“青铜”爬“王者”
留下想要的变量,你会几种方法?
关于我们
微信公众号“Stata and Python数据分析”分享实用的Stata、Python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。
武汉字符串数据科技有限公司一直为广大用户提供数据采集和分析的服务工作,如果您有这方面的需求,请发邮件到statatraining@163.com,或者直接联系我们的数据中台总工程司海涛先生,电话:18203668525,wechat: super4ht。海涛先生曾长期在香港大学从事研究工作,现为知名985大学的博士生,爬虫俱乐部网络爬虫技术和正则表达式的课程负责人。
此外,欢迎大家踊跃投稿,介绍一些关于Stata和Python的数据处理和分析技巧。
投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。