2 votes

Python : Télécharger rapidement plusieurs fichiers

En Python, comment puis-je télécharger rapidement un ensemble de fichiers ? urllib.urlretrieve() est très lent, et je ne sais pas trop comment m'y prendre.

J'ai une liste de 15 à 20 fichiers à télécharger, et cela prend une éternité rien que pour en télécharger un. Chaque fichier fait environ 2-4 mb.

Je n'ai jamais fait cela auparavant et je ne sais pas vraiment par où commencer. Dois-je utiliser le filtrage et en télécharger quelques-uns à la fois ? Ou dois-je utiliser le threading pour télécharger des morceaux de chaque fichier, mais un fichier à la fois, ou devrais-je même utiliser le threading ?

1voto

Jon Clements Points 51556

urllib.urlretrieve() est très lent

Vraiment ? Si vous avez 15 à 20 fichiers de 2 à 4 Mo chacun, je les alignerais et les téléchargerais. Le goulot d'étranglement sera la bande passante pour votre serveur et pour vous-même. Donc, IMHO, ça ne vaut pas la peine de faire un thread ou d'essayer quelque chose d'intelligent dans ce cas...

1voto

Ako Points 1896

Une solution (qui n'est pas spécifique à Python) consiste à enregistrer les URL de téléchargement dans un autre fichier et à les télécharger à l'aide d'un programme de gestion des téléchargements tel que wget o aria2 . Vous pouvez invoquer le gestionnaire de téléchargement à partir de votre programme Python.

Mais comme @Jon l'a mentionné, ce n'est pas vraiment nécessaire dans votre cas. urllib.urlretrieve() suffit !

Une autre option consiste à utiliser Mécaniser pour télécharger les fichiers.

1voto

Essayez d'utiliser le module wget de python. Voici un extrait de code.

import wget
wget.download(url, out = path)

0voto

miku Points 63392

stream.py est une interface expérimentale, mais mignonne, pour la mise en parallèle de Python (via des threads ou des processus), basée sur des idées issues de la programmation de flux de données : Un récupérateur d'URL est fourni dans les exemples :

Puisque c'est court :

#!/usr/bin/env python

"""
Demonstrate the use of a ThreadPool to simultaneously retrieve web pages.
"""

import urllib2
from stream import ThreadPool

URLs = [
    'http://www.cnn.com/',
    'http://www.bbc.co.uk/',
    'http://www.economist.com/',
    'http://nonexistant.website.at.baddomain/',
    'http://slashdot.org/',
    'http://reddit.com/',
    'http://news.ycombinator.com/',
]

def retrieve(urls, timeout=30):
    for url in urls:
        yield url, urllib2.urlopen(url, timeout=timeout).read()

if __name__ == '__main__':
    retrieved = URLs >> ThreadPool(retrieve, poolsize=4)
    for url, content in retrieved:
        print '%r is %d bytes' % (url, len(content))
    for url, exception in retrieved.failure:
        print '%r failed: %s' % (url, exception)

Il suffit de remplacer urllib2.urlopen(url, timeout=timeout).read() con urlretrieve... .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X