跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Python算法

Python 实时爬取斗鱼弹幕

基于 TCP 协议直连斗鱼弹幕服务器,无需账号密码即可建立长连接。核心流程包含登录握手、加入房间分组及定时心跳保活。代码实现采用多线程分别处理数据接收与心跳发送,利用正则解析返回报文提取昵称与文本。注意服务器协议可能更新,需根据实际返回调整匹配规则。

Ne0发布于 2019/1/22更新于 2026/9/1966 浏览
Python 实时爬取斗鱼弹幕

Python 实时爬取斗鱼弹幕

实现目标

输入斗鱼房间号,通过 TCP 协议实时获取并解析弹幕信息。

核心逻辑梳理

斗鱼开放了弹幕 API,直接对接服务器即可。整体流程其实并不复杂,主要涉及两个线程的协作:一个负责建立连接并接收数据,另一个负责定时发送心跳保持长连接。

1. 建立连接与握手

首先通过 TCP 连接到弹幕服务器(IP: openbarrage.douyutv.com, Port: 8601)。连接成功后需要完成两步握手:

  • 登录请求:发送格式为 type@=loginreq/roomid@=房间号/\0 的消息。这里不需要账号密码,只要知道房间号即可。
  • 加入分组:登录成功后,服务器会返回确认信息,此时需继续发送进入弹幕分组请求,格式为 type@=joingroup/rid@=房间号/gid@=-9999/\0。其中 gid 设为 -9999 代表海量弹幕模式。

此后服务器会持续推送消息流,除了普通弹幕外,还可能包含礼物、进场通知等,可以通过解析消息头中的 type 字段来过滤所需内容。

2. 心跳保活

TCP 长连接并非永久有效,为了防止服务器因超时断开,需要定期发送心跳包。心跳格式为 type@=keeplive/tick@=当前秒级时间戳/\0,建议每隔 45 秒左右发送一次。

代码实现

下面是一个完整的 Python 3 示例。为了保持代码健壮性,我将其拆分为连接、发送、接收和解析几个模块。注意,实际运行时请根据最新的服务器返回报文调整正则匹配规则。

# -*- coding:utf-8 -*-
import socket
import re
import time
import struct
import threading

# 全局 socket 对象
s = None

def connect():
    """建立 TCP 连接"""
    global s
    print('-----*-----DouYu_Spider-----*-----\n')
    host = socket.gethostbyname("openbarrage.douyutv.com")
    port = 8601
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.connect((host, port))

def send_msg(msg):
    """封装发送逻辑,处理长度头"""
    data_length = len(msg) + 8
    code = 689
    # 构造头部:长度 + 长度 + 类型码
    msgHead = struct.pack('<i', data_length) \
              + struct.pack('<i', data_length) + struct.pack('<i', code)
    s.send(msgHead)
    sent = 0
    while sent < len(msg):
        tn = s.send(msg[sent:])
        sent += tn

def danmu(room_id):
    """主接收线程:登录、入组、循环接收"""
    # 登录请求
    login = 'type@=loginreq/roomid@=%s/\0' % room_id
    login = login.encode('utf-8')
    send_msg(login)

    # 加入分组请求
    joingroup = 'type@=joingroup/rid@=%s/gid@=-9999/\0' % room_id
    joingroup = joingroup.encode('utf-8')
    send_msg(joingroup)

    while True:
        content = s.recv(1024)
        if judge_chatmsg(content):
            nickname = nick_name(content)
            chatmsg = chat_msg(content)
            print('%s : %s' % (nickname, chatmsg))
        else:
            pass

def keep_alive():
    """心跳线程:每 45 秒发送一次"""
    while True:
        msg = 'type@=keeplive/tick@=%s/\0' % str(int(time.time()))
        send_msg(msg)
        time.sleep(45)

def nick_name(content):
    """提取昵称"""
    pattern = re.compile(r'nn@=(.*)/txt@')
    try:
        return pattern.findall(content)[0]
    except IndexError:
        return ''

def chat_msg(content):
    """提取弹幕文本"""
    pattern = re.compile(r'txt@=(.*)/cid@')
    try:
        return pattern.findall(content)[0]
    except IndexError:
        return ''

def judge_chatmsg(content):
    """判断是否为弹幕消息"""
    pattern = re.compile(r'type@=(.*)/rid@')
    data_type = pattern.findall(content)
    try:
        return data_type[0] == 'chatmsg'
    except Exception as e:
        return False

if __name__ == '__main__':
    connect()
    t1 = threading.Thread(target=danmu, args=(2947432,))
    t2 = threading.Thread(target=keep_alive)
    t1.start()
    t2.start()

注意事项

斗鱼官方文档更新频率不高,实际返回的消息结构可能随版本迭代有所增加。上述代码仅提取了最基础的昵称和文本内容。如果遇到解析失败,建议先打印原始报文查看最新格式,再针对性地调整正则表达式。

目录

  1. Python 实时爬取斗鱼弹幕
  2. 实现目标
  3. 核心逻辑梳理
  4. 1. 建立连接与握手
  5. 2. 心跳保活
  6. 代码实现
  7. -- coding:utf-8 --
  8. 全局 socket 对象
  9. 注意事项

更多推荐文章

查看全部
  • OpenClaw 启动报错 gateway password missing 解决
  • Vue 自定义指令详解
  • C++ 工程师视角的 WebSocket 实时通信入门
  • OpenClaw 与 Ollama 本地部署指南
  • 云原生 Neo4j 图数据库从搭建到项目使用深度详解
  • Transformer 20 个常见面试问题解析:从基础到高级
  • 大语言模型提示词工程核心技巧与实践指南
  • OpenClaw 进阶教程:记忆系统、定时任务、多模型切换与子代理配置
  • Hexo 博客常用命令速查指南
  • Redis Hash 数据结构详解:C++ 实战与性能优化
  • C++手写AVL树:插入、旋转与自平衡验证
  • 宇树机器人g1二次开发:建图,定位,导航手把手教程(四)导航仿真部分:建完图之后打开仿真导航
  • C++ 多态详解:静态与动态多态及虚函数表原理
  • Linux 进程等待与程序替换详解:僵尸进程防治及 exec 实战
  • WebAssembly 逆向分析:反编译 Wasm 二进制并修改游戏数据
  • 基于腾讯云 HAI 与 DeepSeek 构建个人网页
  • FastGPT 结合 MCP 协议构建工具增强型 AI Agent
  • Python 入门基础与职业发展指南
  • 慈善管理系统数据可视化:基于SpringBoot与Web前端技术
  • Angular 应用 Chrome 调用高德地图 API 定位超时问题解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online