2010-03-18 16 views
25

Come scaricare file (video) con Python utilizzando wget e salvarli localmente? Ci saranno un sacco di file, quindi come faccio a sapere che un file viene scaricato in modo da iniziare automaticamente a scaricarne un altro?Utilizzo di wget tramite Python

Grazie.

+3

Come lo faresti? Prima cerca tutte le domande precedenti esattamente come la tua: http://stackoverflow.com/questions/tagged/wget+python. In secondo luogo, leggi questa domanda specifica: http://stackoverflow.com/questions/419235/anyone-know-of-a-good-python-based-web-crawler-that-i-could-use –

risposta

20

Non farlo. Utilizzare invece urllib2 o urlgrabber.

+9

Questa risposta deve essere allargato. Perché non dovrebbe essere usato 'wget'? – muhuk

+10

Perché avvia un processo completamente nuovo solo per fare cose di cui lo stesso Python è capace. –

+6

Perché compromette la portabilità. – Ekevoo

10

Se si utilizza per generare un processo per wget, esso bloccherà fino al termine del download (o si interromperà con un errore) fino al wget. Quindi, chiama lo os.system('wget blah') in un ciclo finché non hai scaricato tutti i tuoi file.

In alternativa, è possibile utilizzare urllib2 o httplib. Dovrai scrivere un codice quantità non banale, ma otterrai prestazioni migliori, dal momento che puoi riutilizzare una singola connessione HTTP per scaricare molti file, invece di aprire una nuova connessione per ogni file.

9

Nessun motivo per utilizzare os.system. Evita di scrivere uno script di shell in Python e vai con qualcosa come urllib.urlretrieve o un equivalente.

Modifica ... per rispondere alla seconda parte della domanda, è possibile impostare un pool di thread utilizzando la classe Coda della libreria standard. Dato che stai facendo un sacco di download, GIL non dovrebbe essere un problema. Genera un elenco degli URL che desideri scaricare e inseriscili nella tua coda di lavoro. Gestirà le richieste di push ai thread dei lavoratori.

Sto aspettando il completamento di un aggiornamento del database, quindi l'ho messo insieme molto rapidamente.

 

#!/usr/bin/python 

import sys 
import threading 
import urllib 
from Queue import Queue 
import logging 

class Downloader(threading.Thread): 
    def __init__(self, queue): 
     super(Downloader, self).__init__() 
     self.queue = queue 

    def run(self): 
     while True: 
      download_url, save_as = queue.get() 
      # sentinal 
      if not download_url: 
       return 
      try: 
       urllib.urlretrieve(download_url, filename=save_as) 
      except Exception, e: 
       logging.warn("error downloading %s: %s" % (download_url, e)) 

if __name__ == '__main__': 
    queue = Queue() 
    threads = [] 
    for i in xrange(5): 
     threads.append(Downloader(queue)) 
     threads[-1].start() 

    for line in sys.stdin: 
     url = line.strip() 
     filename = url.split('/')[-1] 
     print "Download %s as %s" % (url, filename) 
     queue.put((url, filename)) 

    # if we get here, stdin has gotten the ^D 
    print "Finishing current downloads" 
    for i in xrange(5): 
     queue.put((None, None)) 
 
+1

c'è un errore in 'download_url, save_as = queue.get()'. dovrebbe essere 'download_url, save_as = self.queue.get()'. – disfated

-4

Nessun motivo per utilizzare python. Evita di scrivere uno script di shell in Python e vai con qualcosa come bash o un equivalente.

+1

Scrivere uno script di shell in Python è OK.Se vuoi fare qualcosa in fretta ma odi la sintassi di bash, fallo in Python. Se realizzi un progetto più grande, allora si, cerca di evitare queste chiamate esterne. – Jabba

+3

Python è un ottimo linguaggio di scripting. –

2

Installare wget tramite PyPI http://pypi.python.org/pypi/wget/0.3

pip install wget 

quindi eseguire, così come documentato

python -m wget <url> 
+9

Per chiunque abbia trovato questa confusione, la libreria collegata non utilizza wget. Usa urllib. E attualmente non supporta nulla di simile a ciò che fa wget (http://www.gnu.org/software/wget/). –

18

Risposta breve (semplificato). Per ottenere un file

import urllib 
urllib.urlretrieve("http://google.com/index.html", filename="local/index.html") 

È possibile capire come eseguire il ciclo, se necessario.