2008-10-14 3 views
11

У меня есть простой веб-сайт, который я тестирую. Он работает на localhost, и я могу получить к нему доступ в своем веб-браузере. Индексная страница - это просто слово «бег». 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

Я знаю, что этот ответ отстой, но «он прекрасно работает на моей машине» (WinXP с Python 2.5.2)

+0

Я также работаю на Windows XP с Python 2.5.2, так что это интересно. Спасибо, что дал ему шанс. – 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 

в то время как urllib2.urlopen() бросает это:

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

Таким образом, ваш сервер не понимает HTTP/1.1 или дополнительные поля заголовка.