python爬取虎牙弹幕礼物数据

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对应的参数

其实官方文档已经告诉你了,怎么建立链接了。下面我一步一步根据官方文档走,可能是因为讲的太详细了,本人踩了一些坑。

第一步:

python爬取虎牙弹幕礼物数据_第1张图片
这里就说明了,需要用到jwt的验证。这里要注意的是Header,是默认的,根据你使用的jwt的方式默认的。不需要放在signature中。

第二步:

python爬取虎牙弹幕礼物数据_第2张图片
调通字段: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爬取虎牙弹幕礼物数据_第3张图片
根据上一步,把所有对应的参数都获取到了。然后通过python的webscoket链接的方式,先建立链接。

获取数据和保持心跳

python爬取虎牙弹幕礼物数据_第4张图片
这一步发送的是你想要获取到的数据,里面包含了很多数据。具体的数据详情见虎牙开发者官方文档。
再下一步是保持心跳。保持心跳的方式很简单,就是建立连接后,保持固定的时间,发送ping字符串即可。

附上完整代码

import jwt
import websocket

try:
    import thread
except ImportError:
    import _thread as thread
import json
import time

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

def 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 = 521000
    app_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_open
    ws.run_forever()

后续会更新直播间详情的信息爬取。

注:

此博客纯手工,如有和其他博主的博客雷同或涉及到侵权,请麻烦联系一下我。

你可能感兴趣的:(python,爬虫)