简介
各个视频网站的视频本质就是下载 FLV文件来播放,无论它怎么隐藏下载地址,做多少次跳转,搞什么身份认证,做多少文件分片,最后都是要下载一个flv文件。
所以视频下载软件只需要精确地模拟网站上那个flash的行为就可以把FLV下载下来。
FLV是一种很简单的视频封装格式,去掉封包,里面就是h264 aac等媒体的裸流,很容易重新打包成其他格式比如mp4。
写一个也不难。
首先用网络抓包工具,分析视频网站的请求,找出下载flash 文件的地址。
用Fiddler 或者 wireshark 可以抓包。
先把flash本身下载下来。
然后,找个反编译 flash的工具,有很多这种工具,哪个好用我也不知道,没用过。
反编译后看看里面的脚本,配合抓包工具,搞清楚它是怎么做下载身份验证的。
最后,一点点模拟flash的行为去下载flv,你发的请求包如果和视频网站的完全一样,服务器就不知道你是非法的终端了。
做这种软件最麻烦不是做出第一版,而是持续的维护升级,视频网站也很讨厌盗链的,总会不停变化验证方法,你要不停地跟着改,很累的。
而且你会把视频网站的开发搞的也很累,所以你最好不要让他们找出你住哪里,否则,嘿嘿。
大家都是码农,不要互相挤兑,最后谁都没好处,有时间不如去干点儿有建设性的事情。
B站视频下载器示例
想要对B站进行爬虫,首先要准备好技术手段和相关工具,对B站的网站结构和数据流向进行一些分析,进行可行性的调研
首先打开B站任意一个视频,可以看到地址都是这样的格式:

然后用Fidder工具,分析一下网页,可以看到有如下一些资源

其中找到一个特殊的资源:
https://interface.bilibili.com/playurl?cid=18266854&appkey=84956560bc028eb7&otype=json&type=&quality=3&sign=dd0d7342203ee42485de7f12fb5a9ebe
返回的response为:
{
"from": "local",
"result": "suee",
"format": "flv",
"timelength": 250301,
"accept_format": "flv,hdmp4,mp4",
"accept_quality": [3, 2, 1],
"seek_param": "start",
"seek_type": "offset",
"durl": [{
"order": 1,
"length": 250301,
"size": 60158020,
"url": "http://cn-jsyz-dx-v-07.acgvideo.com/vg3/1/cf/18266854-1.flv?expires=1496749500&platform=pc&ssig=MKCYO7cUmTNlM8_WXdBhsg&oi=2061529490&nfa=zn2OTN7O9p3rqnr0+3S2RQ==&dynamic=1&hfa=2063945584",
"backup_url": ["http://ws.acgvideo.com/c/26/18266854-1.flv?wsTime=1496749639&platform=pc&wsSecret2=881fb75631f4339a5ee3065bfdb32b5d&oi=2061529490&rate=1280", "http://ws.acgvideo.com/c/26/18266854-1-hd.mp4?wsTime=1496749639&platform=pc&wsSecret2=3bd45cca7a71a1ad4defa272e9b11243&oi=2061529490&rate=1280"]
}]
}
太好了,一下子就给了视频尺寸(length字段)和视频最终的下载地址(url字段),那么我们用浏览器打开一下这个URL看一下,可以成功下载!
请求分析碰到的困难
注意看这个URL可以发现,尾部有一个sign,说明做了客户端和服务端的签名验证,并不是很傻瓜的有直接通过AID或者CID关联的下载地址,分析进入到这一步后,我很快的就打了自己的脸,我曾在文章《关于.NET玩爬虫这些事》中说过,一切网站行为都可以分析出HTTP+Javascript来,只要分析得当,根本不需要用浏览器来进行爬虫模拟,但这尼玛B站鬼的Web结构(忍不住想骂人,典型的垃圾Python、PHP向的开发人员做出来的鬼东西,代码逻辑混乱、随便一看就是到处修补修改的痕迹,生成出来的HTML、JS的逻辑和层次毫无美感),看了2个小时,眼睛都看疼了,楞是没分析出签名方法,也许再看看会有结果,但是我等不及了,所以这时候祭出爬虫神器-无头浏览器
这里我选择了PhantomJS这个无头浏览器,具体的使用过程就不详述了,有兴趣可以到官网了解一下,写了如下分析代码

通过代码我们可以很清楚的看到,主要是两个目的,输出包含interface.bilibili.com的URL以及本次视频的标题
测试一下,确实可以得到URL和标题,这里有个要注意的是,B站默认是GB2312编码,所以PhantomJS要加一个参数,就是输出编码改为GB2312

到此为止,可以说完成了整个爬虫部分的调研,至少是有完整的可行性了。
爱奇艺视频下载可行性分析
分析爱奇艺 的过程:
爱奇艺的视频在 cache.m.iqiyi.com 里面
使用抓包工具发现:

优酷爱奇艺都是类似的,只不过有的是给分块的地址,如下:

F4V格式结尾的文件:(视频格式,可以合成mp4等其他视频文件):
F4V是Adobe公司为了迎接高清时代而推出继FLV格式后的支持H.264的流媒体格式。它和FLV主要的区别在于,FLV格式采用的是H263编码,而F4V则支持H.264编码的高清晰视频,码率最高可达50Mbps。
这个json数据中很多类似以f4v为后缀结尾的视频请求。
请求了一些网上的高人:
他说:“不过爱奇艺的别去搞,这个违法的,视频都是购买了版权的!”
我就放弃了这次调研。
我的初衷也只是为了避开爱奇艺的冗长的广告。