2017-01-15 3 views
0

Ich bin auf der Suche nach Daten von einer großen Anzahl von Webseiten mit Python (> 10k) zu analysieren, und ich finde, dass die Funktion, die ich geschrieben habe, oft eine Zeitüberschreitung auftritt Fehler alle 500 Schleifen. Ich habe versucht, dies mit einem Versuch zu beheben - außer Codeblock, aber ich möchte die Funktion verbessern, so wird es versuchen, die URL vier oder fünf Mal zu öffnen, bevor Sie den Fehler zurückgeben. Gibt es eine elegante Möglichkeit, dies zu tun?Erneut versuchen, URL mit Urllib in Python bei Timeout zu öffnen

Mein Code unten:

def url_open(url): 
    from urllib.request import Request, urlopen 
    req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) 
    try: 
     s = urlopen(req,timeout=50).read() 
    except urllib.request.HTTPError as e: 
     if e.code == 404: 
      print(str(e)) 
     else: 
      print(str(e)) 
      s=urlopen(req,timeout=50).read() 
      raise 
    return BeautifulSoup(s, "lxml") 
+0

Mögliches Duplikat von [Wie versucht man, urlib2.request erneut zu versuchen, wenn es fehlschlägt?] (Http://stackoverflow.com/questions/9446387/how-to-retry-urllib2-request-when-fails) – phss

Antwort

0

Ich habe ein Muster, wie dies für erneuten Versuch in der Vergangenheit verwendet:

def url_open(url): 
    from urllib.request import Request, urlopen 
    req = Request(url, headers={'User-Agent': 'Mozilla/5.0'}) 
    retrycount = 0 
    s = None 
    while s is None: 
     try: 
      s = urlopen(req,timeout=50).read() 
     except urllib.request.HTTPError as e: 
      print(str(e)) 
      if canRetry(e.code): 
       retrycount+=1 
       if retrycount > 5: 
        raise 
       # thread.sleep for a bit 
      else: 
       raise 

    return BeautifulSoup(s, "lxml") 

Sie müssen nur canRetry woanders definieren.

Verwandte Themen