爬取视频网站的视频URL
前言
最近工作需要爬取视频URL,本人在网上找了很多资料,最终绕了很大一个弯子才搞定,写此博客供自己以后查看,或提供给有此需求的程序员来参考。我们平常在网页上看电影的时候,我们的浏览器会每过一小会加载一小段视频,这样连续起来我们就可以看到一个完整的视频。言外之意就是视频网站都会将视频分割之后再传送给客户端,所以我们通过在网卡上抓包的方法就能抓取到向视频网站发送的HTTP请求包,从数据包提取向视频网站发送的url,最后我们把每一小片段的视频url拼起来,我们就可以得到完整的视频。
第一步、安装Python(2.7.13 64位)
python的下载地址:https://www.python.org/downloads/windows/
python安装步骤我就不说了,是个人应该都会。
第二步、安装Python的扩展包pypcapy==1.1.2
这里本人已经试过了,最新的版本是有问题的,最好使用旧一点的版本。
- pip install pypcap==1.1.2 安装时会出现以下问题,会提示没有安装vc++ 9.0。
- 微软给python2提供了vc++库,但是没有提供python3的,这也是为什么我们选择python2的原因,下载VCForPython27.msi
下载链接:https://www.microsoft.com/en-us/download/details.aspx?id=44266
下载完成后直接点击下一步安装就可以了。
- VC++安装完成之后,pip install pypcap==1.1.2,这时我们会遇到一个新的错误,说找不到pcap.h,这时我们需要下载winpcap的开发包。
Winpcap开发者版本下载地址:http://www.winpcap.org/devel.htm
- winpcap下载完之后,接下来的两步很关键,一定仔细阅读(前两步是安装python另一个扩展包pcapy必须的过程,安装pypcap前两步可省略)。
- 解压winpcap的开发包,把include和lib目录里面的文件放到VC的同名目录里面(我的 VCForPython27默认安装目录C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC)
- 注意事项:如果是用的64位的python,还得把winpcap开发包中Lib目录中的x64目录里面的两个lib文件放到vc的lib目录中的amd64目录中。(将WpdPcak>Lib>x64目录中的Packet.lib与wpcap.lib文件拷贝到C:\Users\Administrator\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\VC\lib\amd64目录中)
- 找到python的安装目录然后将include放到python的include目录,然后将Lib放到python的lib目录
- 接下来继续安装显示安装成功!如果你是下载的压缩包 python setup.py install 安装的方式,在安装成功之后,找到这个包的路径,将pypcap的包的位置添加到环境变量中。
- 安装成功之后呢,我们进入python模式试一下吧。本以为大功告成,结果还是有错误,显示找不到DLL,这时我们需要安装WinPcap,我们刚才使用了WinPcap开发包,还没有安装WinPcap工具。
WinPcap下载地址:https://www.winpcap.org/install/
- 安装WinPcap之后,终于结束!在此辛苦,本人因在网上找不到全的资料,百度出来的都是一些乱七八遭的,装这个装到晚上2点才睡觉。。。
第三步、安装Python的扩展包dpkt(这个没什么特别的,直接装就可以。)
第四步、运行以下代码,并打开浏览器观看视频。
- 以下代码作者已试验过,只能抓取http请求,我们打开美剧鸟观看视频,美剧鸟网站都是http请求。
#encoding: utf8
import pcap
import dpkt
import re
pc=pcap.pcap() #注,参数可为网卡名,如eth0, 设置监听过滤器 HTTP请求的TCP头为GET 或者 HTTP, pc.setfilter('tcp[20:2]=0x4745 or tcp[20:2]=0x4854')
pc.setfilter('tcp port 80')
print u"程序开始运行"
while True:
for ptime,pdata in pc: #ptime为收到时间,pdata为收到数据
try:
p=dpkt.ethernet.Ethernet(pdata) #对抓到的以太网V2数据包(raw packet)进行解包
except Exception, e:
continue
if p.data.__class__.__name__=='IP':
if p.data.data.__class__.__name__=='TCP': # if p.data.data.dport==80:
header = p.data.data.data # 抓到的请求头, 默认按照抓到正常的请求头来解析,如果解析报错则舍弃,继续抓包
try:
headerArr = header.split('\r\n')
url = headerArr[0].split(' ')[1]
host = headerArr[1].split(' ')[1]
requestUrl = host + url
domain_regex = r'^([a-zA-Z0-9]([a-zA-Z0-9-_]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,11}[/].*'
result = re.search(domain_regex, requestUrl)
if result:
print requestUrl
# print requestUrl
except Exception, e:
continue
第五步、打开浏览器开发者network,可观察到我们的程序已经抓取到视频的url