python爬取虎牙弹幕礼物数据
- 查看官方文档
- 找到弹幕传输的方式
- 生成websocket对应的参数
- 第一步:
- 第二步:
- 调通websocket
- 建立链接
- 获取数据和保持心跳
- 附上完整代码
- 注:
查看官方文档
官方文档链接:https://dev.huya.com/docs#/%E5%BC%80%E6%94%BEAPI%E6%8E%A5%E5%85%A5%E8%AF%B4%E6%98%8E
会看到官方已经提供对应的接口。咱们只需要根据文档通过python实现就行了。
找到弹幕传输的方式
这里咱们可以发现,是通过两种方式传输过来的。websocket和https这两种都能获取到弹幕的信息。下面介绍一下websocket的链接方式。
生成websocket对应的参数
其实官方文档已经告诉你了,怎么建立链接了。下面我一步一步根据官方文档走,可能是因为讲的太详细了,本人踩了一些坑。
第一步:
这里就说明了,需要用到jwt的验证。这里要注意的是Header,是默认的,根据你使用的jwt的方式默认的。不需要放在signature中。
第二步:
调通字段:header表明的是jwt的认证方式,HS256的加密算法。
payload这里面缺少了房间id,实际应该是
{"iat":1556188391,"exp":1556188991,"appId":"xxxxxxxxxxxx","roomId":roomId
}
然后再用jwt根据文档做进一步处理。生成对应的Signature。python有第三方jwt库可以直接用
附上对应的方法
import jwt
def get_sign(room_id,app_id,secret):payload = {"iat":int(time.time()),"exp":int(time.time())+600,"roomId":room_id,"appId":app_id}token = jwt.encode(payload,secret,algorithm='HS256')return token
其中iat是当前时间戳,exp是当前时间戳加上600秒。app_id以及secret是你成为虎牙开发者的时候,会有这两个信息给到你的。
调通websocket
建立链接
根据上一步,把所有对应的参数都获取到了。然后通过python的webscoket链接的方式,先建立链接。
获取数据和保持心跳
这一步发送的是你想要获取到的数据,里面包含了很多数据。具体的数据详情见虎牙开发者官方文档。
再下一步是保持心跳。保持心跳的方式很简单,就是建立连接后,保持固定的时间,发送ping字符串即可。
附上完整代码
import jwt
import websockettry:import thread
except ImportError:import _thread as thread
import json
import timedef get_sign(room_id,app_id,secret):payload = {"iat":int(time.time()),"exp":int(time.time())+600,"roomId":room_id,"appId":app_id}token = jwt.encode(payload,secret,algorithm='HS256')return tokendef on_message(ws, message):info = json.loads(message)print(info)def on_error(ws, error):print(error)def on_close(ws):print("### closed ###")def on_open(ws):def run(*args):ws.send('{"command":"subscribeNotice","data":["getMessageNotice","getVipEnterBannerNotice","getSendItemNotice","getOnTVAwardNotice", "getOpenNobleNotice", "getOpenGuardianNotice", "getUserMutedNotice"],"reqId":"123456789"}')while True:ws.send("ping")time.sleep(10)thread.start_new_thread(run, ())if __name__ == "__main__":room_id = 521000app_id = 'xxxxxxxxxxxxxxxx'secret = 'xxxxxxxxxxxxxxxxxxx'sign = get_sign(room_id,app_id,secret)print(sign.decode())websocket.enableTrace(True)ws = websocket.WebSocketApp("ws://ws-apiext.huya.com/index.html?do=comm&roomId="+str(room_id)+"&appId="+app_id+"&iat="+str(int(time.time()))+"&sToken="+sign.decode(),on_message=on_message,on_error=on_error,on_close=on_close)ws.on_open = on_openws.run_forever()
后续会更新直播间详情的信息爬取。
注:
此博客纯手工,如有和其他博主的博客雷同或涉及到侵权,请麻烦联系一下我。