python - urllib.urlopen funciona pero urllib2.urlopen no
urllib python 3 (5)
Suena como si tuvieras una configuración de proxy definida que urllib2 está mejorando. Cuando intenta representar "127.0.0.01/", el proxy se da por vencido y devuelve un error 504.
Desde el proxy de python urllib2 oscuro 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()
Tengo un sitio web simple que estoy probando. Se ejecuta en localhost y puedo acceder a él en mi navegador web. La página de índice es simplemente la palabra "en ejecución". urllib.urlopen
leerá con éxito la página pero urllib2.urlopen
no lo hará. Aquí hay una secuencia de comandos que demuestra el problema (este es el guión real y no una simplificación de un guión de prueba diferente):
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
Aquí está el rastro de la pila:
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
¿Algunas ideas? Podría terminar necesitando algunas de las características más avanzadas de urllib2
, así que no quiero recurrir solo al uso de urllib
, además quiero entender este problema.
¿Llamar primero a urlib2.open seguido de urllib.open tiene los mismos resultados? ¿Me pregunto si la primera llamada para abrir está causando que el servidor http se ocupe causando el tiempo de espera?
No sé lo que está pasando, pero puede encontrar esto útil para resolverlo:
>>> 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 ''
Sé que esta respuesta apesta, pero "funciona bien en mi máquina" (WinXP con Python 2.5.2)
urllib.urlopen () lanza la siguiente solicitud en el servidor:
GET / HTTP/1.0
Host: 127.0.0.1
User-Agent: Python-urllib/1.17
mientras que urllib2.urlopen () arroja esto:
GET / HTTP/1.1
Accept-Encoding: identity
Host: 127.0.0.1
Connection: close
User-Agent: Python-urllib/2.5
Por lo tanto, su servidor no comprende HTTP / 1.1 o los campos de encabezado adicionales.