2012-08-13 18 views
6

è un pezzo di script di web mining.Gestione incompletaLeggi, 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 è un Queue() composto URL e `manca è una coda vuota per raccogliere errore di sensibilizzazione-URL

che corre in parallelo da 10 fili.

e ogni volta che eseguo questo, ho ottenuto questo.

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) 

ma lo faccio usare il except ... ho cercato qualcos'altro come

httplib.IncompleteRead 
urllib2.URLError 

anche,

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

, ma niente di tutto questo sta lavorando ..

come posso prendere il IncompleteRead e il URLError ?

+0

Bit in ritardo, ma prima volta su google. Sooo, http://stackoverflow.com/a/14206036/1444854 dovrebbe risolvere i tuoi problemi. A proposito, generalmente se vuoi catturare più eccezioni, inseriscile in una tupla: ad eccezione di (httplib.IncompleteRead, urllib2.URLError) –

risposta

0

Penso che la risposta corretta a questa domanda dipenda da ciò che consideri un "URL di errore".

Metodi di cattura più eccezioni

Se si pensa che qualsiasi URL che solleva un'eccezione dovrebbe essere aggiunto alla coda missing allora si può fare:

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

Questo si cattura qualsiasi di queste tre eccezioni e aggiungere l'url alla coda missing. Più semplicemente si potrebbe fare:

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

Per catturare alcuna eccezione, ma questo non è considerato Pythonic e potrebbe nascondere altri errori possibili nel codice.

Se per "error URL-raising" si intende qualsiasi URL che genera un errore httplib.HTTPException ma desideri comunque a mantenere l'elaborazione se gli altri errori vengono ricevuti allora si può fare:

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

Questa volontà aggiungi l'URL solo alla coda missing se solleva uno httplib.HTTPException ma altrimenti prenderà httplib.IncompleteRead e urllib.URLError e manterrà il blocco dello script.

l'iterazione di una coda

Per inciso, while 1 cicli sono sempre un po 'in materia per me. Si dovrebbe essere in grado di scorrere i contenuti coda utilizzando il seguente schema, anche se sei libero di continuare a fare a modo tuo:

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

sicuro lavorare con i file

Come un altro a parte, a meno che non sia assolutamente necessario per fare altrimenti, è necessario utilizzare context managers per aprire e modificare i file.Così i vostri tre linee di file-operazione diventerebbero:

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

direttore Il contesto si prende cura di chiudere il file, e lo farà, anche se si verifica un'eccezione durante la scrittura del file.