六间房的不清楚,其他几家的直播弹幕我记得是 socket,没法爬吧,你得截个包看看怎么建立连接。
我写过几个直播平台的弹幕爬虫。核心思路其实都差不多:找到弹幕的WebSocket连接或者HTTP流接口,然后解析数据包。
以某牙直播为例,用WebSocket的代码框架大概长这样:
import websocket
import json
import threading
import time
class DanmuCrawler:
def __init__(self, room_id):
self.room_id = room_id
self.ws_url = f"wss://www.huya.com/{room_id}"
self.ws = None
def on_message(self, ws, message):
# 这里解析弹幕消息
try:
data = json.loads(message)
if data.get('type') == 'chatmsg': # 根据实际协议调整
nickname = data.get('nn', '')
content = data.get('txt', '')
print(f"{nickname}: {content}")
except:
pass # 有些消息不是JSON格式
def on_error(self, ws, error):
print(f"Error: {error}")
def on_close(self, ws, close_status_code, close_msg):
print("Connection closed")
def on_open(self, ws):
# 发送认证/心跳包
auth_msg = json.dumps({
'type': 'auth',
'roomid': self.room_id
})
ws.send(auth_msg)
# 启动心跳线程
def heartbeat():
while True:
time.sleep(30)
ws.send(json.dumps({'type': 'ping'}))
threading.Thread(target=heartbeat, daemon=True).start()
def run(self):
self.ws = websocket.WebSocketApp(
self.ws_url,
on_open=self.on_open,
on_message=self.on_message,
on_error=self.on_error,
on_close=self.on_close
)
self.ws.run_forever()
if __name__ == "__main__":
crawler = DanmuCrawler("123456") # 房间号
crawler.run()
几个关键点:
- 不同平台协议不一样,有的用WebSocket,有的用HTTP长轮询
- 一般需要先发认证包,然后定时发心跳包保持连接
- 数据格式可能是JSON、protobuf或者自定义二进制格式
- 有些平台会加密,需要逆向JS找解密算法
建议先用浏览器开发者工具抓包,看看具体的数据流格式再写代码。
总结:先抓包分析协议,再模拟连接。
点进去看了一下,结果发现是 HTTP 的请求。
[]( https://i.loli.net/2018/04/18/5ad638b1cc0a8.png)
github 上不少,记得有些是模拟发包请求弹幕的
是的,socket 这块不太懂,求教一下👍
没有这个平台的,有点麻烦
一般弹幕都是 websocket 和 socket 你要抓包看请求 找规律,然后想办法找到 key
抓包后看起来有点乱,看不太懂,所以没找到 key,求指导一二
我记得好几年前 b 站是可以打包下载弹幕的,不知道这功能现在还有没有
websocket 或者自己再 socket 上封装的协议。
https://github.com/zhao94254/rebuilt 这个是我用 go 写的,你可以参考下
pip install danmu
这个好像只有斗鱼的还可以运行
抓包用来看发包顺序,key 和加解密算法就需要你反编译一些官方的东西来找了,比如安卓、flash 等这就不深说了
有些平台是有开发协议的 ,不用爬,我记得比如熊猫直接有 API,你去官网看看.
模拟发包,然后弹幕出来然后过滤。
我记得应该没有,没有找到
弹幕的礼物数量可以取到吗?我没找到,求解
可以。有一个字段是礼物的。

