2010-08-18 3 views
3

Je suis encore relativement nouveau sur Python, donc si c'est une question évidente, je m'en excuse.Détection des erreurs de timeout dans urllib2 urlopen de Python

Ma question concerne la bibliothèque urllib2, et sa fonction urlopen. Actuellement je l'utilise pour charger une grande quantité de pages d'un autre serveur (ils sont tous sur le même hôte distant) mais le script est tué de temps en temps par une erreur de timeout (je suppose que cela provient des grandes requêtes).

Existe-t-il un moyen de conserver le script après un délai d'attente? J'aimerais pouvoir aller chercher toutes les pages, donc je veux un script qui continuera à essayer jusqu'à ce qu'il ait une page, puis il ira de l'avant. Sur une note de côté, est-ce que garder la connexion ouverte à l'aide du serveur?

Répondre

2

La prochaine fois que l'erreur se produit, prenez note du message d'erreur. La dernière ligne vous dira le type d'exception. Par exemple, il peut s'agir d'un urllib2.HTTPError. Une fois que vous connaissez le type d'exception soulevé, vous pouvez l'attraper dans un bloc try...except. Par exemple:

import urllib2 
import time 

for url in urls: 
    while True: 
     try: 
      sock=urllib2.urlopen(url) 
     except (urllib2.HTTPError, urllib2.URLError) as err: 
      # You may want to count how many times you reach here and 
      # do something smarter if you fail too many times. 
      # If a site is down, pestering it every 10 seconds may not 
      # be very fruitful or polite. 
      time.sleep(10) 
     else:    
      # Success 
      contents=sock.read() 
      # process contents 
      break    # break out of the while loop 
+0

Donc, si je comprends bien, cela rendra « essayer » jusqu'à ce qu'il ne retourne pas une erreur? – Parker

+0

@Parker: Lorsque Python atteint le code dans le bloc 'try', si un' urllib2.HTTPError' ou 'urllib2.URLError' se produit, Python ira dans le bloc' except'. Si aucune exception ne se produit, alors Python ira dans le bloc 'else'. – unutbu

Questions connexes