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.