1. 程式人生 > >獲取網頁中的視訊下載地址(利用抓包)

獲取網頁中的視訊下載地址(利用抓包)

根據上篇文章的思路,我用了監聽網絡卡流量的方式來改進了我的程式。速度得到了大大的提升。

思路

下圖是我用wireshark做的實驗。把請求路徑中帶.mp4, .flv的請求留下來,得到的就是請求的視訊資源了。
figure1

在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

執行結果圖:
figure2

尚未解決的問題

  1. 對於優酷這種將視訊分段的網站無法獲取完整的視訊。