Python逆向爬虫入门教程:斗鱼直播视频数据加密参数逆向解析

Python逆向爬虫入门教程:斗鱼直播视频数据加密参数逆向解析
最新回答
为你唱起小乌龟

2026-05-31 16:15:12

Python逆向爬取斗鱼直播视频数据需完成数据包分析、加密参数逆向解析及代码实现,核心流程包括环境准备、抓包定位数据接口、分析sign加密逻辑、模拟请求并解析响应数据,最终实现视频流下载。 以下是详细步骤:

一、环境与工具准备
  • 开发环境:Python 3.10 + PyCharm(代码编辑) + Node.js(辅助JS调试)。
  • 依赖模块:

    requests:发送HTTP请求。

    execjs:执行JavaScript代码(用于本地调试加密逻辑)。

    re:正则表达式解析数据。

  • 辅助工具:浏览器开发者工具(F12)用于抓包分析。
二、数据来源分析
  1. 目标网站与数据以斗鱼直播某视频页为例(如

    https://douyu.com/show/Xqeo74DPDVe7xywG
    ),需采集视频的m3u8流媒体链接。

  2. 抓包定位接口

    打开开发者工具 → Network(网络)→ 刷新页面 → 过滤 m3u8 或视频相关关键字。

    找到关键接口:

    https://v.douyu.com/wgapi/vodnc/front/stream/getStreamUrlWeb
    ,该接口返回视频的m3u8地址及加密参数(如 sign)。

三、sign加密参数逆向分析
  1. 定位加密位置

    在开发者工具的 Sources(源代码)面板中搜索 sign,找到生成该参数的JS文件。

    通过断点调试(如 debugger 语句或手动打断点)分析函数调用链,确定加密逻辑所在的函数。

  2. 本地调试JS代码

    复制加密函数到本地JS文件,使用Node.js或浏览器控制台调试。

    常见问题:直接复制的JS可能缺失依赖(如全局变量、其他函数),需补全环境或模拟上下文。

    示例:若加密函数依赖 window.crypto,需在Node.js中引入 crypto 模块替代。

  3. 解析加密逻辑

    假设 sign 由时间戳、固定密钥和请求参数通过MD5生成,代码可能如下:

    function generateSign(params) { const timestamp = Date.now(); const secret = "fixed_secret_key"; const rawStr = `${params.roomId}_${timestamp}_${secret}`; return CryptoJS.MD5(rawStr).toString(); // 需引入CryptoJS库}

    在Python中复现此逻辑可使用 hashlib:

    import hashlibimport timedef generate_sign(room_id, secret="fixed_secret_key"): timestamp = str(int(time.time())) raw_str = f"{room_id}_{timestamp}_{secret}" return hashlib.md5(raw_str.encode()).hexdigest()
四、代码实现步骤
  1. 模拟请求头

    从抓包中复制请求头(如 Cookie、User-Agent、Referer),构建字典:

    headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...", "Referer": "
    https://douyu.com/show/Xqeo74DPDVe7xywG"
    , "Cookie": "your_cookie_here"}
  2. 发送请求并获取数据

    使用 requests.post 发送请求,传递表单数据(如 room_id)和生成的 sign:

    import requestsurl = "
    https://v.douyu.com/wgapi/vodnc/front/stream/getStreamUrlWeb"params
    = { "room_id": "Xqeo74DPDVe7xywG", "sign": generate_sign("Xqeo74DPDVe7xywG") # 调用加密函数}response = requests.post(url, headers=headers, data=params)data = response.json()
  3. 解析m3u8链接

    从响应中提取 m3u8_url:

    m3u8_url = data["data"]["url"] # 根据实际响应结构调整
  4. 下载视频流

    直接请求m3u8链接获取视频片段列表,或使用 ffmpeg 合并下载:

    # 示例:保存m3u8文件(实际需下载所有.ts片段)with open("video.m3u8", "w") as f: f.write(requests.get(m3u8_url).text)
  5. 批量下载优化

    遍历多个 room_id,循环调用上述流程。

    使用多线程/异步请求加速下载(如 concurrent.futures 或 aiohttp)。

五、关键注意事项
  • 反爬机制:斗鱼可能对频繁请求封禁IP,需控制请求频率或使用代理。
  • 加密动态更新:若 sign 生成逻辑变更,需重新分析JS代码。
  • 法律合规:确保爬取行为符合目标网站的使用条款,避免侵犯版权。
六、完整代码示例import requestsimport hashlibimport timedef generate_sign(room_id, secret="fixed_secret_key"): timestamp = str(int(time.time())) raw_str = f"{room_id}_{timestamp}_{secret}" return hashlib.md5(raw_str.encode()).hexdigest()def get_m3u8_url(room_id): url = "
https://v.douyu.com/wgapi/vodnc/front/stream/getStreamUrlWeb"
headers = { "User-Agent": "Mozilla/5.0", "Referer": f"
https://douyu.com/show/
{room_id}" } params = { "room_id": room_id, "sign": generate_sign(room_id) } response = requests.post(url, headers=headers, data=params) return response.json().get("data", {}).get("url")# 示例:获取并下载视频room_id = "Xqeo74DPDVe7xywG"m3u8_url = get_m3u8_url(room_id)print(f"M3U8 URL: {m3u8_url}")# 实际下载需进一步解析.ts片段并合并

通过以上步骤,可完成斗鱼直播视频数据的逆向爬取。如需进一步优化(如自动下载所有片段),可结合 ffmpeg 或第三方库(如 pycryptodome 处理更复杂的加密)。