2008-10-14 38 views
11

Tôi có một trang web đơn giản mà tôi đang thử nghiệm. Nó đang chạy trên localhost và tôi có thể truy cập nó trong trình duyệt web của tôi. Trang chỉ mục đơn giản là từ "đang chạy". urllib.urlopen sẽ đọc thành công trang nhưng urllib2.urlopen thì không. Dưới đây là một kịch bản mà chứng tỏ vấn đề (đây là kịch bản thực tế và không phải là một việc đơn giản hóa của một kịch bản thử nghiệm khác nhau):urllib.urlopen hoạt động nhưng urllib2.urlopen không

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 

Dưới đây là stack trace:

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 

Bất kỳ ý tưởng? Tôi có thể sẽ cần một số tính năng nâng cao hơn của urllib2, vì vậy tôi không muốn chỉ sử dụng urllib, cộng với tôi muốn hiểu vấn đề này.

Trả lời

16

Âm thanh như bạn có cài đặt proxy định nghĩa rằng urllib2 được chọn lên trên. Khi nó cố gắng để proxy "127.0.0.01/", proxy cho lên và trả về một lỗi 504.

Từ 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

Điều này khắc phục được vấn đề, mặc dù tôi không biết tại sao nó lại sử dụng proxy, vì kịch bản của tôi chỉ dài ba dòng và tôi không có biến môi trường biểu thị bất cứ điều gì về proxy. Tuy nhiên, rất tốt để giải quyết vấn đề này, vì vậy cảm ơn vì sự giúp đỡ. –

+0

Ví dụ OpenerDirector không có thuộc tính 'urlopen' - bạn cần phải thay đổi đoạn ở trên thành opener.open (... – ryan

1

Có gọi urlib2.open trước theo sau là urllib.open có cùng kết quả không? Chỉ cần tự hỏi liệu cuộc gọi đầu tiên mở có khiến máy chủ http bận rộn gây ra thời gian chờ không?

+0

Không, urllib2 nhận được lỗi bất kể nó được gọi là đầu tiên hay không và urllib không bao giờ bị lỗi ngay cả khi được gọi nhiều lần. Suy nghĩ tốt mặc dù. –

1

Tôi biết câu trả lời này sucks, nhưng "nó hoạt động tốt trên máy tính của tôi" (WinXP với Python 2.5.2)

+0

Tôi cũng đang chạy trên Windows XP với Python 2.5.2, vì vậy điều đó thật thú vị. Cảm ơn đã cho nó một shot. –

1

Tôi không biết những gì đang xảy ra, nhưng bạn có thể thấy hữu ích này trong tìm nó ra:

>>> 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() throws yêu cầu sau đây tại máy chủ:

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

khi urllib2.urlopen() throws này:

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

Vì vậy, máy chủ của bạn không hiểu HTTP/1.1 hoặc trường tiêu đề bổ sung.

Các vấn đề liên quan