2009-03-01 10 views
9

Sto scaricando un enorme insieme di file con il codice riportato di seguito in un ciclo:come time-out con grazia durante il download con Python

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

se il server di tempi-out url2download URL quando la connessione è solo avviando , l'ultima eccezione viene gestita correttamente. Ma a volte server ha risposto, e viene avviato il download, ma il server è così lento, che Sarà vogliono ore per anche un solo file, e alla fine restituisce qualcosa come:

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

e si blocca proprio lì (anche se nessun nome utente/passworde viene richiesto se lo stesso collegamento viene scaricato tramite il browser).

La mia intenzione in questa situazione sarebbe: saltare questo file e passare a quello successivo. La domanda è: come si fa? C'è un modo in Python per specificare quanto tempo è OK per lavorare sul download di un file, e se più tempo è già trascorso, interrompere e andare avanti?

+0

Quello che state vedendo si trova il server di chiedere per l'autenticazione. Di default 'urllib.urlretrieve()' chiederà all'utente di inserire un nome utente e una password. Se vuoi evitare questo, puoi creare una nuova classe derivata da 'urllib.FancyURLOpener' e gestirla da solo "errore". –

risposta

3

C'è una discussione su questo here. Avvertenze (oltre a quelle che citano): Non l'ho provato, e stanno usando urllib2, non urllib (sarebbe un problema per te?) (In realtà, ora che ci penso, questa tecnica sarebbe probabilmente funziona anche per urllib).

4

Se non si è limitato a ciò che è fornito con pitone fuori dalla scatola, allora il modulo urlgrabber potrebbe tornare utile:

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

collegamento urlgrabber non esiste più. –

8

Prova:

import socket

socket.setdefaulttimeout(30)