2009-03-01 4 views
9

Je télécharge un vaste ensemble de fichiers avec le code suivant dans une boucle:comment le temps grâce à tout téléchargement avec python

try: 
    urllib.urlretrieve(url2download, destination_on_local_filesystem) 
except KeyboardInterrupt: 
    break 
except: 
    print "Timed-out or got some other exception: "+url2download 

Si le temps-out serveur sur URL url2download lorsque la connexion est simplement initient , la dernière exception est gérée correctement. Mais parfois, le serveur a répondu, et le téléchargement est démarré, mais le serveur est si lent, que ça va prendre des heures, même pour un fichier, et finalement il retourne quelque chose comme:

Enter username for Clients Only at albrightandomalley.com: 
Enter password for in Clients Only at albrightandomalley.com: 

et se bloque juste là (même si aucun nom d'utilisateur/passworde est activé si le même lien est téléchargé via le navigateur).

Mon intention dans cette situation serait - passer ce fichier et aller à la suivante. La question est - comment faire cela? Existe-t-il un moyen, en python, de spécifier combien de temps durera le téléchargement d'un fichier, et si plus de temps est déjà passé, d'interrompre et d'avancer?

+0

Ce que vous voyez, il est de demander au serveur d'authentification. Par défaut 'urllib.urlretrieve()' demandera à l'utilisateur d'entrer un nom d'utilisateur et un mot de passe. Si vous voulez éviter cela, vous pouvez créer une nouvelle classe dérivée de 'urllib.FancyURLOpener' et gérer vous-même cette" erreur ". –

Répondre

3

Il y a une discussion à ce sujet here. Avertissements (en plus de ceux qu'ils mentionnent): Je n'ai pas essayé, et ils utilisent urllib2, pas urllib (ce serait un problème pour vous?) (En fait, maintenant que je pense à ce sujet, cette technique serait probablement travailler pour urllib, aussi).

4

Si vous n'êtes pas limité à ce qui est livré avec python hors de la boîte, le module urlgrabber pourrait être utile:

import urlgrabber 
urlgrabber.urlgrab(url2download, destination_on_local_filesystem, 
        timeout=30.0) 
+0

Le lien urlgrabber n'existe plus. –

8

Essayez:

import socket

socket.setdefaulttimeout(30)

Questions connexes