Gibt es parallel wget? Sowas wie fping aber nur zum runterladen?

14

Ich habe nur puf (Parallel URL Fetcher) gefunden, konnte aber keine URLs aus einer Datei lesen. etwas wie

 puf < urls.txt

geht auch nicht.

Das auf dem Server installierte Betriebssystem ist Ubuntu.

Mondwanderer
quelle
Dies könnte mit der Python- und Pycurl-Bibliothek und ein wenig Klebelogik in einem Skript geschehen. Aber ich kenne kein "konserviertes" Werkzeug dafür.
Keith
@ Keith Ist dieser Ansatz besser als die Verwendung einer asynchronen Bibliothek, wie sie bei urllib üblich ist?
Moonwalker
urllib ist nicht für die asynchrone Verwendung konzipiert. Die libcurl hat eine eigene asynchrone Schleife und kann so eingerichtet werden, dass sie über die "Multi" -Schnittstelle mindestens 1000 Abrufe gleichzeitig ausführt.
Keith
@Keith Ihre Antwort gefällt mir am besten. Könnten Sie sie also als "echte" Antwort schreiben, um sie zu würdigen?
Moonwalker

Antworten:

24

Mit GNU Parallel ,

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

oder xargsvon GNU Findutils ,

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

wo ${jobs}ist die maximale Anzahl von wgetIhnen gleichzeitig ausgeführt zulassen möchten (Einstellung -nauf 1einen bekommen wgetAufruf pro Zeile in urls.txt). Ohne -j/ -P, parallelwird so viele Arbeitsplätze in einer Zeit , als CPU - Kern läuft (was nicht notwendigerweise Sinn für macht wgetdurch Netzwerk - IO gebunden), und xargswird einen nach dem anderen ausgeführt werden .

Eine nette Funktion, paralleldie vorbei xargsist, ist, die Ausgabe der gleichzeitig ausgeführten Jobs getrennt zu halten, aber wenn Sie sich nicht darum kümmern, xargsist es wahrscheinlicher, dass sie vorinstalliert ist.

vergänglich
quelle
Das Optimum jobshängt von vielen Faktoren ab:
Pfadlatenz
2

Sie können dies mit Python und der Pycurl-Bibliothek implementieren. Die Pycurl-Bibliothek verfügt über die "Multi" -Schnittstelle, die eine eigene gerade Schleife implementiert, die mehrere gleichzeitige Verbindungen ermöglicht.

Das Interface ist jedoch eher C-artig und daher etwas umständlich im Vergleich zu anderem, eher "Pythonic" -Code.

Ich habe einen Wrapper dafür geschrieben, der einen vollständigeren browserähnlichen Client darauf aufbaut. Sie können dies als Beispiel verwenden. Siehe das Modul pycopia.WWW.client . Der HTTPConnectionManager umschließt die Multi-Schnittstelle.

Keith
quelle
2

Dies funktioniert und funktioniert nicht mit lokalem oder entferntem DoS, wenn die richtigen Einstellungen vorgenommen werden:

(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 {}                             \
)
dhchdhd
quelle
1

Ein Teil der Manpage von GNU Parallel enthält ein Beispiel für ein paralleles rekursives wget.

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

HTML wird zweimal heruntergeladen: Einmal zum Extrahieren von Links und einmal zum Herunterladen auf die Festplatte. Andere Inhalte werden nur einmal heruntergeladen.

Wenn Sie die Antwort des Kurzlebigen nicht benötigen, liegt es auf der Hand.

Ole Tange
quelle
Nur eine späte Information, dass jede parallele plus wget "Lösung" von Natur aus ineffizient ist, da sie das zweimalige Herunterladen von Inhalten erfordert , aufgrund des mehrphasigen Herunterladens langsam ist und es auch nicht gut für Sysops ist, die für all Ihre Bandbreitenverschwendung zahlen müssen, weil Sie es nicht getan haben Verwenden Sie keine effiziente Lösung.
Dhchdhd
0

Die Opfer Ihres Paralell-Downloads werden sich nicht amüsieren: Sie erwarten, dass eine Verbindung für jeden Client bereitgestellt wird, und das Einrichten mehrerer Verbindungen bedeutet insgesamt weniger Clients. (Dh dies wird als unhöfliches Verhalten angesehen).

vonbrand
quelle
1
Möglicherweise lädt er jedoch Dateien von verschiedenen Servern herunter, sodass dies nicht zutrifft.
Renan
Abgesehen von dem, was @vonbrand gesagt hat, könnte es sein, dass Sie "Zu viele Verbindungen" erhalten und nicht alle Dateien herunterladen können. Und es kann etwas langsamer sein (z. B. eine HTTP-Verbindung erneut verwenden,
anstatt
2
Solange Sie die Nummer vernünftig halten, ist es keine große Sache. Als Sie dies geschrieben haben, hat Firefox beispielsweise 15 Verbindungen pro Server verwendet, wenn keine dauerhaften Verbindungen verwendet wurden (seitdem wurde nur versucht, dauerhafte Verbindungen herzustellen, die auf 6 pro Server beschränkt sind). Andere Browser verwenden ähnliche Nummern.
Derobert