2010-03-18 30 views
25

¿Cómo puedo descargar archivos (video) con Python usando wget y guardarlos localmente? Habrá un montón de archivos, entonces ¿cómo sé que se descarga un archivo para comenzar a descargar automáticamente otro?Usando wget vía Python

Gracias.

+3

¿Cómo lo harías? Primero busque todas las preguntas anteriores exactamente como la suya: http://stackoverflow.com/questions/tagged/wget+python. Segundo, lea esta pregunta específica: http://stackoverflow.com/questions/419235/anyone-know-of-a-good-python-based-web-crawler-that-i-could-use –

Respuesta

20

No haga esto. Use en su lugar urllib2 o urlgrabber.

+9

Esta respuesta debe ser expandido. ¿Por qué no se debería usar 'wget'? – muhuk

+10

Porque comienza un proceso completamente nuevo solo para hacer cosas que Python mismo es capaz de hacer. –

+6

porque socava la portabilidad. – Ekevoo

10

Si usa os.system() para generar un proceso para wget, se bloqueará hasta que wget termine la descarga (o salga con un error). Entonces, simplemente llame al os.system('wget blah') en un bucle hasta que haya descargado todos sus archivos.

Como alternativa, puede usar urllib2 o httplib. Tendrá que escribir un código de cantidad no trivial, pero obtendrá un mejor rendimiento, ya que puede reutilizar una única conexión HTTP para descargar muchos archivos, en lugar de abrir una nueva conexión para cada archivo.

9

No hay razón para usar os.system. Evite escribir un script de shell en Python e ir con algo como urllib.urlretrieve o un equivalente.

Editar ... para responder a la segunda parte de su pregunta, puede configurar un grupo de subprocesos utilizando la clase de cola de la biblioteca estándar. Como está realizando muchas descargas, GIL no debería ser un problema. Genere una lista de las URL que desea descargar y aliméntelas a su cola de trabajo. Manejará solicitudes de inserción a hilos de trabajo.

Estoy esperando que se complete una actualización de la base de datos, así que lo puse todo muy rápido.

 

#!/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

hay un error en 'download_url, save_as = queue.get()'. debe ser 'download_url, save_as = self.queue.get()'. – disfated

-4

No hay razón para usar python. Evite escribir un guión de shell en Python e ir con algo como bash o un equivalente.

+1

Escribir un script de shell en Python es correcto.Si quieres hacer algo rápidamente pero odias la sintaxis de bash, solo hazlo en Python. Si realiza un proyecto más grande, entonces sí, intente evitar estas llamadas externas. – Jabba

+3

Python es un buen lenguaje de scripting. –

2

instale wget a través PyPI http://pypi.python.org/pypi/wget/0.3

pip install wget 

continuación, ejecute, al igual que documentó

python -m wget <url> 
+9

Para cualquier otra persona que encuentre esto confuso, la biblioteca vinculada no usa wget. Utiliza urllib. Y actualmente no admite nada parecido a lo que hace wget (http://www.gnu.org/software/wget/). –

18

Respuesta corta (simplificado). Para obtener un archivo

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

Puede averiguar cómo hacer un bucle si es necesario.