web-dev-qa-db-fra.com

Utilisation de wget via Python

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.

29
CoreIs

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.

20
Mark Lakata

Ne fais pas ça. Utilisez soit urllib2 ou urlgrabber à la place.

19

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.

10
Adam Rosenfield

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))
9
McJeff

Installez wget via pypi http://pypi.python.org/pypi/wget/0.

pip install wget

puis exécutez, comme documenté

python -m wget <url>
2
BozoJoe