2013-02-13 238 views
15

網絡上有一個FLV文件,可以直接在Chrome中下載。該檔案是由中央電視臺(中央電視臺)出版的電視節目。中央電視臺是一家非營利性國有廣播電臺,由中國納稅人出資,允許我們在不侵犯版權的情況下下載他們的內容。模擬瀏覽器下載文件?

使用wget,我可以從其他地址下載文件,但不能從Chrome中的地址下載文件。

這是我一直試圖做的事:

url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302' 

wget -c $url --user-agent="" -O xfgs.f4v 

這不起作用或者:

wget -c $url -O xfgs.f4v 

輸出是:

Connecting to 118.26.57.12:80... connected. 
HTTP request sent, awaiting response... 403 Forbidden 
2013-02-13 09:50:42 ERROR 403: Forbidden. 

我在做什麼錯誤?

我最終想用Python庫mechanize下載它。這裏是代碼我使用的爲:

import mechanize 
br = mechanize.Browser() 
br = mechanize.Browser() 
br.set_handle_robots(False) 
br.set_handle_equiv(False) 
br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
url='http://114.80.235.200/f4v/94/163005294.h264_1.f4v?10000&key=7b9b1155dc632cbab92027511adcb300401443020d&playtype=1&tk=163659644989925531390490125&brt=2&bc=0&nt=0&du=1496650&ispid=23&rc=200&inf=1&si=11000&npc=1606&pp=0&ul=2&mt=-1&sid=10000&au=0&pc=0&cip=222.73.44.31&hf=0&id=tudou&itemid=135558267&fi=163005294&sz=59138302' 
r = br.open(url).read() 
tofile=open("/tmp/xfgs.f4v","w") 
tofile.write(r) 
tofile.close() 

這是結果:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 203, in open 
    return self._mech_open(url, data, timeout=timeout) 
    File "/usr/lib/python2.7/dist-packages/mechanize/_mechanize.py", line 255, in _mech_open 
raise response 
mechanize._response.httperror_seek_wrapper: HTTP Error 403: Forbidden 

誰能解釋如何獲得mechanize代碼工作嗎?

+1

如果您使用:'user_agent ='Mozilla/5.0(X11; U; Linux i686; en-US; rv:1.9.0.1)Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1)''然後' wget -c「$ {url}」--user-agent =「$ {user_agent}」-O x fgs.f4v'?如果這不起作用,那麼Python可能無法幫助你! – Johnsyweb 2013-02-13 02:45:14

+7

您得到403響應的原因很可能是因爲當您在瀏覽器中訪問網站時,網站會保持狀態,最有可能是cookie。這就是YouTube所做的。從瀏覽器中導出您的cookie並將其設置在wget中(您可以簡單地使用「Cookie:」標題),它應該可以工作。 – 2013-02-13 02:47:17

+0

@Johnsyweb在大多數情況下,Python可以完美地模擬瀏覽器(當然,除了通過JavaScript等設置cookie的奇怪網站之外)。 – 2013-02-13 02:49:13

回答

20

首先,如果您試圖進行任何形式的抓取(即使您不一定解析HTML,這也算是刮蹭),但您還是需要進行一定程度的初步調查。

如果您還沒有FirefoxFirebug,請獲取它們。那麼如果你還沒有Chrome,那就去吧。

啓動Firefox/Firebug和Chrome,清除所有的cookies/etc。然後打開Firebug,在Chrome中打開View-> Developer-> Developer Tools。

然後加載您試圖抓取的視頻的主頁面。注意當頁面加載時正在設置的cookies/header/POST變量/查詢字符串變量。您可能希望將此信息保存在某處。

然後嘗試下載視頻,再次注意視頻加載時正在設置的所有cookie/headers/post變量/查詢字符串變量。當您最初加載頁面時,很可能會設置cookie或POST變量,這是實際提取視頻文件所必需的。

當你編寫你的python時,你將需要儘可能地模擬這種交互。使用python-requests。這可能是最簡單的URL庫,除非你以某種方式遇到了牆(不能做),否則我絕不會使用其他任何東西。第二個我開始使用python-requests,我所有的URL獲取代碼都縮小了5倍。

現在,事情可能不會在你第一次嘗試它們時起作用。 Soooo,你將需要使用python加載主頁面。打印出所有的cookies/headers/POST變量/查詢字符串變量,並將它們與Chrome/Firebug的內容進行比較。然後嘗試加載視頻,再次比較所有這些值(這意味着您發送服務器的內容以及服務器向您發送的內容)。你需要弄清楚他們之間有什麼不同(不要擔心,我們都在幼兒園學到了這個東西......「這些東西中的一個與其他東西不一樣)」,並分析這種差異如何打破東西。

如果在所有這一切的結尾,仍然無法弄清楚,那麼您可能需要查看包含電影鏈接的頁面的HTML。在頁面中查找任何javascript。然後使用Firebug/Chrome開發人員工具來檢查JavaScript並查看它是否正在對用戶會話進行某種管理。如果它以某種方式生成與視頻訪問相關的令牌(cookie或POST/GET變量),則需要在python中模擬其標記化方法。

希望這一切都有所幫助,而且看起來不太可怕。關鍵是你需要成爲一名科學家。找出你知道的,你不知道的,你想要的,並開始試驗和記錄你的結果。最終會出現一種模式。

編輯:澄清步驟

  1. 研究如何狀態維持
  2. 與蟒蛇拉初始頁面,搶你需要從它
  3. 執行可能與需要的任何符號化的任何狀態信息該狀態信息
  4. 使用來自步驟2的令牌和3
  5. 拉出視頻如果東西吹起來,輸出您的請求/響應HEA分佈式能源,餅乾,查詢乏,POST變量,並將它們
  6. 返回比較Chrome瀏覽器/ Firebug的步驟1,直到你找到一個解決方案

編輯: 你也可以得到在任何一個重定向這些請求(html頁面或文件下載)。如果發生這種情況,您很可能會錯過Firebug/Chrome中的請求/響應。解決方法是使用嗅探器,如LiveHTTPHeaders,或者其他響應者已建議的,WireSharkFiddler。請注意,如果您在Linux或OSX機器上,Fiddler將無能爲力。它只是Windows,並且絕對專注於.NET開發......(呃)。 Wireshark對於大多數問題是非常有用的,但是過分的,並且根據你運行的是什麼機器,你可能會遇到問題。所以我會先建議LiveHTTPHeaders。

我喜歡這樣的問題

+5

老實說,我喜歡這樣的答案,聽起來像'不給我魚,但學會我去釣魚'的隱喻。這些都是很好的提示。 – 2013-02-22 20:55:04

+0

這是編程吧? :)謝謝,最好的學習方式是通過做(調試)。打破事情,並找出他們爲什麼打破。然後,您更好地瞭解整個系統,而不是僅僅解決一個問題域特定的解決方案 – 2013-02-24 18:51:12

+0

要自動化網絡資料,我經常使用以下三個工具: - Chrome的開發人員工具,啓用網絡選項「保留日誌」和控制檯 - 當發現POST/GET請求時(您需要一些技巧),我使用'Copy as curl' - 然後編寫自己的python來自動化案例,我還發現了這個工具:http:// curl .trillworks.com /#python爲我生成代碼。 您可能還需要使用python/urllib2的cookiejar來保存cookie 您還可以使用nodejs或phantomjs輕鬆地在代碼中執行/ eval Javascript代碼 – hzrari 2015-04-16 21:58:52

5

似乎機械化可以進行有狀態瀏覽,這意味着它將保持瀏覽器請求之間的上下文和cookie。我建議首先加載視頻所在的完整頁面,然後再嘗試明確下載視頻。這樣,Web服務器將認爲這是一個完整的(合法的)瀏覽會話正在進行

0
from urllib import urlopen 
print urlopen(url) #python built-in high level interface to get ANY online resources, auto responds to HTTP error codes. 
+0

沒有傢伙這不是一個真正的解決方案恕我直言 – 0x90 2014-07-04 09:48:01

4

爲了澄清你的問題,你可以路由你的瀏覽器,並通過調試代理代碼的請求的「爲什麼」的一部分。如果你使用Windows,我建議fiddler2。其他平臺還有其他調試代理。但小提琴手2絕對是我的最愛。

http://www.fiddler2.com/fiddler2/

https://www.owasp.org/index.php/Category:OWASP_WebScarab_Project

http://www.charlesproxy.com/

或者更低水平 http://netcat.sourceforge.net/

http://www.wireshark.org/

一旦你知道它通常是簡單得多的分歧拿出一個解決方案。我懷疑關於有狀態瀏覽/ cookie的其他答案是正確的。通過上述工具,您可以分析這些Cookie並推出合適的解決方案,而無需進行瀏覽器自動化。

+0

+1簡單 – flup 2013-02-20 15:26:06

2

有一個開源的,Python庫,命名爲ghost,它包裝無頭,WebKit的瀏覽器,這樣你就可以通過簡單的API控制一切:

from ghost import Ghost 
ghost = Ghost() 

page, resources = ghost.open('http://my.web.page') 

它支持的cookies,JavaScript和一切。您可以將JavaScript注入到頁面中,並且它是無頭的,因此它不會以圖形方式呈現任何內容,但您仍然擁有DOM。這是一個完整的瀏覽器。

它不能很好地擴展,但它很有趣,並且當你需要接近完整的瀏覽器時可能會有用。

+1

這可能是矯枉過正他的問題,因爲它加載了一個完整的WebKit/JavascriptCore或V8實例。這使得它非純Python和依賴可能成爲一個問題,取決於他的代碼運行的地方。但不管真棒建議!我從來沒有見過這個。 – 2013-02-22 17:09:41

3

我認爲很多網站使用只存在於您的會話中的臨時鏈接。網址中的代碼可能與您的會話ID類似。這意味着特定的鏈接將永遠不會再工作。

你將不得不重新使用一些庫,可容納該會話(如在其他的答案中提到)包含鏈接的頁面。然後嘗試找到鏈接並僅在此會話中使用它。

5

假設您沒有手動輸入URL,請使用機械化首先進入您從中獲取該頁面的頁面。然後模擬您下載實際文件的操作(可能點擊鏈接或按鈕)。

這可能不是工作,雖然是機械化保持餅乾和重定向的狀態,但不處理任何JavaScript實時更改HTML頁面。要檢查JavaScript是否對操作至關重要,請在Chrome(或任何其他瀏覽器)中切換JavaScript,並確保可以下載該文件。如果JavaScript是必要的,我會嘗試以編程方式驅動瀏覽器來獲取文件。

我通常的方法來嘗試這種拼搶的是

  1. 嘗試了wget或蟒蛇的urllib2
  2. 嘗試機械化
  3. 驅動器中的瀏覽器

除非有一些驗證碼,最後一個通常工作,但其他人更容易(和更快)。

0

您是否嘗試過請求模塊?它比urllib2和pycurl等使用起來要簡單得多。 但它功能強大。它具有以下特點:該鏈接是here

  • 國際域名和網址
  • 保持活動&連接池
  • 會話與Cookie持久
  • 瀏覽器風格的SSL驗證
  • 基本/摘要式身份驗證
  • 優雅的鍵/值餅乾
  • 自動減壓
  • Unicode的響應主體
  • 分段文件上傳
  • 連接超時
  • 的.netrc支持
  • 的Python 2.6-3.3
  • 線程安全的。
  • 2

    下載任何流媒體雖然目前接受的答案(由G.希勒)可能是最好的一般來說,我發現了一種跳過幾個步驟的方法 - 用a firefox extension called cliget將請求上下文與所有http頭和cookie一起,並生成複製到剪貼板的curl(或wget)命令。

    編輯:這個功能也是螢火和Chrome調試器的網絡面板可用 - 右鍵點擊請求,「副本作爲捲曲」

    大多數時候,你會得到一個非常詳細的命令一些顯然不需要的標題,但是你可以一個接一個地刪除這些請求,直到服務器拒絕請求,而不是相反(老實說,我覺得很沮喪 - 我經常陷入思考請求中缺少什麼標題)。

    (此外,您可能想要刪除從curl命令行的-O選項來查看,而不是將其下載到文件的結果在標準輸出,並添加-v看到完整的標題列表)

    即使你不想使用curl/wget,將一個curl/wget命令行轉換爲python代碼只是知道如何向urllib請求(或任何http請求庫)添加標頭的問題