ejemplos python urllib2 urlopen

python - ejemplos - urllib2.urlopen timeout



tiempo de espera para urllib2.urlopen() en versiones pre Python 2.6 (6)

Bueno, la forma en que se maneja el tiempo de espera en 2.4 o 2.6 es la misma. Si abres el archivo urllib2.py en 2.6, verás que toma un argumento extra como tiempo de espera y lo maneja usando el método socket.defaulttimeout () como se mencionó en la respuesta 1.

Así que realmente no necesitas actualizar tu urllib2.py en ese caso.

La documentación de urllib2 dice que el parámetro de tiempo de espera se agregó en Python 2.6. Desafortunadamente, mi base de código se ha ejecutado en las plataformas Python 2.5 y 2.4.

¿Hay alguna forma alternativa de simular el tiempo de espera? Todo lo que quiero hacer es permitir que el código hable con el servidor remoto durante un período de tiempo fijo.

¿Quizás alguna biblioteca incorporada alternativa? (No quiero instalar 3ra parte, como pycurl)


Con una irritación considerable, puede anular la clase httplib.HTTPConnection que utiliza urllib2.HTTPHandler.

def urlopen_with_timeout(url, data=None, timeout=None): # Create these two helper classes fresh each time, since # timeout needs to be in the closure. class TimeoutHTTPConnection(httplib.HTTPConnection): def connect(self): """Connect to the host and port specified in __init__.""" msg = "getaddrinfo returns an empty list" for res in socket.getaddrinfo(self.host, self.port, 0, socket.SOCK_STREAM): af, socktype, proto, canonname, sa = res try: self.sock = socket.socket(af, socktype, proto) if timeout is not None: self.sock.settimeout(timeout) if self.debuglevel > 0: print "connect: (%s, %s)" % (self.host, self.port) self.sock.connect(sa) except socket.error, msg: if self.debuglevel > 0: print ''connect fail:'', (self.host, self.port) if self.sock: self.sock.close() self.sock = None continue break if not self.sock: raise socket.error, msg class TimeoutHTTPHandler(urllib2.HTTPHandler): http_request = urllib2.AbstractHTTPHandler.do_request_ def http_open(self, req): return self.do_open(TimeoutHTTPConnection, req) opener = urllib2.build_opener(TimeoutHTTPHandler) opener.open(url, data)


Creo que su mejor opción es parchear (o implementar una versión local de) su urllib2 con el cambio de la rama de mantenimiento 2.6

El archivo debe estar en /usr/lib/python2.4/urllib2.py (en Linux y 2.4)


Debe establecer el tiempo de espera en dos lugares.

import urllib2 import socket socket.setdefaulttimeout(30) f = urllib2.urlopen(''http://www.python.org/'', timeout=30)


Yo uso httplib de la biblioteca estándar. Tiene una API simple, pero solo maneja http como se puede imaginar. IIUC urllib usa httplib para implementar las cosas http.


puede establecer un tiempo de espera global para todas las operaciones de socket (incluidas las solicitudes HTTP) utilizando:

socket.setdefaulttimeout()

Me gusta esto:

import urllib2 import socket socket.setdefaulttimeout(30) f = urllib2.urlopen(''http://www.python.org/'')

en este caso, su solicitud urllib2 se agotará después de 30 segundos y lanzará una excepción de socket. (Esto fue agregado en Python 2.3)