獲取網頁中的視訊下載地址(利用抓包)
阿新 • • 發佈:2018-12-31
根據上篇文章的思路,我用了監聽網絡卡流量的方式來改進了我的程式。速度得到了大大的提升。
思路
下圖是我用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
執行結果圖:
尚未解決的問題
- 對於優酷這種將視訊分段的網站無法獲取完整的視訊。