Comment puis-je télécharger des fichiers (vidéo) avec Python en utilisant wget et les enregistrer localement? Il y aura un tas de fichiers, alors comment savoir qu'un fichier est téléchargé afin de démarrer automatiquement le downloding un autre?
Merci.
Réponse courte (simplifiée). Pour obtenir un fichier
import urllib
urllib.urlretrieve("http://google.com/index.html", filename="local/index.html")
Vous pouvez comprendre comment boucler cela si nécessaire.
Ne fais pas ça. Utilisez soit urllib2
ou urlgrabber
à la place.
Si vous utilisez os.system()
pour générer un processus pour wget
, il se bloquera jusqu'à ce que wget
termine le téléchargement (ou se termine avec une erreur) . Donc, appelez simplement os.system('wget blah')
en boucle jusqu'à ce que vous ayez téléchargé tous vos fichiers.
Vous pouvez également utiliser urllib2
ou httplib
. Vous devrez écrire un code de montant non trivial, mais vous obtiendrez de meilleures performances, car vous pouvez réutiliser une seule connexion HTTP pour télécharger de nombreux fichiers, au lieu d'ouvrir une nouvelle connexion pour chaque fichier.
Aucune raison d'utiliser os.system. Évitez d'écrire un script Shell dans Python et allez avec quelque chose comme urllib.urlretrieve ou un équivalent.
Modifier ... pour répondre à la deuxième partie de votre question, vous pouvez configurer un pool de threads à l'aide de la classe Queue de bibliothèque standard. Puisque vous faites beaucoup de téléchargements, le GIL ne devrait pas être un problème. Générez une liste des URL que vous souhaitez télécharger et alimentez-les dans votre file d'attente de travail. Il gérera l'envoi des requêtes aux threads de travail.
J'attends la fin d'une mise à jour de la base de données, j'ai donc mis cela en place très rapidement.
#!/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))
Installez wget via pypi http://pypi.python.org/pypi/wget/0.
pip install wget
puis exécutez, comme documenté
python -m wget <url>