一、先厘清:什么叫“网页抓取直播”?
很多人把“录屏”“扒流”“嗅探”混为一谈,结果一步踏错整站被投诉。 **网页抓取直播**特指用自动化程序,从目标网页提取出直播流媒体地址(m3u8、flv、rtmp),再转存或转播到自己服务器的过程。 它与普通录屏最大区别是:不经过渲染,直接拿到原生数据,画质更高、带宽更省,但门槛也更高。
二、技术拆解:直播流到底藏在哪?
1. 浏览器调试面板:最直白的入口
F12→Network→筛选“m3u8”或“.flv”,刷新页面,地址栏立刻现身。 自问:为什么有时刷新后地址失效? 自答:因为平台给的是**限时token**,超过3600秒就过期,且二次请求必须带相同Referer、Cookie,甚至User-Agent。
2. 逆向JS:破解“加密签名”
头部平台会把真实地址拆成三段:host+path+auth_key,auth_key由JS函数根据时间戳、随机数、固定盐值动态生成。 步骤: ① 下断点找到sign()函数; ② 把整段JS抠出来,用Node补全局环境; ③ 用Python的execjs或PyMiniRacer调用,实时算签名。 **亮点**:一旦算法写死,后续几个月都能直接生成可用地址,无需再抓包。
3. 协议层嗅探:应对WebRTC或QUIC
新版Chrome默认把直播流封装在UDP+QUIC,调试面板里看不到传统m3u8。 工具: - Wireshark 4.0以上支持QUIC解密,前提是你能导出服务器的TLS密钥; - mitmproxy+reverse proxy模式,把UDP转成TCP,再打印明文。 自问:没有密钥怎么办? 自答:只能HOOK Chrome的SSL_write,把内存里的slice直接dump出来,技术门槛陡增,且需要本地管理员权限。
三、代码实战:30行Python拿到稳定源
以下脚本以某体育台为例,演示“拿地址→验活→落盘”完整链路,**去掉第三方依赖,仅内置库即可跑通**。
import requests, time, subprocess, re
def get_live_url(room_id):
api = f'https://api.xxx.com/room/{room_id}/play'
headers = {
'User-Agent': 'Mozilla/5.0',
'Referer': 'https://www.xxx.com'
}
resp = requests.get(api, headers=headers, timeout=5).json()
m3u8 = resp['data']['src']
# 二次校验,防止返回假地址
if '#EXTM3U' not in requests.get(m3u8, headers=headers, timeout=5).text:
raise ValueError('地址已失效')
return m3u8
def dump_stream(m3u8, duration=600):
ts = int(time.time())
outfile = f'stream_{ts}.mp4'
cmd = [
'ffmpeg',
'-i', m3u8,
'-c', 'copy',
'-t', str(duration),
'-y', outfile
]
subprocess.run(cmd, check=True)
return outfile
if __name__ == '__main__':
url = get_live_url('123456')
dump_stream(url)
**注意**:
- 把ffmpeg路径写进系统PATH,否则subprocess会抛FileNotFound;
- 若平台强制HTTPS链,需要额外给requests加verify=False,并屏蔽InsecureRequestWarning。
四、合规红线:拿到流之后能干嘛?
1. 个人存档:最窄的“避风港”
中国《著作权法》第24条允许“为个人学习、研究或者欣赏,使用他人已经发表的作品”,但**必须“不得影响该作品的正常使用,也不得不合理地损害著作权人的合法利益”**。 翻译成人话:你录一场球赛自己看,不传播、不牟利,平台懒得管;一旦把文件扔百度网盘并生成分享链接,就超出“个人”范畴。
2. 二次剪辑:踩到“改编权”地雷
把直播高光剪成三分钟短视频,加字幕、配BGM,再上传到抖音,看似原创,其实同时侵犯**复制权、改编权、信息网络传播权**。 **亮点**:即便注明“素材来自网络”,也不等于“合理使用”,平台算法照样会下架。
3. 转播获利:直接触犯刑法
2021年江苏判例:被告人通过“扒流”方式获取某电竞赛事信号,再在自己网站出售“VIP观看权限”,半年牟利120万元,最终被判**侵犯著作权罪**,有期徒刑三年缓刑四年,并处罚金八十万。 自问:我只是嵌入iframe,流量还是回源到官方,也算侵权吗? 自答:如果去除对方广告、加水印、插自己广告,**依然构成“实质性替代”**,权利人可以主张不正当竞争。
五、降低风险的三种合规姿势
- **拿到书面授权**:哪怕是非独家,也至少覆盖“信息网络传播权+转授权”,期限、地域、终端要写清。
- **用官方SDK嵌入**:平台提供的iframe或JS,广告、统计都不动,自己只赚页面流量差价,被投诉时下架快,责任轻。
- **走CDN回源白名单**:和版权方CDN签回源协议,IP加白,日志共享,既保证画质,又在技术上形成“同源分发”,避免“盗链”嫌疑。
六、常见坑点答疑
Q:为什么我用FFmpeg下载的m3u8播到一半就卡? A:平台做了**分片限时**,每个ts只有30秒有效期,FFmpeg默认单线程,下载速度一旦低于播放速度就会断流。 解决:加`-timeout 5000000 -flags +global_header -movflags +faststart`,并开`-threads 4`并行下载。
Q:抓到的地址在VLC能播,放到网页video标签就403? A:因为浏览器会带**Origin**,而VLC不会。平台做了跨域校验,非白名单Referer直接返回403。 解决:前端通过Service Worker拦截请求,把Origin头删掉,或让后端做反向代理。
Q:如何批量检测几百个房间是否开播? A:用HEAD请求去扫m3u8,返回200且Content-Type包含`application/vnd.apple.mpegurl`才算真开播。 **亮点**:并发控制在64线程以内,再高开销会触发平台WAF,直接被封IP段。
七、进阶:把“抓取”升级成“监控”
如果只是想监控主播是否上线,无需整段下载,只需**定时请求房间状态接口**,字段里通常有`{"live_status":1}`。 把状态变更推送到飞书群: ① 用Python写个while True循环,间隔30秒轮询; ② 状态从0变1,调用飞书OpenAPI发富文本消息,附带房间链接; ③ 部署在阿里云函数计算,按量付费,每月1万次调用不到2元。 **好处**:不碰视频流,版权风险降到最低,还能实时提醒。
八、写在最后的行业暗语
“抓流”圈子流行一句话:**技术永远跑在法务前面,但赔偿永远跑在盈利后面**。 你今天破解的算法,明天平台只要改一行盐值就失效;可一旦留下日志、把柄,对方律师函能追你三年。 **真正老鸟的做法**是:先谈商务,再谈技术;能买版权就不扒流;实在要研究,也只在隔离沙箱里做离线实验,生产环境绝不落地。 记住,**直播信号不是公开水域,而是私人鱼塘**,下水前先看有没有“禁止垂钓”的牌子,再决定要不要撒网。