python urllib2 urllib

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.