Python小白写爬虫爬B站直播弹幕,F12后找不到msg,求助

用的手机热点上网速度大概 0.5Mbps 不到,很卡,不知道是不是因为网速的原因还是 b 站改了? 浏览器是 chrome 操作系统为 window7 64


Python小白写爬虫爬B站直播弹幕,F12后找不到msg,求助
10 回复

用网页元素找到了,接着打算仿照罗攀的那本书的例子做。但是好奇,为什么我的浏览器可以一直接收弹幕,爬虫就用 timesleep…有什么好的理解吗


我明白你的问题。B站直播弹幕现在走的是WebSocket协议,F12里直接搜msg是找不到的。你得在Network标签里找WebSocket连接。

关键点就两步:

  1. 在F12的Network里刷新页面,筛选WSWebSocket,找到弹幕的WebSocket连接(通常是sub开头的)。
  2. Messages标签里看实时数据流,弹幕内容就在里面,格式通常是JSON。

给你个能跑的Python例子,用websockets库。先装库:pip install websockets

import asyncio
import websockets
import json
import zlib

async def listen_to_bilibili():
    # 这是B站直播弹幕的WebSocket地址,room_id换成你要的房间号
    room_id = 你的房间号
    uri = f"wss://broadcastlv.chat.bilibili.com/sub"
    
    async with websockets.connect(uri) as websocket:
        # 第一步:发送认证包
        auth_data = json.dumps({
            "uid": 0,
            "roomid": room_id,
            "protover": 2,
            "platform": "web",
            "clientver": "1.14.3",
            "type": 2
        }).encode('utf-8')
        
        # 包结构:头部(16字节) + 数据
        header = bytearray(16)
        # 数据长度
        header[0:4] = (len(auth_data) + 16).to_bytes(4, 'big')
        # 头部长度固定16
        header[4:6] = (16).to_bytes(2, 'big')
        # 协议版本,2表示用zlib压缩
        header[6:8] = (2).to_bytes(2, 'big')
        # 操作码,7表示认证
        header[8:12] = (7).to_bytes(4, 'big')
        
        await websocket.send(header + auth_data)
        
        # 第二步:开始心跳,保持连接
        heartbeat_data = b''
        heartbeat_header = bytearray(16)
        heartbeat_header[0:4] = (16).to_bytes(4, 'big')
        heartbeat_header[4:6] = (16).to_bytes(2, 'big')
        heartbeat_header[6:8] = (1).to_bytes(2, 'big')
        heartbeat_header[8:12] = (2).to_bytes(4, 'big')
        
        # 每30秒发一次心跳
        async def send_heartbeat():
            while True:
                await asyncio.sleep(30)
                await websocket.send(heartbeat_header + heartbeat_data)
        
        asyncio.create_task(send_heartbeat())
        
        # 第三步:循环接收消息
        while True:
            message = await websocket.recv()
            
            # 解析消息头
            packet_len = int.from_bytes(message[0:4], 'big')
            header_len = int.from_bytes(message[4:6], 'big')
            ver = int.from_bytes(message[6:8], 'big')
            op = int.from_bytes(message[8:12], 'big')
            
            # 处理数据部分
            data = message[header_len:packet_len]
            
            if op == 5:  # 操作码5是实际消息
                if ver == 2:  # zlib压缩
                    data = zlib.decompress(data)
                    # 压缩包可能包含多个消息,需要循环处理
                    offset = 0
                    while offset < len(data):
                        sub_len = int.from_bytes(data[offset:offset+4], 'big')
                        sub_body = data[offset+16:offset+sub_len]
                        offset += sub_len
                        try:
                            msg_json = json.loads(sub_body.decode('utf-8', 'ignore'))
                            if msg_json['cmd'] == 'DANMU_MSG':
                                # 这里就是你要的弹幕
                                uname = msg_json['info'][2][1]
                                text = msg_json['info'][1]
                                print(f"{uname}: {text}")
                        except:
                            pass
                else:  # 未压缩
                    try:
                        msg_json = json.loads(data.decode('utf-8', 'ignore'))
                        if msg_json['cmd'] == 'DANMU_MSG':
                            uname = msg_json['info'][2][1]
                            text = msg_json['info'][1]
                            print(f"{uname}: {text}")
                    except:
                        pass

# 运行
asyncio.run(listen_to_bilibili())

把代码里的你的房间号换成实际房间ID(浏览器地址栏里的数字)。运行后就能看到实时弹幕了。

总结:B站弹幕走WebSocket,得按它的协议发认证包和心跳包才能收到数据。

直播弹幕不是 websocket 么…

弹幕一般是 websocket 吧,,在 WS 那一栏里面看下

直播弹幕怎么说都是 SSE 更好吧,真用 WebSocket 做吗?而且 SSE 防爬虫也更舒服,很多 python 爬虫并不会做 SSE 适配( select/epoll ),消耗资源比服务器还大。

哥哥们 msg 文件现在还能找到吗 想实现一个实时和弹幕互动的程序

发工单,请求 API 接口
明明 Twitch 接口那么好就很好玩,饥荒联机观众能够通过 Twitch 发评论给主播添麻烦。
这么好玩的东西为什么没有?

b 站以前有弹幕接口,后来被人玩坏了就关闭了。内部有,但是没开放。
另外,我之前也考虑过爬取 b 站直播的弹幕和人数,后来发现是通过 websocket 来通信的,这个就有点头疼了。建议用 charles 抓 websocket 接口试试看。

github 搜索 “wss://broadcastlv.chat.bilibili.com/sub” 能找到不少参考项目
https://github.com/search?l=Python&q=wss%3A%2F%2Fbroadcastlv.chat.bilibili.com%2Fsub&type=Code

具体的原理参考 https://wuyin.io/2018/03/31/bilibili-live-crawler-and-auto-edit-recording/
大致就是连接 websocket 发一段带着房间号的 json 然后就能收到弹幕和礼物的信息了
30 秒一次心跳包


1 爬取弹幕中股票代码 按时间序列保存在数据库
2 九点二十五开始统计投票 九点三十结束 实时显示前八票数 按照投票数量比得到前八股票代码比例 买对应股票并建立对应比例仓位 持有十五分钟以后清仓
3 重复 2 到 11 点 30 停止,一点到三点继续

麻烦问下,做个这样的程序大概需要多少钱啊

回到顶部