如题:如何实现B站直播弹幕呢?
分析过程:
进入B站官网--->随便点个直播房间--->F12抓包,刷新
分析每一条请求,点响应,找到弹幕信息。如图
可以看出返回信息是json格式的,提交方法是POST,再分析一下提交参数
还有两个参数是我怀疑是跟登陆有关系,不登陆不会提交这个两个数据,推测一下,我并没有登陆帐号,所以测试一下登陆帐号的结果。先记录一下没登陆系统给我生成的cookie
登陆后看一下提交的数据:
[图片上传中...(9467542-3aaadaa8b1760e6e.png-4d615d-1513748527154-0)]
再看一下cookie
果然,在这里。但是第三个参数是没有的。
所以构造字典提交数据的时候把这个值提交上。因为这个值只有在登陆的时候有。但是楼主测试过,不提交这个值也是可以获取数据的。
分析完成。
代码部分:
importrequests, time
url ='https://api.live.bilibili.com/ajax/msg'# POST请求,向这个网址提交数据
#构造POST提交参数
form = {'csrf_token':'',
'roomid':'3742025',
'token':''
}
#循环提交数据,达到实时获取弹幕信息效果,通过调试发现,太快只提交一次数据的话弹幕可能会重复,故,暂停一下。
#但是暂停一下提交,还是可能获取到重复的数据。故这里采用前后数据进行比较的方法防止弹幕重复,当然你也可以用多次比较。
while True:
html1 = requests.post(url,data=form)#开始提交数据
text1 =list(map(lambdaii: html1.json()['data']['room'][ii]['text'],range(10)))#获取数据,因为返回的数据是json格式,故可以用分层切片来取到弹幕那层,然后用map和lamda函数的用法取得弹幕信息,最后直接转换成list
time.sleep(5)#暂停5秒,再提交数据
html2 = requests.post(url,data=form)
text2 =list(map(lambdaii: html2.json()['data']['room'][ii]['text'],range(10)))
bilibili_txt = [itemforitemintext2ifitemnot intext1]#比较两个弹幕信息,列表推导弹幕信息
fordanmuinbilibili_txt:
print('直播间实时弹幕:',danmu)