¿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.
¿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.
No haga esto. Use en su lugar urllib2
o urlgrabber
.
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.
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))
hay un error en 'download_url, save_as = queue.get()'. debe ser 'download_url, save_as = self.queue.get()'. – disfated
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.
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
Python es un buen lenguaje de scripting. –
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>
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/). –
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.
¿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 –