爬B站弹幕数据
准备工作
视频链接:
https://www.bilibili.com/video/BV1PK4y1b7dt?t=1【周杰伦最新单曲《Mojito》】
弹幕接口:
通过上网搜索,得知B站的弹幕接口为:https://api.bilibili.com/x/v1/dm/list.so?oid=XXX
(好像该接口在网页中找不到,所以就先借鉴来使用。ps:oid
即为视频的一个编号(不是BV号
))
获取oid:
弹幕接口中的oid
怎么获取?通过该链接(在页面检查中可找到):https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp,可以获取到我们要的那个cid
,cid
这个键对应的值,就是我们要的oid
数字串。如下图所示:
【注意:由于这个MV只有一个完整的视频,所以这里只有一个cid,如果一个视频是分不同小节发布的,这里就会有多个cid,不同的cid代表不同的视频。】
》通过以上分析,拿到oid
的值,再拼接到弹幕接口中,就可以正确获取到弹幕数据了。
完整的弹幕接口为:https://api.bilibili.com/x/v1/dm/list.so?oid=201056987,但是最多只能获取1千条弹幕信息,且会隔段时间进行刷新
开始爬取
》代码如下:
import requests
import json
import chardet
import re
from pprint import pprint
# 1.根据bvid请求得到cid
def get_cid():
url = 'https://api.bilibili.com/x/player/pagelist?bvid=BV1PK4y1b7dt&jsonp=jsonp'
res = requests.get(url).text
json_dict = json.loads(res)
# pprint(json_dict)
return json_dict["data"][0]["cid"]
# 2.根据cid请求弹幕,解析弹幕得到最终的数据
def get_data(cid):
final_url = "https://api.bilibili.com/x/v1/dm/list.so?oid=" + str(cid)
final_res = requests.get(final_url)
# 👇 chardet.detect() 用于精确判断字符编码
final_res.encoding = chardet.detect(final_res.content)['encoding']
final_res = final_res.text
pattern = re.compile('<d.*?>(.*?)</d>')
data = pattern.findall(final_res)
# pprint(final_res)
return data
# 3.保存弹幕列表
def save_to_file(data):
with open("dan_mu.txt", mode="w", encoding="utf-8") as f:
for i in data:
f.write(i)
f.write("\n")
cid = get_cid()
data = get_data(cid)
save_to_file(data)
》以上就是爬B站弹幕的案例代码,最终将弹幕数据存储在txt文本中。
》后面会将爬回来的数据进行处理,制作成词云图。
》本案例参考自✍:https://blog.csdn.net/csdnnews/article/details/106754771