当前位置:首页 > 知识

如何爬取网站视频

直接说结论:爬取网站视频,何爬九成情况下卡在的取网不是代码,而是站视视频被切成了几百个TS分片,你得先把它们拼起来。何爬

我拿一个常见场景举例。取网某在线教育平台,站视课程视频用的何爬是HLS协议,打开开发者工具切到Network,取网过滤.m3u8,站视能看到一个播放列表文件。何爬里面每一行指向一个.ts分片,取网每个分片几秒钟。站视你要做的何爬不是“下载视频”,而是取网把列表里的分片挨个拉下来,再按顺序合并成mp4。站视听起来简单,实际动手会碰到几个坑。

第一个坑是请求头。直接拿requests去get那个m3u8地址,返回403。服务器检查Referer和User-Agent。你得把浏览器里复制过来的请求头原样带上,尤其是Referer,通常就是视频所在页面地址。漏掉它,连列表都拿不到。

第二个坑是加密。有些m3u8文件里带#EXT-X-KEY,后面跟一个key的URI。分片是AES-128加密过的。你得先下载这个key,再用它解密每个ts分片。Python里用Crypto.Cipher就能做,但key的获取同样要带对请求头,而且key可能有时效,下载慢了就失效。

第三个坑是并发。一个两小时的课程,分片可能上千个。单线程逐个下载,速度慢得让人想砸键盘。用concurrent.futures开10个线程同时拉,速度快很多。但别开太大,有些服务器会限流,返回429。我一般设8到12个线程,稳定又够快。

合并分片更简单,直接用ffmpeg。把所有ts文件按顺序写进一个txt,然后ffmpeg -f concat -safe 0 -i list.txt -c copy output.mp4。注意-c copy,别重新编码,不然等半天。

还有一种情况是视频没有分片,直接一个mp4链接。这种反而好办,用yt-dlp或者you-get一条命令搞定。但很多网站会动态生成链接,带token和过期时间。你从Network里复制的链接,过几分钟就失效。这时候得分析页面JS,找到生成链接的逻辑,或者用Selenium模拟点击播放,等视频加载后再抓请求。

说个具体案例。有个朋友想批量下载某网站的视频,链接形如https://example.com/video/12345。页面里嵌了一个iframe,真正的播放器在另一个域名。他一开始直接爬iframe的src,拿到的是个空壳。后来发现播放器初始化时会发一个XHR请求,返回一个JSON,里面才有m3u8地址。这个JSON请求带了签名参数,签名算法在混淆过的JS里。他花了两个晚上反混淆,才把签名逻辑扒出来。值不值得?看需求。如果只是偶尔下几个,手动复制m3u8用工具下就行。要批量,就得啃JS。

法律边界得提一句。爬自己买的课程视频,和爬别人付费内容再传播,性质完全不同。前者可能只是违反平台服务条款,后者直接侵权。我见过有人爬了某平台整套课程挂到淘宝卖,后来收到律师函。技术本身中立,用在哪得自己想清楚。

工具选择上,yt-dlp支持一千多个网站,能自动处理m3u8和加密。先试它,不行再自己写。自己写的话,requests加ffmpeg基本够用。遇到Cloudflare盾,加个cloudscraper库。遇到JS渲染,上playwright。别一上来就搞分布式爬虫,大部分场景用不上。

最后说个观察。很多人卡在“下载”这一步,其实真正的难点在“找到正确的请求”。开发者工具里请求几百个,哪个才是视频流?我的习惯是打开Network,勾选“Media”过滤,然后刷新页面点播放。出现的第一个媒体请求,八成就是。如果没出现,就搜.m3u8或.mp4。这比看代码猜快得多。

分享到: