2009-10-31 142 views
22

我試圖提取URL請求的響應標頭。當我使用螢火分析的URL請求的響應輸出,它返回:Python urllib2響應標頭

Content-Type text/html 

然而,當我使用Python代碼:

urllib2.urlopen(URL).info() 

所得輸出返回:

Content-Type: video/x-flv 

我是新來的python,並一般的網絡編程;任何有用的見解,非常感謝。另外,如果需要更多信息,請告訴我。

預先感謝閱讀這篇文章

+0

這似乎是一個副本http://stackoverflow.com/questions/843392/python-get-http-headers-from-urllib-call – 2012-04-26 20:15:46

回答

2

這種奇特的差異可能是由不同的頭文件(即接受那種可能的)來解釋由兩個請求發送 - 您可以檢查...?或者,如果Javascript在Firefox中運行(我假設你在運行螢火蟲時使用的是) - 因爲它絕對不在Python中運行 - 「所有投注都關閉」,就像他們說的那樣;-) 。

+0

嗯,我不太確定如何有兩個不同的標題,也是我將如何能夠區分兩者。我很確定JavaScript運行在Firefox中......那麼我需要在Python中執行什麼操作? – looter 2009-10-31 06:26:47

+0

@looter,在Python中沒有直接的方法來執行Javascript - 如果JavaScript在確定頁面的最終內容方面起着至關重要的作用,那麼最好的方法就是自動化真正的瀏覽器。通過SeleniumRC。 – 2009-10-31 06:39:35

+0

我不確定Javascript是否正在處理請求,因爲當我在螢火蟲中使用網絡監控時,響應標題也可在HTML視圖中查看。就像我在文章中提到的那樣,我對python和web編程/腳本編程真的很陌生,所以這些都在我頭上,我不確定我是否足夠描述。感謝您一直以來的幫助。 – looter 2009-10-31 06:45:34

5

內容類型text/html

真的,這樣,沒有冒號?

如果是這樣,那麼可以解釋它:它是一個無效的頭,所以它被忽略,所以urllib通過查看文件名來猜測內容類型。如果URL最後有'.flv',則會猜測該類型應爲video/x-flv

1

請記住,根據請求的不同,Web服務器可以爲相同的URL返回不同的結果。例如,內容類型協商:請求者可以指定它將接受的內容類型列表,服務器可以返回不同的結果以適應不同的需求。例如,您可能正在爲您的某個請求獲取錯誤頁面,例如,因爲它的格式不正確,或者您沒有設置用於正確驗證您的Cookie設置等。請查看響應本身以查看內容你越來越。

35

嘗試按Firefox提出請求。你可以看到在Firebug請求頭,所以將它們添加到您的請求對象:

import urllib2 

request = urllib2.Request('http://your.tld/...') 
request.add_header('User-Agent', 'some fake agent string') 
request.add_header('Referer', 'fake referrer') 
... 
response = urllib2.urlopen(request) 
# check content type: 
print response.info().getheader('Content-Type') 

還有HTTPCookieProcessor它可以做的更好,但我不認爲你需要它在大多數情況下。看看Python的文檔:

http://docs.python.org/library/urllib2.html

+3

for Python 3:'response.info()[「content-type」]' – 2012-12-20 14:01:52

+0

站點完全不可能檢查請求是否有假引用者?我並不幸運,我嘗試了,總是有錯誤「Invalid referer,will not load xy」... – Nearoo 2014-11-29 13:12:09

+0

另外,如果info()不顯示一行「Referer」:我可以得出結論:假引薦人「沒有工作? – Nearoo 2014-11-29 13:32:06

0

根據http://docs.python.org/library/urllib2.html只有get_header()方法一無所知getheader

問,因爲您的代碼工作正常

response.info().getheader('Set cookie') 

但一旦我執行

response.info().get_header('Set cookie') 

我得到:

Traceback (most recent call last): 
    File "baza.py", line 11, in <module> 
    cookie = response.info().get_header('Set-Cookie') 
AttributeError: HTTPMessage instance has no attribute 'get_header' 

編輯: 此外
response.headers.get('Set-Cookie')正常工作,以及,而不是男人tioned在urlib2 DOC ....

+0

get_header()用於urllib2.Request類。響應類使用getheader()來代替,這是一個不幸的錯配。 – 2012-12-27 20:56:08

-1

進口urllib.request裏

fhand = urllib.request.urlopen( 'http://data.pr4e.org/intro-short.txt')

打印(fhand.info())

+0

歡迎來到SO。請閱讀此[如何回答](http://stackoverflow.com/help/how-to-answer)以提供高質量的答案。 – thewaywewere 2017-04-26 05:17:40