Mehrere gleichzeitige Downloads mit Wget?


Antworten:


197

benutze die aria2:

aria2c -x 16 [url]
#          |
#          |
#          |
#          ----> the number of connections 

http://aria2.sourceforge.net

Ich liebe es !!


26
Ich sehe nicht, wie dies beim Herunterladen einer Website hilft - es sieht so aus, als würde nur 1 Datei heruntergeladen. Wenn dies zutrifft, sollten die Stimmen -ve sein.
Stephen

8
Ich stimme zu, dies ist keine gute Antwort, da aria2 keine Web- oder FTP-Spiegelung wie wget oder lftp durchführen kann. lftp spiegelt und unterstützt mehrere Verbindungen.
Anachronist

9
Vergessen Sie nicht -s, die Anzahl der Teilungen und -kdie Mindestgröße pro Teilungssegment anzugeben. Andernfalls erreichen Sie möglicherweise nie die -xmaximale Anzahl von Verbindungen.
Bob

2
@Stephen Dies dient dazu, sehr große Dateien viel schneller von Websites herunterzuladen, indem mehrere Sockets anstelle von einem auf den Server verwendet werden. Dies ist nicht zum Scrapen einer Website gedacht.
gabeio

unterstützt keine Socken *
Fedcomp

111

Wget unterstützt keine Verbindungen mit mehreren Sockets, um das Herunterladen von Dateien zu beschleunigen.

Ich denke, wir können ein bisschen besser als gmarian antworten.

Der richtige Weg ist zu verwenden aria2.

aria2c -x 16 -s 16 [url]
#          |    |
#          |    |
#          |    |
#          ---------> the number of connections here

19
Zu dokumentieren -x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1und-s, --split=N Download a file using N connections. If more than N URIs are given, first N URIs are used and remaining URLs are used for backup. If less than N URIs are given, those URLs are used more than once so that N connections total are made simultaneously. The number of connections to the same host is restricted by the --max-connection-per-server option. See also the --min-split-size option. Possible Values: 1-* Default: 5
Nick

Vielen Dank für die Ausarbeitung der Parameter, Nick.
Thomas.han

4
Die Option -s allein teilt seit der Version 1.10 keine Datei mehr von einem einzelnen Server auf. Man muss --max-connection-per-server zusammen verwenden, um den Aufbau mehrerer Verbindungen zu erzwingen. Siehe aria2 Dokumentation: About the number of connections Since 1.10.0 release, aria2 uses 1 connection per host by default and has 20MiB segment size restriction. So whatever value you specify using -s option, it uses 1 connection per host. To make it behave like 1.9.x, use --max-connection-per-server=4 --min-split-size=1M.
Samuel Li

1
Die Abkürzung von @ SamuelLis Update ist aria2c -x 4 -k 1M urlund hat gut für mich funktioniert (ein Server mit einem Limit von 100.000 pro Verbindung lässt mich bei 400.000 mit diesen Parametern herunterladen)
EkriirkE

Kritisch, aria2unterstützt keine rekursiven HTTP-Downloads, was es zu einem minderwertigen Ersatz macht, wgetwenn dies -rgewünscht wird.
user2943160

54

Da GNU parallel noch nicht erwähnt wurde, möchte ich einen anderen Weg angeben:

cat url.list | parallel -j 8 wget -O {#}.html {}

4
Das ist ein interessanter Ansatz. Nicht wirklich anwendbar, wenn Sie eine große Datei herunterladen müssen und die Geschwindigkeit pro Verbindung begrenzt ist, kann aber beim Herunterladen mehrerer Dateien hilfreich sein.
Nikola Petkanski

Wenn Sie diesen Befehl ausführen, wird die Liste achtmal ausgeführt, nein? Ich habe es auf die gleiche Weise gemacht und anstatt jede Zeile mit 8 Parallelen zu verarbeiten, wird nur die gesamte Liste 8 Mal verarbeitet.
DomainsFeatured

4
Nein, es teilt die Liste auf 8 Jobs
Nikolay Shmyrev

Okay, ich mache definitiv etwas Seltsames. Werde es herausfinden. Danke für die schnelle Antwort.
DomainsFeatured

1
Das ist jedoch eine nutzlose Verwendungcat . In diesem begrenzten Kontext ist es ziemlich harmlos, aber vielleicht möchten Sie dieses Antimuster nicht verüben.
Tripleee

39

Ich habe (wahrscheinlich) eine Lösung gefunden

Beim Herunterladen einiger tausend Protokolldateien von einem Server zum nächsten musste ich plötzlich ernsthafte Multithread-Downloads in BSD durchführen, vorzugsweise mit Wget, da dies die einfachste Möglichkeit war, dies zu handhaben. Ein kleiner Blick führte mich zu diesem kleinen Nugget:

wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url] &
wget -r -np -N [url]

Wiederholen wget -r -np -N [url]Sie dies einfach für so viele Threads, wie Sie benötigen ... Nun, da dies nicht schön ist und es sicherlich bessere Möglichkeiten gibt, dies zu tun, aber wenn Sie etwas schnelles und schmutziges wollen, sollte es den Trick tun ...

Hinweis: die Option -Nmacht wgetnur Download „neuere“ Dateien, was bedeutet , es wird nicht überschreiben oder neu Download - Dateien , wenn ihre Zeitstempel Änderungen auf dem Server.


11
Aber lädt das nicht den gesamten Satz von Artefakten für jeden Prozess herunter?
Kai Mattern

10
@KaiMattern: Fügen Sie die -ncOption "no clobber" hinzu. Dadurch ignoriert wget bereits heruntergeladene (auch teilweise) Dateien.
SF.

1
Ich hatte eine Liste von Bildern, die ich herunterladen musste, und das funktionierte auch für mich: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncSehr hässlich, aber hey, es funktioniert. : P
Jared

1
Wenn eine dieser Verbindungen aus irgendeinem Grund unterbrochen wird, erhalten Sie unvollständige Dateien, ohne von anderen Verbindungen berührt zu werden. Diese Methode führt zu Integritätsproblemen.
Muhammedv

Das -bFlag führt den wget-Prozess im Hintergrund aus, als Alternative zur integrierten &Jobsteuerung von bash . STDOUT wird in wget-log geschrieben, wenn -o <filename>nichts angegeben ist. Gut für Skripte. Siehe wget (1) für weitere Details.
Paul

21

Ein anderes Programm, das dies tun kann, ist axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

Für baisic HTTP Auth,

axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"

Ubuntu Manpage .


5
Dieses Programm ermöglicht eine unbegrenzte Anzahl von Verbindungen, was in einigen Fällen sehr nützlich ist.
Uglide


Axel kann keine HTTP-
Basisauthentifizierung durchführen

1
Normalerweise tue ich dasaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Lord Loh.

Kann ich Axel verwenden, um einen ganzen Ordner rekursiv herunterzuladen?
Ryan Arief

17

Ein neues (aber noch nicht veröffentlichtes) Tool ist Mget . Es verfügt bereits über viele von Wget bekannte Optionen und eine Bibliothek, mit der Sie das Herunterladen einfach (rekursiv) in Ihre eigene Anwendung einbetten können.

Zur Beantwortung Ihrer Frage:

mget --num-threads=4 [url]

AKTUALISIEREN

Mget wurde jetzt als Wget2 entwickelt, mit vielen behobenen Fehlern und mehr Funktionen (z. B. HTTP / 2-Unterstützung).

--num-threadsist jetzt --max-threads.


Schöner Fund. Danke dir!
user9869932

Gibt es Tipps zur Installation von wget2 auf einem Mac? Site dokumentiert nur, wie man es von der Quelle installiert und Probleme hat, Autopoint zu bekommen
Chris

In unserem TravisCI-Skript verwenden wir Homebrew, um gettext (einschließlich Autopoint) zu installieren. Schauen Sie sich .travis_setup.sh aus dem wget2-Repo an.
Rockdaboot

13

Ich empfehle dringend, httrack zu verwenden.

Ex: httrack -v -w http://example.com/

Standardmäßig wird ein Spiegel mit 8 gleichzeitigen Verbindungen erstellt. Httrack bietet unzählige Möglichkeiten zum Spielen. Guck mal.


@ aaa90210: Es wäre großartig, wenn Sie die Programmmängel kurz und bündig erklärt hätten. Der Kommentar von ArturBodera ist viel informativer.
Richard

@ArturBodera Sie können dem Ordner, in dem Sie Ihr Programm ausführen, die Datei cookies.txt hinzufügen, die diese Cookies automatisch zum Download-Header hinzufügt.
Bertoncelj1

httrack unterstützt keine folgenden Weiterleitungen
Chris Hunt

11

Wie andere Poster bereits erwähnt haben, würde ich vorschlagen, dass Sie sich aria2 ansehen . Von der Ubuntu-Manpage für Version 1.16.1:

aria2 ist ein Dienstprogramm zum Herunterladen von Dateien. Die unterstützten Protokolle sind HTTP (S), FTP, BitTorrent und Metalink. aria2 kann eine Datei von mehreren Quellen / Protokollen herunterladen und versucht, Ihre maximale Download-Bandbreite zu nutzen. Es unterstützt das gleichzeitige Herunterladen einer Datei von HTTP (S) / FTP und BitTorrent, während die von HTTP (S) / FTP heruntergeladenen Daten in den BitTorrent-Schwarm hochgeladen werden. Mit den Chunk-Prüfsummen von Metalink überprüft aria2 automatisch Datenblöcke, während eine Datei wie BitTorrent heruntergeladen wird.

Mit dem -xFlag können Sie die maximale Anzahl von Verbindungen pro Server angeben (Standard: 1):

aria2c -x 16 [url] 

Wenn dieselbe Datei an mehreren Speicherorten verfügbar ist, können Sie sie von allen herunterladen. Verwenden Sie das -jFlag, um die maximale Anzahl paralleler Downloads für jeden statischen URI anzugeben (Standard: 5).

aria2c -j 5 [url] [url2]

Werfen Sie einen Blick auf http://aria2.sourceforge.net/ für weitere Informationen. Für Verwendungsinformationen ist die Manpage sehr beschreibend und enthält unten einen Abschnitt mit Verwendungsbeispielen. Eine Online-Version finden Sie unter http://aria2.sourceforge.net/manual/en/html/README.html .


8

wget kann nicht in mehreren Verbindungen heruntergeladen werden, stattdessen können Sie versuchen, ein anderes Programm wie aria2 zu verwenden.



4

verwenden

aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &

Geben Sie in website.txt 1 URL pro Zeile ein. Beispiel:

https://www.example.com/1.mp4
https://www.example.com/2.mp4
https://www.example.com/3.mp4
https://www.example.com/4.mp4
https://www.example.com/5.mp4

2

Sie sagen immer, es kommt darauf an, aber wenn es um das Spiegeln einer Website geht, gibt es den besten httrack . Es ist super schnell und einfach zu arbeiten. Der einzige Nachteil ist das sogenannte Support-Forum, aber Sie können sich anhand der offiziellen Dokumentation zurechtfinden . Es hat sowohl eine GUI- als auch eine CLI-Oberfläche und unterstützt Cookies. Lesen Sie einfach die Dokumente. Dies ist das Beste. (Mit diesem Tool können Sie das gesamte Web auf Ihre Festplatte herunterladen.)

httrack -c8 [url]

Standardmäßig ist die maximale Anzahl gleichzeitiger Verbindungen auf 8 begrenzt, um eine Überlastung des Servers zu vermeiden


2

Verwenden Sie xargsdiese Option, um wgetmehrere Dateien parallel zu bearbeiten

#!/bin/bash

mywget()
{
    wget "$1"
}

export -f mywget

# run wget in parallel using 8 thread/connection
xargs -P 8 -n 1 -I {} bash -c "mywget '{}'" < list_urls.txt

Aria2-Optionen, Der richtige Weg, um mit Dateien zu arbeiten, die kleiner als 20 MB sind

aria2c -k 2M -x 10 -s 10 [url]

-k 2M Datei in 2 MB Block aufteilen

-koder --min-split-sizehat einen Standardwert von 20 MB. Wenn Sie diese Option und Datei nicht unter 20 MB festlegen, wird sie nur in einer einzigen Verbindung ausgeführt, unabhängig vom Wert von -xoder-s


1

makekann leicht parallelisiert werden (zB make -j 4). Hier ist zum Beispiel eine einfache MakefileMethode, mit der ich Dateien parallel mit wget herunterladen kann:

BASE=http://www.somewhere.com/path/to
FILES=$(shell awk '{printf "%s.ext\n", $$1}' filelist.txt)
LOG=download.log

all: $(FILES)
    echo $(FILES)

%.ext:
    wget -N -a $(LOG) $(BASE)/$@

.PHONY: all
default: all

0

Erwägen Sie die Verwendung von regulären Ausdrücken oder FTP-Globbing . Auf diese Weise können Sie wget mehrmals mit verschiedenen Gruppen von Dateinamen-Startzeichen starten, abhängig von ihrer Häufigkeit.

So synchronisiere ich beispielsweise einen Ordner zwischen zwei NAS:

wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.10 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[0-9a-hA-H]*" --directory-prefix=/volume1/foo &
wget --recursive --level 0 --no-host-directories --cut-dirs=2 --no-verbose --timestamping --backups=0 --bind-address=10.0.0.11 --user=<ftp_user> --password=<ftp_password> "ftp://10.0.0.100/foo/bar/[!0-9a-hA-H]*" --directory-prefix=/volume1/foo &

Das erste Wget synchronisiert alle Dateien / Ordner beginnend mit 0, 1, 2... F, G, Hund der zweite Thread synchronisiert alles andere.

Dies war der einfachste Weg, um zwischen einem NAS mit einem 10G-Ethernet-Port (10.0.0.100) und einem NAS mit zwei 1G-Ethernet-Ports (10.0.0.10 und 10.0.0.11) zu synchronisieren. Ich habe die beiden Wget-Threads --bind-addressan die verschiedenen Ethernet-Ports gebunden und sie parallel genannt, indem ich sie &am Ende jeder Zeile platziert habe. Dadurch konnte ich riesige Dateien mit insgesamt 2x 100 MB / s = 200 MB / s kopieren.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.