浏览器地址栏里敲下一串URL,代码回车,下载页面加载出来,网页视频开始播放。视频这时候你想把它存到本地,代码右键一看——没有“另存为视频”这个选项。下载多数人第一反应是网页去装个下载器,或者满世界找解析工具。视频其实不用那么麻烦,代码代码就能干这事,下载而且比你想象得简单得多。网页
拿最常见的视频m3u8格式来说。打开开发者工具,代码切到Network面板,下载刷新页面,网页过滤掉那些图片和CSS请求,你会看到一堆.ts结尾的文件在刷屏。这些就是视频被切成的碎片。你真正要抓的是那个.m3u8的索引文件,它记录了所有碎片的地址和顺序。用Python写个十来行的脚本,requests库拉取索引,再循环下载每个碎片,最后用ffmpeg拼起来,完事。整个过程不到三十行代码。
但别高兴太早。很多网站不会让你这么轻松。他们会在请求头里塞Referer和User-Agent,检测你是不是浏览器环境。这时候你需要把headers伪装得跟真实浏览器一模一样。还有的网站做了加密,m3u8文件里写的不是直接的.ts路径,而是经过AES加密的,密钥藏在另一个接口里。你得先找到那个key,然后在拼接时用openssl解密。麻烦是麻烦了点,但也没到无解的地步。
我记得有次帮朋友下载一个付费课程,他的账号只有观看权限没有下载权限。视频是分段加载的,每段大概十秒。我写了个脚本,自动滚动页面,每隔几秒截取一次当前播放的媒体流。用的是selenium控制浏览器,配合mitmproxy拦截响应。折腾了两个多小时,终于把整个课程的视频流全部抓下来了。虽然画质只有720p,但朋友已经很满意了。
你要是觉得写代码太麻烦,还有更取巧的办法。有些视频网站用的是blob协议,直接在浏览器内存里播放。这种情况下你可以监听MediaSource的sourceBuffer,在appendBuffer的时候把数据抽出来。用一段JavaScript插在控制台里就能实现,不需要任何外部工具。当然,这种方法的局限性也明显——你得在视频完全加载完之前就执行脚本,否则数据早就被清掉了。
说句实在话,大部分正规视频网站都有防爬机制,硬要破解可能违反用户协议。但如果你是下载自己购买的内容、或者抓取公开的公开课资源,这事情就纯粹是技术练习了。我见过有人为了下载一个五分钟的短视频,花了整整一天研究网站的加密逻辑,最后发现那个视频其实在另一个CDN节点上裸奔着。
代码这东西,很多时候就是一层窗户纸。你看着别人写的下载器觉得高大上,自己动手拆解一遍,发现核心逻辑无非就是“找到真实地址→模拟请求→保存文件”。难点从来不在代码本身,而在于你怎么定位那个真实地址。多试几次,抓包看多了,你自然会形成一种直觉——看到某个奇怪的接口返回,就知道它八成藏着视频流。