Wiele jednoczesnych pobrań przy użyciu Wget?


Odpowiedzi:


197

użyj aria2:

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

http://aria2.sourceforge.net

Kocham to !!


26
Nie widzę, jak to pomaga pobrać stronę internetową - wygląda na to, że pobiera tylko 1 plik. Jeśli to prawda - głosy powinny być -ve.
Stephen

8
Zgadzam się, to nie jest dobra odpowiedź, ponieważ aria2 nie może wykonywać kopii lustrzanych w sieci lub ftp, takich jak wget lub lftp. lftp wykonuje kopię lustrzaną, a także obsługuje wiele połączeń.
Anachronista

9
Nie zapomnij -spodać liczby podziałów i -kokreślić minimalny rozmiar na segment podziału - w przeciwnym razie możesz nigdy nie osiągnąć -xmaksymalnych połączeń.
Bob

2
@Stephen ma to na celu znacznie szybsze pobieranie bardzo dużych plików ze stron internetowych przy użyciu wielu gniazd na serwerze zamiast jednego. Nie jest to przeznaczone do skrobania strony internetowej.
gabeio

nie obsługuje skarpet *
Fedcomp

111

Wget nie obsługuje wielu połączeń gniazd w celu przyspieszenia pobierania plików.

Myślę, że możemy zrobić trochę lepiej niż odpowiedź gminy.

Prawidłowym sposobem jest użycie aria2.

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

19
Do udokumentowania -x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1i-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

Dzięki za opracowanie parametrów, Nick.
thomas.han

4
Sama opcja -s nie dzieli już pliku z jednego serwera od czasu wydania 1.10. Należy użyć --max-connection-per-server razem, aby wymusić ustanowienie wielu połączeń. Zobacz dokumentację aria2: 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
Skrót aktualizacji @ SamuelLi jest aria2c -x 4 -k 1M urli działał dla mnie dobrze (serwer z limitem 100 000 na połączenie pozwala mi pobierać przy 400 000 ze wspomnianymi parametrami)
EkriirkE

Krytycznie, aria2czy nie obsługują rekurencyjne pobieranie HTTP, dzięki czemu wymiana normom dla wgetjeśli -rpożądane.
user2943160

55

Ponieważ GNU równolegle nie zostało jeszcze wspomniane, pozwól mi podać inny sposób:

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

5
To ciekawe podejście. Nie ma to zastosowania, gdy trzeba pobrać ogromny plik, a prędkość połączenia jest ograniczona, ale może być przydatna podczas pobierania wielu plików.
Nikola Petkanski

Uruchomienie tego polecenia uruchomiłoby listę 8 razy, nie? Zrobiłem to w ten sam sposób i zamiast przetwarzać każdą linię z 8 równoległymi procesami, po prostu przetwarza całą listę 8 razy.
DomainsFeatured 18.09.16

4
Nie, dzieli listę na 8 miejsc pracy
Nikolay Shmyrev

Okej, zdecydowanie robię coś dziwnego. Rozgryzę to. Dziękuję za szybką odpowiedź.
DomainsFeatured 18.09.16

1
Jest to jednak bezużyteczne użyciecat . W tym ograniczonym kontekście jest to całkiem nieszkodliwe, ale być może nie chcesz stosować tego anty-wzoru.
tripleee

39

Znalazłem (prawdopodobnie) rozwiązanie

Podczas pobierania kilku tysięcy plików dziennika z jednego serwera na drugi nagle miałem potrzebę poważnego pobierania wielowątkowego w BSD, najlepiej z Wget, ponieważ był to najprostszy sposób, w jaki mogłem sobie z tym poradzić. Trochę się rozejrzałem i doprowadziłem do tego małego samorodka:

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

Po prostu powtórz wget -r -np -N [url]tyle wątków, ile potrzebujesz ... Teraz biorąc pod uwagę, że to nie jest ładne i są na pewno lepsze sposoby na zrobienie tego, ale jeśli chcesz czegoś szybkiego i brudnego, powinno wystarczyć ...

Uwaga: opcja -Npowoduje wgetpobieranie tylko „nowszych” plików, co oznacza, że ​​nie będzie zastępować ani ponownie pobierać plików, chyba że ich znacznik czasu zmieni się na serwerze.


11
Ale czy to nie pobiera całego zestawu artefaktów dla każdego procesu?
Kai Mattern

10
@KaiMattern: dodaj -ncopcję: „bez clobber” - powoduje, że wget ignoruje często pobierane (nawet częściowo) pliki.
SF.

1
Miałem listę zdjęć, które musiałem pobrać, i to również działało dla mnie: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncBardzo brzydkie, ale hej, to działa. : P
Jared

1
Zerwanie jednego z tych połączeń z jakiegoś powodu daje niekompletne pliki, bez dotykania innych połączeń. Ta metoda powoduje problemy z integralnością.
muhammedv,

-bFlaga będzie prowadzony proces wget w tle, jako alternatywa dla atakujących za &kontrolę pracy wbudowanej. Polecenie STDOUT zostanie zapisane w wget-log, jeśli -o <filename>nie zostanie określone. Dobry do pisania skryptów. Zobacz wget (1), aby uzyskać więcej informacji.
Paul

21

Innym programem, który może to zrobić, jest axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

W przypadku szybkiego uwierzytelniania HTTP,

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

Strona podręcznika systemu Ubuntu .


5
ten program pozwala na nieograniczoną liczbę połączeń, co jest bardzo przydatne w niektórych przypadkach.
uglide


Axel nie może wykonać podstawowego uwierzytelniania HTTP :(
rustyx

1
Zwykle tak robięaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
lordzie Loh.

czy mogę użyć Axela do rekurencyjnego pobrania całego folderu?
Ryan Arief

17

Nowym (ale jeszcze nie wydanym) narzędziem jest Mget . Ma już wiele opcji znanych z Wget i zawiera bibliotekę, która pozwala łatwo osadzić (rekurencyjne) pobieranie we własnej aplikacji.

Odpowiedzieć na Twoje pytanie:

mget --num-threads=4 [url]

AKTUALIZACJA

Mget jest teraz rozwijany jako Wget2 z wieloma naprawionymi błędami i dodatkowymi funkcjami (np. Obsługa HTTP / 2).

--num-threadsjest teraz --max-threads.


Niezłe znalezisko. Dziękuję Ci!
user9869932

jakieś wskazówki, jak zainstalować wget2 na komputerze Mac? Strona dokumentuje tylko, jak zainstalować ją ze źródła i mieć problemy z uzyskaniem autopunktu
Chris

W naszym skrypcie TravisCI używamy homebrew do instalowania gettext (który obejmuje autopunkt). Zajrzyj na .travis_setup.sh z repozytorium wget2.
rockdaboot

13

Zdecydowanie sugeruję użycie httrack.

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

Będzie domyślnie wykonywać kopię lustrzaną z 8 jednoczesnymi połączeniami. Httrack ma mnóstwo opcji do gry. Spójrz.


@ aaa90210: Byłoby wspaniale, gdybyś zwięźle wyjaśnił braki programów. Komentarz Artura Bodery jest znacznie bardziej pouczający.
Richard

@ArturBodera Możesz dodać plik cookie.txt do folderu, z którego uruchamiasz swój program, i automatycznie doda te pliki cookie do nagłówka pobierania.
Bertoncelj1

httrack nie obsługuje następujących przekierowań
Chris Hunt

11

Jak wspomnieli inni plakaty, sugeruję przyjrzeć się aria2 . Ze strony podręcznika Ubuntu dla wersji 1.16.1:

aria2 to narzędzie do pobierania plików. Obsługiwane protokoły to HTTP (S), FTP, BitTorrent i Metalink. aria2 może pobrać plik z wielu źródeł / protokołów i próbuje wykorzystać maksymalną przepustowość pobierania. Obsługuje pobieranie pliku z HTTP (S) / FTP i BitTorrent w tym samym czasie, podczas gdy dane pobrane z HTTP (S) / FTP są przesyłane do roju BitTorrent. Korzystając z sum kontrolnych Metalink, aria2 automatycznie sprawdza poprawność fragmentów danych podczas pobierania pliku takiego jak BitTorrent.

Możesz użyć -xflagi, aby określić maksymalną liczbę połączeń na serwer (domyślnie: 1):

aria2c -x 16 [url] 

Jeśli ten sam plik jest dostępny z wielu lokalizacji, możesz pobrać z nich wszystkich. Użyj -jflagi, aby określić maksymalną liczbę równoległych pobrań dla każdego statycznego identyfikatora URI (domyślnie: 5).

aria2c -j 5 [url] [url2]

Więcej informacji można znaleźć na stronie http://aria2.sourceforge.net/ . Aby uzyskać informacje o użytkowaniu, strona man jest naprawdę opisowa i ma na dole sekcję z przykładami użycia. Wersja online znajduje się na stronie http://aria2.sourceforge.net/manual/en/html/README.html .


8

wget nie mogę pobrać w wielu połączeniach, zamiast tego możesz spróbować użyć innego programu, takiego jak aria2.



4

posługiwać się

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

w sites.txt wpisz 1 adres URL w wierszu, przykład:

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

Zawsze mówią, że to zależy, ale jeśli chodzi o tworzenie kopii lustrzanej strony internetowej, najlepszy jest httrack . Jest super szybki i łatwy w obsłudze. Jedynym minusem jest to, że jest to tak zwane forum pomocy technicznej, ale możesz znaleźć swoją drogę, korzystając z oficjalnej dokumentacji . Ma zarówno interfejs GUI, jak i interfejs CLI. Obsługuje pliki cookie. Przeczytaj dokumenty. To jest najlepsze. (Bądź ostrożny dzięki temu narzędziu, możesz pobrać całą sieć na dysk twardy).

httrack -c8 [url]

Domyślnie maksymalna liczba jednoczesnych połączeń jest ograniczona do 8, aby uniknąć przeciążenia serwera


2

służy xargsdo wgetpracy równoległej w wielu plikach

#!/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

Opcje Aria2, Właściwy sposób pracy z plikami mniejszymi niż 20 MB

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

-k 2M podziel plik na porcję 2 MB

-klub --min-split-sizema domyślną wartość 20 MB, jeśli nie ustawisz tej opcji i plik poniżej 20 MB, będzie działał tylko w jednym połączeniu, bez względu na wartość -xlub-s


1

makemożna łatwo sparaliżować (np make -j 4.). Na przykład oto prosty, Makefilektórego używam do równoległego pobierania plików za pomocą wget:

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

Rozważ użycie wyrażeń regularnych lub globowania FTP . Dzięki temu możesz zacząć wget wiele razy z różnymi grupami początkowych nazw plików w zależności od ich częstotliwości występowania.

Oto na przykład sposób synchronizacji folderu między dwoma serwerami 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 &

Pierwszy wget synchronizuje wszystkie pliki / foldery zaczynające się od, 0, 1, 2... F, G, Ha drugi wątek synchronizuje wszystko inne.

Był to najłatwiejszy sposób synchronizacji między NAS z jednym portem Ethernet 10G (10.0.0.100) a NAS z dwoma portami Ethernet 1G (10.0.0.10 i 10.0.0.11). Połączyłem dwa wątki wget --bind-addressdo różnych portów Ethernet i nazwałem je równolegle, umieszczając &na końcu każdej linii. Dzięki temu mogłem skopiować ogromne pliki z łącznym 2x 100 MB / s = 200 MB / s.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.