2008-10-14 102 views
11

我有一個簡單的網站,我正在測試。它在本地主機上運行,​​我可以在我的Web瀏覽器中訪問它。索引頁面就是「運行」一詞。 urllib.urlopen將成功讀取該頁面,但urllib2.urlopen不會。下面是這證明了問題(這是實際的腳本,而不是不同的測試腳本的簡化)的腳本:urllib.urlopen工程,但urllib2.urlopen不

import urllib, urllib2 
print urllib.urlopen("http://127.0.0.1").read() # prints "running" 
print urllib2.urlopen("http://127.0.0.1").read() # throws an exception 

這裏的堆棧跟蹤:

Traceback (most recent call last): 
    File "urltest.py", line 5, in <module> 
    print urllib2.urlopen("http://127.0.0.1").read() 
    File "C:\Python25\lib\urllib2.py", line 121, in urlopen 
    return _opener.open(url, data) 
    File "C:\Python25\lib\urllib2.py", line 380, in open 
    response = meth(req, response) 
    File "C:\Python25\lib\urllib2.py", line 491, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python25\lib\urllib2.py", line 412, in error 
    result = self._call_chain(*args) 
    File "C:\Python25\lib\urllib2.py", line 353, in _call_chain 
    result = func(*args) 
    File "C:\Python25\lib\urllib2.py", line 575, in http_error_302 
    return self.parent.open(new) 
    File "C:\Python25\lib\urllib2.py", line 380, in open 
    response = meth(req, response) 
    File "C:\Python25\lib\urllib2.py", line 491, in http_response 
    'http', request, response, code, msg, hdrs) 
    File "C:\Python25\lib\urllib2.py", line 418, in error 
    return self._call_chain(*args) 
    File "C:\Python25\lib\urllib2.py", line 353, in _call_chain 
    result = func(*args) 
    File "C:\Python25\lib\urllib2.py", line 499, in http_error_default 
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp) 
urllib2.HTTPError: HTTP Error 504: Gateway Timeout 

任何想法?我可能最終需要urllib2的一些更高級功能,所以我不想僅僅使用urllib,再加上我想了解這個問題。

回答

16

聽起來像是你有定義的urllib2是撿代理設置。當它嘗試代理「127.0.0.01/」時,代理放棄並返回504錯誤。

Obscure python urllib2 proxy gotcha

proxy_support = urllib2.ProxyHandler({}) 
opener = urllib2.build_opener(proxy_support) 
print opener.open("http://127.0.0.1").read() 

# Optional - makes this opener default for urlopen etc. 
urllib2.install_opener(opener) 
print urllib2.urlopen("http://127.0.0.1").read() 
+0

這解決了這個問題,但我不知道如何或爲什麼它想使用代理,因爲我的腳本只有三行,並且沒有任何環境變量可以指示任何代理。儘管如此,解決這個問題很好,所以感謝您的幫助。 – 2008-10-14 18:09:31

1

先調用urlib2.open後跟urllib.open是否有相同的結果?只是想知道第一個打開的電話是否導致http服務器繁忙導致超時?

+0

不,urllib2無論是否先調用都會得到錯誤,即使多次調用urllib也不會收到錯誤。好想法雖然。 – 2008-10-14 15:18:52

1

我知道這個答案很爛,但「它工作正常我的機器上」 (操作系統與Python 2.5.2)

+0

我也在使用Python 2.5.2的Windows XP上運行,所以這很有趣。謝謝你給它一個鏡頭。 – 2008-10-14 18:00:54

1

我不知道發生了什麼事情,但你會發現這是很有幫助的計算出來:

>>> import urllib2 
>>> urllib2.urlopen('http://mit.edu').read()[:10] 
'<!DOCTYPE ' 
>>> urllib2._opener.handlers[1].set_http_debuglevel(100) 
>>> urllib2.urlopen('http://mit.edu').read()[:10] 
connect: (mit.edu, 80) 
send: 'GET/HTTP/1.1\r\nAccept-Encoding: identity\r\nHost: mit.edu\r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n' 
reply: 'HTTP/1.1 200 OK\r\n' 
header: Date: Tue, 14 Oct 2008 15:52:03 GMT 
header: Server: MIT Web Server Apache/1.3.26 Mark/1.5 (Unix) mod_ssl/2.8.9 OpenSSL/0.9.7c 
header: Last-Modified: Tue, 14 Oct 2008 04:02:15 GMT 
header: ETag: "71d3f96-2895-48f419c7" 
header: Accept-Ranges: bytes 
header: Content-Length: 10389 
header: Connection: close 
header: Content-Type: text/html 
'<!DOCTYPE ' 
1

了urllib.urlopen()拋出下面的請求在服務器上:

GET/HTTP/1.0 
Host: 127.0.0.1 
User-Agent: Python-urllib/1.17 

while urllib2.urlopen()throws this:

GET/HTTP/1.1 
Accept-Encoding: identity 
Host: 127.0.0.1 
Connection: close 
User-Agent: Python-urllib/2.5 

因此,您的服務器要麼不理解HTTP/1.1或額外的頭字段。

相關問題