2012-08-13 13 views
6

es ist ein Stück Web-Mining-Skript.Handhabung unvollständig lesen, 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 ist ein Queue() bestehend aus URLs und `fehlt, ist eine leere Warteschlange Fehler-raising-URLs

es um 10 Threads parallel verläuft zu sammeln.

und jedes Mal, wenn ich das laufe, habe ich das.

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) 

aber ich verwende die except ... habe ich versucht, etwas anderes wie

httplib.IncompleteRead 
urllib2.URLError 

sogar,

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

aber nichts davon funktioniert ..

Wie kann ich die IncompleteRead und URLError fangen ?

+0

Bis spät, aber zuerst auf Google. Sooo, http://stackoverflow.com/a/14206036/1444854 sollte deine Probleme lösen. Übrigens, wenn Sie mehrere Ausnahmen abfangen möchten, fügen Sie sie in ein Tupel ein: except (httplib.IncompleteRead, urllib2.URLError) –

Antwort

0

Ich denke, die richtige Antwort auf diese Frage hängt davon ab, was Sie eine "Fehler-URL" betrachten.

Methoden fangen mehrere Ausnahmen

Wenn Sie denken, jede URL, die eine Ausnahme auslöst, sollte der missing Warteschlange hinzugefügt werden, dann können Sie tun:

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

Dies wird einer der drei genannten Ausnahmen fangen und Fügen Sie diese URL der missing-Warteschlange hinzu. Vereinfacht könnte man tun:

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

jede Ausnahme zu fangen, aber das ist nicht Pythonic betrachtet und andere mögliche Fehler im Code verbergen konnte.

Wenn durch „Fehler-raising URL“ Sie jede URL bedeuten, dass ein httplib.HTTPException Fehler auslöst, aber sie würden immer noch die Verarbeitung halten mögen, wenn die anderen Fehler empfangen werden, dann können Sie tun:

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

Dieser Wille Fügen Sie die URL nur zur missing-Warteschlange hinzu, wenn sie einen Wert von httplib.HTTPException auslöst. Andernfalls werden die Werte httplib.IncompleteRead und urllib.URLError abgefangen, und Ihr Skript wird nicht abstürzen.

Iterieren über eine Queue

Als beiseite, while 1 Schleifen sind immer ein bisschen zu mir über. Sie sollten mit dem folgenden Muster eine Schleife durch die Queue-Inhalte können, wenn du frei bist tun es Ihren Weg fortsetzen: mit Dateien

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

sicher arbeiten

Als eine andere Seite, wenn es absolut notwendig ist Ansonsten sollten Sie context managers verwenden, um Dateien zu öffnen und zu ändern.So Ihre drei Datei-Betrieb Linien würden:

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

Der Kontext-Manager kümmert sich um die Datei zu schließen, und werden dies auch dann, wenn eine Ausnahme auftritt, während in die Datei zu schreiben.