you-get 一个很强的视频地址抓取工具

来源:https://github.com/soimort/you-get 

出自于 Mort Yao 大神之手:http://www.geekgrade.com/geeksheet/soimort/blogs

前言(废话):

  前段时间,我因公司需求。所以要去研究如何拿到视屏的播放地址。一般普通的网站的视屏播放地址还是很好拿到的。但是对于优酷,腾讯这样的大型视屏资源站就很难拿到视屏资源了。普通的网站你通过网页就可以直接抓取到视屏的播放地址。但是这些大型就不行,这些网站都是做了防盗链的。就拿优酷来讲,首先他用了自己的SWF播放器,然后服务器会异步加载一段参数到页面播放器上去。播放器内部会对这些参数进行一个解析,然后获取到视频的播放地址。这个解析过程是比较复杂的。

  最开始我用fiddler4去抓包,还是能够抓到很多有用信息的。最开始想用逆向JS去做,但是后来发现它的东西好像和JS关系不太大,然后我又用jsop去抓关键代码,发现,他的视屏信息是通过异步加载的,表示jsoup抓不到,后来仔细观察发现,他的请求一本都是SWF播放器发出来的,没办法,只能把他的SWF抓下来,做了一个反编译后:(如果只是简单的网页套用的话,可以用它的swf然后去抓网页上name="flashvars" 段的value,然后把这段value发给swf后就能播放了。)

  这边就是主要的东西。

大概知道优酷的大概加密方式就是

  k.youku.com/player/getFlvPath+"/sid/"+$sid+"_"+No+"/st/"+thisVideoType+"/fileid/"+id

  大概就是这个格式 sid 就是securityId 然后加上No(编号)然后后面的 fileId也是经过一系列加密的,并不是简单的ID。一般是会有一个token  ,K ,ep 参数是比较重要的参数 最后拿这个地址你只是获取到了一串能够获取播放地址的JSON

[{"fileid":"0300080100579F87DDDF300157E54E465E9572-D357-57B7-15CA-646DEC5748A9.mp4","server":"http://117.41.231.17/youku/696AF5871C487D59853F424D/0300080100579F87DDDF300157E54E465E9572-D357-57B7-15CA-646DEC5748A9.mp4"}]

  就如上面这个一样,虽然server能够获取到视频的地址,但是/youku/后面的那串乱码是一个SEED加密。也就是说没多少个小时就会变一次,也就是不可能一次拿到一个永远不变的地址的。

  优酷的视频下载全是走的客户端,也就是说网页端想要抓取地址,普通的方法是行不通的。后来我对客户端进行一个数据抓包,然后惊奇的发现TMD根本抓不到任何有用信息,只能无奈的感叹这客户端太尼玛屌了。每次我点击下载新视频后再看看抓包信息,空空如也像什么也没发生过。没办反只能走反编译的路了。。(反编译工具免费版只能看,,不能复制更别说调试了。。、。。我操。。。)

      扯了这么多,现在进入正题了。you-get 是一个强大的抓取视频的工具,原理就是上面的swf反编译后抓取了加密方式,然后对网页请求进行一个解析,然后从视屏站服务器中骗取地址出来。

     首先这个语言是基于Python 的 先去官方下载最新的(至少3.0以上)的版本,因为这个版本自带pip3.下好后配好环境

     这边我就不多说了:http://www.jianshu.com/p/a3f8df948395

     然后打开cmd命令 输入 

pip3 install --upgrade you-get

     来获取 you-get 获取成功后基本的使用方法上面链接有。

     接下来就是关键了。

     如果你是只想获取地址的话可以在前面 加  命令

--json

  

you-get --json  youwannaURL

  即可获取到地址

通过pip3安装的东西一般放在 你的Python文件夹/Lib/site-packages/  下

  extractor.py 是main 层后的 功能能层。 可以进去看看 有很多方法 ,比如

 

you-get  URL这种不带参数的话 就会执行这个download 的第一个if 的else语句 直接下载视频。如果有了 --json 参数的话,就是执行的这个if

 下载的功能在 common.py里面

可以向我这样加一段来输出看。或者用return阻断下载,。

回到输出json这边来在json_output.py 下

可以向我这样,选取自己需要的字段,然后用文件的形式把它输出。皆大欢喜,拿到了地址了。

更多想要的功能可以自己改代码~

 

posted @ 2016-08-04 17:05  Mischief.思喆  阅读(...)  评论(...编辑  收藏