2026-05-31 16:15:12
Python逆向爬取斗鱼直播视频数据需完成数据包分析、加密参数逆向解析及代码实现,核心流程包括环境准备、抓包定位数据接口、分析sign加密逻辑、模拟请求并解析响应数据,最终实现视频流下载。 以下是详细步骤:
一、环境与工具准备requests:发送HTTP请求。
execjs:执行JavaScript代码(用于本地调试加密逻辑)。
re:正则表达式解析数据。
目标网站与数据以斗鱼直播某视频页为例(如
抓包定位接口
打开开发者工具 → Network(网络)→ 刷新页面 → 过滤 m3u8 或视频相关关键字。
找到关键接口:
定位加密位置
在开发者工具的 Sources(源代码)面板中搜索 sign,找到生成该参数的JS文件。
通过断点调试(如 debugger 语句或手动打断点)分析函数调用链,确定加密逻辑所在的函数。
本地调试JS代码
复制加密函数到本地JS文件,使用Node.js或浏览器控制台调试。
常见问题:直接复制的JS可能缺失依赖(如全局变量、其他函数),需补全环境或模拟上下文。
示例:若加密函数依赖 window.crypto,需在Node.js中引入 crypto 模块替代。
解析加密逻辑
假设 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()模拟请求头
从抓包中复制请求头(如 Cookie、User-Agent、Referer),构建字典:
headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36...", "Referer": "发送请求并获取数据
使用 requests.post 发送请求,传递表单数据(如 room_id)和生成的 sign:
import requestsurl = "解析m3u8链接
从响应中提取 m3u8_url:
m3u8_url = data["data"]["url"] # 根据实际响应结构调整下载视频流
直接请求m3u8链接获取视频片段列表,或使用 ffmpeg 合并下载:
# 示例:保存m3u8文件(实际需下载所有.ts片段)with open("video.m3u8", "w") as f: f.write(requests.get(m3u8_url).text)批量下载优化
遍历多个 room_id,循环调用上述流程。
使用多线程/异步请求加速下载(如 concurrent.futures 或 aiohttp)。
通过以上步骤,可完成斗鱼直播视频数据的逆向爬取。如需进一步优化(如自动下载所有片段),可结合 ffmpeg 或第三方库(如 pycryptodome 处理更复杂的加密)。