18

从此免费看 VIP 视频!用 Python 爬虫攻破 VIP 防线

 3 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzIxNzU1Nzk3OQ%3D%3D&%3Bmid=2247490337&%3Bidx=2&%3Bsn=031384c38a3586982cc627dbdf2ecf30
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

code小生  一个专注大前端领域的技术平台

公众号回复 Android 加入安卓技术群

作者:Jack-Cui

来源:https://github.com/Jack-Cherish/python-spider

一、实战背景

爱奇艺的VIP视频只有会员能看,普通用户只能看前6分钟。比如加勒比海盗5的URL: http://www.iqiyi.com/v_19rr7qhfg0.html#vfrm=19-9-0-1

f6Z3Ini.jpg!web

我们怎么免费看VIP视频呢?一个简单的方法,就是通过旋风视频VIP解析网站。URL:http://api.xfsub.com/

这个网站为我们提供了免费的视频解析,它的通用解析方式是:

http://api.xfsub. com / index .php?url=[播放地址或视频id]

比如,对于绣春刀这个电影,我们只需要在浏览器地址栏输入:

http://api.xfsub. com / index .php?url=http://www.iqiyi. com /v_19rr7qhfg0.html#vfrm= 19 - 9 - 0 - 1

这样,我们就可以在线观看这些VIP视频了:

qMzUNbF.jpg!web

但是这个网站只提供了在线解析视频的功能,没有提供下载接口,如果想把视频下载下来,我们就可以利用网络爬虫进行抓包,将视频下载下来。

二、实战升级

分析方法相同,我们使用Fiddler进行抓包:

nQryqqJ.jpg!web

我们可以看到,有用的请求并不多,我们逐条分析。我们先看第一个请求返回的信息。

YbAvqa3.jpg!web

可以看到第一个请求是GET请求,没有什么有用的信息,继续看下一条。

bUfaMfY.jpg!web

我们看到,第二条GET请求地址变了,并且在返回的信息中,我们看到,这个网页执行了一个POST请求。POST请求是啥呢?它跟GET请求正好相反,GET是从服务器获得数据,而POST请求是向服务器发送数据,服务器再根据POST请求的参数,返回相应的内容。这个POST请求有四个参数,分别为time、key、url、type。记住这个有用的信息,我们在抓包结果中,找一下这个请求,看看这个POST请求做了什么。

If6RJnV.jpg!web

很显然,这个就是我们要找的POST请求,我们可以看到POST请求的参数以及返回的json格式的数据。其中url存放的参数如下:

xfsub_api \/url.php?key=02896e4af69fb18f7029b6046d7c718&time=1505724557&url=http %3 A %2 F %2 Fwww.iqiyi.com %2 Fv_19rr7qhfg0.html&type=&xml=1

这个信息有转义了,但是没有关系,我们手动提取一下,变成如下形式:

xfsub_api/url.php?key= 02896 e4af69fb18f70129b6046d7c718&time= 1505724557 &url=http://www.iqiyi. com /v_19rr7qhfg0.html& type =&xml= 1

我们已经知道了这个解析视频的服务器的域名,再把域名加上:

http://api.xfsub. com /xfsub_api\url.php?key= 02896 e4af69fb18f70129b6046d7c718&time= 1505724557 &url=http://www.iqiyi. com /v_19rr7qhfg0.html& type =&xml= 1

这里面存放的是什么东西?不会视频解析后的地址吧?我们有浏览器打开这个地址看一下:

YZJVjeu.jpg!web

果然,我们可以看到视频地址近在眼前啊,URL如下:

http://disp.titan.mgtv. com /vod. do ?fmt= 4 &pno= 1121 &fid= 1 FEA2622E0BD9A1CA625FBE9B5A238A6& file =/c1/ 2017 / 09 / 06 _0/ 1 FEA2622E0BD9A1CA625FBE9B5A238A6_20170906_1_1_705.mp4

我们再打开这个视频地址:

buqqMz7.jpg!web

瞧,我们就这样得到了这个视频在服务器上的缓存地址。根据这个地址,我们就可以轻松下载视频了。

PS:需要注意一点,这些URL地址,都是有一定时效性的,很快就会失效,因为里面包含时间信息。所以,各位在分析的时候,要根据自己的URL结果打开网站才能看到视频。

接下来,我们的任务就是编程实现我们所分析的步骤,根据不同的视频播放地址获得视频存放的地址。

现在梳理一下编程思路:

  • 用正则表达式匹配到key、time、url等信息。

  • 根据匹配的到信息发POST请求,获得一个存放视频信息的url。

  • 根据这个url获得视频存放的地址。

  • 根据最终的视频地址,下载视频。

三、编写代码

编写代码的时候注意一个问题,就是我们需要使用requests.session()保持我们的会话请求。简单理解就是,在初次访问服务器的时候,服务器会给你分配一个身份证明。我们需要拿着这个身份证去继续访问,如果没有这个身份证明,服务器就不会再让你访问。这也就是这个服务器的反爬虫手段,会验证用户的身份。

7vI3qaQ.jpg!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK