# 简介

根据 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