如题:如何实现B站直播弹幕呢?
分析过程:
进入虎牙官网--->随便点个直播房间--->F12抓包,刷新
分析每一条请求,点响应,找到弹幕信息。如图
可以看出返回信息是json格式的,提交方法是get,再分析一下提交参数
分析完成。
代码部分:
import requests
import time
import random
url = 'http://www.huya.com/cache1min.php?m=chatMessage&tid=22808102&sid=2536653492' # get请求,向这个网址提交数据
#构造get提交参数
form = {'m':'chatMessage',
'tid':'22808102',
'sid':'2536653492',
}
header = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.12; rv:57.0) Gecko/20100101 Firefox/57.0'}
#循环提交数据,达到实时获取弹幕信息效果,通过调试发现,太快只提交一次数据的话弹幕可能会重复,故,暂停一下。
#但是暂停一下提交,还是可能获取到重复的数据。故这里采用前后数据进行比较的方法防止弹幕重复,当然你也可以用多次比较。
while True:
html1 = requests.get(url,headers =header,params=form)#开始提交数据
text1 = list(map(lambda ii: html1.json()['result']['chats'][ii]['chat'], range(20)))#获取数据,因为返回的数据是json格式,故可以用分层切片来取到弹幕那层,然后用map和lamda函数的用法取得弹幕信息,最后直接转换成list
#print(text1)
time.sleep(random.uniform(2,3)) #暂停3秒,再提交数据
html2 = requests.get(url, headers= header,params=form)
text2 = list(map(lambda ii: html2.json()['result']['chats'][ii]['chat'], range(20)))
#print(text2)
huyadanmu_txt = [item for item in text2 if item not in text1]#比较两个弹幕信息,列表推导弹幕信息
for danmu in huyadanmu_txt:
time.sleep(random.uniform(1,2))
print('虎牙直播间实时弹幕:',danmu)