2012-08-13 11 views
6

es una secuencia de comandos de minería de datos web.Manejo de IncompleteRead, URLError

def printer(q,missing): 
    while 1: 
     tmpurl=q.get() 
     try: 
      image=urllib2.urlopen(tmpurl).read() 
     except httplib.HTTPException: 
      missing.put(tmpurl) 
      continue 
     wf=open(tmpurl[-35:]+".jpg","wb") 
     wf.write(image) 
     wf.close() 

q es una Queue() compuesto de URLs y `falta es una cola vacía para reunir error de sensibilización-urls

que se ejecuta en paralelo por 10 hilos.

y cada vez que ejecuto esto, obtengo esto.

File "C:\Python27\lib\socket.py", line 351, in read 
    data = self._sock.recv(rbufsize) 
    File "C:\Python27\lib\httplib.py", line 541, in read 
    return self._read_chunked(amt) 
    File "C:\Python27\lib\httplib.py", line 592, in _read_chunked 
    value.append(self._safe_read(amt)) 
    File "C:\Python27\lib\httplib.py", line 649, in _safe_read 
    raise IncompleteRead(''.join(s), amt) 
IncompleteRead: IncompleteRead(5274 bytes read, 2918 more expected) 

pero hago uso de la except ... he intentado otra cosa, como

httplib.IncompleteRead 
urllib2.URLError 

incluso,

image=urllib2.urlopen(tmpurl,timeout=999999).read() 

pero nada de esto está funcionando ..

¿cómo puedo tomar el IncompleteRead y URLError ?

+0

Poco tarde, pero primer golpe en google. Entonces, http://stackoverflow.com/a/14206036/1444854 debería resolver tus problemas. Por cierto, en general, si desea capturar varias excepciones, colóquelas en una tupla: excepto (httplib.IncompleteRead, urllib2.URLError) –

Respuesta

0

Creo que la respuesta correcta a esta pregunta depende de lo que usted considere una "URL que genera errores".

Los métodos de captura de múltiples excepciones

Si cree que cualquier URL que plantea una excepción, debe añadirse a la cola missing entonces usted puede hacer:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except (httplib.HTTPException, httplib.IncompleteRead, urllib2.URLError): 
    missing.put(tmpurl) 
    continue 

Esto se captura ninguna de esas tres excepciones y agrega esa url a la cola missing. Más simple que podría hacer:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except: 
    missing.put(tmpurl) 
    continue 

Para atrapar cualquier excepción, pero esto no se considera Pythonic y podría ocultar otros posibles errores en su código.

Si por "error URL de fondos" se refiere a cualquier URL que genera un error httplib.HTTPException pero aún quiere mantener su tratamiento cuando se reciben los otros errores, puede hacerlo:

try: 
    image=urllib2.urlopen(tmpurl).read() 
except httplib.HTTPException: 
    missing.put(tmpurl) 
    continue 
except (httplib.IncompleteRead, urllib2.URLError): 
    continue 

Esta voluntad solo agregue la URL a la cola missing si genera un httplib.HTTPException, pero de lo contrario detectará httplib.IncompleteRead y urllib.URLError y evitará que su secuencia de comandos se cuelgue.

interactuando sobre una Cola

Como acotación al margen, while 1 bucles son siempre un poco preocupante para mí. Usted debe ser capaz de bucle a través de los contenidos de la cola utilizando el siguiente patrón, aunque usted es libre de seguir haciéndolo a su manera:

for tmpurl in iter(q, "STOP"): 
    # rest of your code goes here 
    pass 

de forma segura trabajar con archivos

Como otro lado, a menos que sea absolutamente necesario para hacer lo contrario, debe usar context managers para abrir y modificar archivos.Por lo que sus tres líneas de archivos de operación serían:

with open(tmpurl[-35:]+".jpg","wb") as wf: 
    wf.write() 

gerente El contexto se encarga de cerrar el archivo, y lo hará incluso si se produce una excepción al escribir en el archivo.