获取网页中的视频下载地址(利用抓包)

根据上篇文章的思路,我用了监听网卡流量的方式来改进了我的程序。速度得到了大大的提升。

思路

下图是我用wireshark做的实验。把请求路径中带.mp4, .flv的请求留下来,得到的就是请求的视频资源了。

在wireshark的试验下,我确定了抓包这个方法是可以行得通了,我开始用python编写抓包代码。

我用python的pcap和dpkt这两个包来对网卡流量进行了分析。首先就是用pcap来对我的网卡进行监听,设置一下pcap的过滤器,只处理HTTP请求,因为视频的地址在HTTP请求中。我找到HTTP请求中地址中包含.flv的请求,就可以得到视频的url地址。

实验

代码较短,我就直接贴上代码了。pcap,dpkt的使用我是参考的这篇文章,但是这篇文章应该也是复制别人的,我当初搜的时候找到一篇更好的,但是最后写文章的时候没办法找到那篇更好的了,只能贴上这篇不那么好的了。
当然代码也会放到我的Github上,哈哈~

#encoding: utf8
import pcap
import dpkt
pc=pcap.pcap('eth1')    #注,参数可为网卡名,如eth0
#设置监听过滤器 HTTP请求的TCP头为GET 或者 HTTP
pc.setfilter('tcp[20:2]=0x4745 or tcp[20:2]=0x4854')    

print "starting capture"
for ptime,pdata in pc:    #ptime为收到时间,pdata为收到数据
#对抓到的以太网V2数据包(raw packet)进行解包

    p=dpkt.ethernet.Ethernet(pdata)
    if p.data.__class__.__name__=='IP':
        # ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))
        if p.data.data.__class__.__name__=='TCP':
            if p.data.data.dport==80:
                header = p.data.data.data # by gashero
                headerArr = header.split('\r\n')
                url = headerArr[0].split(' ')[1]
                host = headerArr[1].split(' ')[1]
                requestUrl = host + url
                if requestUrl.find('.flv') != -1:
                    # print headerArr
                    print requestUrl

运行结果图:

尚未解决的问题

  1. 对于优酷这种将视频分段的网站无法获取完整的视频。

你可能感兴趣的:(python,wireshark,视频,crawl,计算机)