Existe-t-il un wget parallèle? Quelque chose comme fping mais uniquement pour le téléchargement?


15

Je n'ai trouvé que puf (récupérateur d'URL parallèle) mais je n'ai pas pu le faire lire les URL d'un fichier; quelque chose comme

 puf < urls.txt

ne fonctionne pas non plus.

Le système d'exploitation installé sur le serveur est Ubuntu.


Cela pourrait être fait avec la bibliothèque Python et pycurl et un peu de logique de collage dans un script. Mais je ne connais pas d'outil "en conserve" pour cela.
Keith

@Keith Cette approche est-elle meilleure que l'utilisation d'une bibliothèque asynchrone comme gevent avec urllib?
Moonwalker

urllib n'est pas conçu pour être utilisé de manière asynchrone. La libcurl possède sa propre boucle asynchrone et peut être configurée pour effectuer au moins 1000 récupérations simultanées en utilisant l'interface "multi".
Keith

@Keith J'aime mieux votre réponse, alors pourriez-vous l'écrire comme une "vraie" réponse pour en prendre le crédit?
Moonwalker

Réponses:


25

En utilisant GNU Parallel ,

$ parallel -j $ {jobs} wget <urls.txt

ou xargsde GNU Findutils ,

$ xargs -n 1 -P $ {jobs} wget <urls.txt

${jobs}est le nombre maximum de wgetvous voulez permettre d'exécuter simultanément (mise -nà 1obtenir un wgetappel par ligne urls.txt). Sans -j/ -P, parallelexécutera autant de tâches à la fois que de cœurs de processeur (ce qui n'a pas nécessairement de sens pour wgetlié par les E / S réseau), et xargss'exécutera une à la fois.

Une fonctionnalité intéressante qui parallela dépassé le xargsfait de garder la sortie des travaux exécutés simultanément séparés, mais si vous ne vous en souciez pas, elle xargsest plus susceptible d'être préinstallée.


Optimal jobsdépend de nombreux facteurs: latence du chemin, bande passante du chemin, politiques du serveur distant, etc.
dhchdhd


2

Vous pouvez l'implémenter en utilisant Python et la bibliothèque pycurl. La bibliothèque pycurl possède l'interface "multi" qui implémente sa propre boucle paire qui permet plusieurs connexions simultanées.

Cependant, l'interface est plutôt semblable à C et donc un peu lourde par rapport à d'autres codes, plus "Pythonic".

J'ai écrit un wrapper pour cela qui construit un client de type navigateur plus complet par-dessus. Vous pouvez utiliser cela comme exemple. Voir le module pycopia.WWW.client . HTTPConnectionManager encapsule la multi-interface.


2

Cela fonctionne, et ne sera pas DoS local ou distant, avec des ajustements appropriés:

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)

1

Une partie de la page de manuel de GNU Parallel contient un exemple de wget récursif parallèle.

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

Le HTML est téléchargé deux fois: une fois pour l'extraction des liens et une fois pour le téléchargement sur le disque. Les autres contenus ne sont téléchargés qu'une seule fois.

Si vous n'avez pas besoin de la réponse récursive, l'éphémient semble évident.


Juste une information tardive que toute "solution" parallèle plus wget est à la fois inefficace car elle nécessite le téléchargement de contenu deux fois , lente à cause de tout le téléchargement multiphase et ce n'est pas agréable non plus pour les sysops qui doivent payer pour tout votre gaspillage de bande passante parce que vous ne l'avez pas fait n'utilisez pas une solution efficace.
dhchdhd

0

Les victimes de votre téléchargement parallèle ne seront pas amusées: elles s'attendent à ce qu'une connexion serve chaque client, la configuration de plusieurs connexions signifie moins de clients dans l'ensemble. (C'est à dire, cela est considéré comme un comportement grossier).


1
Mais il pourrait télécharger des fichiers à partir de différents serveurs, donc cela ne s'appliquerait pas.
Renan

Outre ce que @vonbrand a dit, vous pourriez obtenir quelque chose comme "Trop de connexions" et ne pas pouvoir télécharger tous les fichiers. Et cela peut être un peu plus lent (par exemple, réutiliser une connexion HTTP par rapport à créer plusieurs connexions HTTP)
golimar

2
Tant que vous gardez le chiffre sain, ce n'est pas grave. Par exemple, au moment où vous avez écrit ceci, Firefox utilisait 15 connexions par serveur lorsqu'il n'utilisait pas de connexions persistantes (ils sont depuis passés à n'essayer que les connexions persistantes, qui sont limitées à 6 par serveur). D'autres navigateurs utilisent des numéros similaires.
derobert
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.