简介

根据BiliBili视频下的Tag查询综合排名的前500个视频的Tag标签,查询发送弹幕用户、评论区用户的关注列表,分析特定Tag下粉丝关注视频的种类喜好并绘制词云和CSV表格。


Requirements

bilibili-api==7.0.1
beautifulsoup4==4.9.3
numpy==1.21.2
pandas==1.3.2
requests==2.25.0
stylecloud==0.5.2
wordcloud==1.8.1

tqdm==4.54.1

python==3.9.1

需求分析

一、跳转爬取输入的Tag下根据综合排名的前300个视频的BV号

二、获取所有视频的Tag

三、获取所有弹幕的用户加密uid

四、获取所有评论的用户uid

五、获取所有用户的关注列表信息

六、绘制词云和表格


详细设计

一、跳转爬取输入的Tag下根据综合排名的前300个视频的BV号
carbon
image-20210902163448250

在用户输入targetTag之后采用requests库进行爬虫,抓取页面中<a title="" href="">的内容并保存在List中

在每一页爬虫进行完后进行time.sleep(1.2),减少BiliBili服务器压力

同时随机化headers并构建IP代理池伪装正常请求减少被反爬的机率

二、获取所有视频的Tag

bilibili-api中封装了Video类可以直接通过BiliBili官方的api获取视频的所有Tag,并采用异步加快抓取速度

最后对结果用counter进行计数和从大到小的排序并返回结果的前300位

三、获取所有弹幕的用户加密uid
image-20210902165200344
image-20210902165240191

由api返回的XML弹幕文件的格式如图所示

<d p="">标签中的p[6]记录的是用户uid的十六进制密文,查询之后了解BiliBili采用CRC32的Hash加密uid

反查有两种方式,第一种是如代码所示可以通过Python自带库在现存uid范围内撞出弹幕用户的uid,这种方法计算时间长(约1~2s);第二种是通过CRC彩虹表查出uid

四、获取所有评论的用户uid
image-20210902170626412

获取BiliBili官方的评论区api,返回得到的是json格式的评论数据(不包含楼中楼)

通过Python的json模块,用json.loads()将数据转成dict方便查询特定的数据

五、获取所有用户的关注列表信息
carbon (2)

与四相同,获取BiliBili官方的关注列表api,返回得到json格式的关注数据

正常情况下(非UP主本人)用selenium或者是requests访问只能得到前100名的关注数据,通过api查询可以得到正序250名和倒序250名的关注数据。

六、绘制词云和表格
image-20210902171134069

表格可以通过pandas和matplotlib模块进行绘制

词云通过基于wordcloud的stylecloud绘制,这里使用了本地图片的蒙版来绘制,需要对stylecloud.gen_stylecloud进行修改

修改处如下图所示(在gen_stylecloud中添加bg: str="",以及修改mask=mask_array if len(bg)==0 else bg,

image-20210902171436202
image-20210902171549870