2012-04-03 2 views
1

Ich versuche, HTML von verschiedenen Webseiten einer Website zu kratzen. Allerdings bin ich gelegentlich die folgende Fehlermeldung erhalten:Wie probiere ich weiterhin eine Webseite, die einen Fehler "urllib2.HTTPError" (Python) auslöst?

urllib2.HTTPError: HTTP Error 500: Internal Server Error 

Ich versuche, eine zu tun „während“ Schleife versucht zu halten, bis der Fehler weg geht, aber ich habe nicht das richtige Format für die Schleife heraus . Es sieht so aus, als ob die Website ein wenig flockig ist, da sie jedes Mal auf einer anderen Webseite fehlzuschlagen scheint.

Ich versuche, so etwas zu tun:

web_raw_results = urllib2.urlopen(web_url) 
while urllib2.HTTPError: 
    web_raw_results = urllib2.urlopen(web_url) 

Aber das scheint wie es ist genau das Gegenteil zu tun, wenn ich es laufen (es scheint, wie es zieht hält immer wieder die gleiche Webseite, bis sie eine bekommt Error).

Ich bin ziemlich neu in Python und ich bin nur mit einem Hobby-Projekt herumspielen, also nicht davon ausgehen, dass ich sehr viel verstehe. Ich bin mir sicher, dass ich einen dummen Fehler gemacht habe, aber ich kann nicht herausfinden, was ich falsch gemacht habe.

Antwort

10

urllib.urlopen wirft eine exception. Sie müssen die try und except Aussagen zu „fangen“ die Ausnahme verwenden, wie folgt aus:

while True: 
    try: 
    web_raw_results = urllib2.urlopen(web_url) 
    break 
    except urllib.HTTPError: 
    continue 

Diese Schleife wird kontinuierlich, bis das gelingt holen. Sie tun nicht wirklich wollen dies tun; Das wiederholte Anfordern einer URL in einer solchen engen Schleife wäre wahrscheinlich vom Server-Betreiber verpönt. Vielleicht möchten Sie vor dem erneuten Versuch eine Verzögerung einfügen, und Sie möchten sich möglicherweise anders verhalten, je nachdem, ob Sie einen 500-Fehler oder etwas anderes erhalten. Vielleicht:

while True: 
    try: 
    web_raw_results = urllib2.urlopen(web_url) 
    break 
    except urllib.HTTPError, detail: 
    if detail.errno == 500: 
     time.sleep(1) 
     continue 
    else: 
     raise 

Dies wird für 1 Sekunde anhalten und die Schleife im Falle eines 500 Fehler fortzusetzen; andernfalls wird raise die Ausnahme (übergeben Sie es auf dem Call-Stack).

Die Python tutorial hat viele gute Informationen.

+0

Nichts wie Ihre Antwort zu bekommen geschrieben, und feststellen, dass jemand bereits eine noch bessere Antwort gepostet –

+0

:-) Eigentlich bist du die Pause fehlt, wie in mein Beispiel. Deine Schleife wird für immer enden. –

+0

Guter Fang. Behoben! – larsks

3

Ich würde so etwas tun:

import time 
RETRY_TIME = 20.0 
while True: 
    try: 
     web_raw_results = urllib2.urlopen(web_url) 
     break 
    except urllib2.HTTPError: 
     time.sleep(RETRY_TIME) 
     pass 
Verwandte Themen