2009-03-01 6 views
9

ich mit folgendem Code in einer Schleife eine riesige Menge von Dateien herunterzuladen:wie anmutig Timeout während mit Python Download

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

Wenn die Server-mal-out auf URL url2download, wenn die Verbindung nur initiiert Die letzte Ausnahme wird ordnungsgemäß behandelt. Aber manchmal reagiert Server, und das Herunterladen gestartet, aber der Server ist so langsam, dass es dann Stunden dauert es noch eine Datei, und schließlich gibt es so etwas wie:

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

und hängt nur dort (obwohl kein Benutzername/passworde wird geantwortet, wenn der gleiche Link über den Browser heruntergeladen wird).

Meine Absicht in dieser Situation wäre - überspringen Sie diese Datei und gehen Sie zum nächsten. Die Frage ist - wie geht das? Gibt es einen Weg in Python zu spezifizieren, wie lange es OK ist, beim Herunterladen einer Datei zu arbeiten, und wenn mehr Zeit bereits verbraucht ist, unterbrechen Sie und gehen Sie weiter?

+0

Was Sie sehen, da der Server für die Authentifizierung fragen ist. Standardmäßig fordert 'urllib.urlretrieve()' den Benutzer auf, einen Benutzernamen und ein Passwort einzugeben. Wenn Sie dies vermeiden möchten, können Sie eine neue Klasse erstellen, die von 'urllib.FancyURLOpener' abgeleitet ist und diesen" Fehler "selbst behandeln. –

Antwort

3

Es gibt eine Diskussion dieser here. Vorbehalte (zusätzlich zu den, die sie erwähnen): Ich habe es nicht versucht, und sie verwenden urllib2, nicht urllib (wäre das ein Problem für Sie?) (Eigentlich, jetzt, wo ich darüber nachdenke, würde diese Technik wahrscheinlich auch für urllib arbeiten).

4

Wenn Sie sich nicht darauf beschränkt, was mit Python ausgeliefert ist aus der Box, dann ist das urlgrabber Modul könnte sich als nützlich erweisen:

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

URL-Link existiert nicht mehr. –

8

Versuchen:

import socket

socket.setdefaulttimeout(30)