Używam wget do pobierania zawartości strony, ale wget pobiera pliki jeden po drugim.
Jak mogę pobrać wget, używając 4 jednoczesnych połączeń?
Używam wget do pobierania zawartości strony, ale wget pobiera pliki jeden po drugim.
Jak mogę pobrać wget, używając 4 jednoczesnych połączeń?
Odpowiedzi:
użyj aria2:
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
Kocham to !!
-s
podać liczby podziałów i -k
określić minimalny rozmiar na segment podziału - w przeciwnym razie możesz nigdy nie osiągnąć -x
maksymalnych połączeń.
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
-x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1
i-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
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.
aria2c -x 4 -k 1M url
i działał dla mnie dobrze (serwer z limitem 100 000 na połączenie pozwala mi pobierać przy 400 000 ze wspomnianymi parametrami)
aria2
czy nie obsługują rekurencyjne pobieranie HTTP, dzięki czemu wymiana normom dla wget
jeśli -r
pożądane.
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 {}
cat
. W tym ograniczonym kontekście jest to całkiem nieszkodliwe, ale być może nie chcesz stosować tego anty-wzoru.
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 -N
powoduje wget
pobieranie 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.
-nc
opcję: „bez clobber” - powoduje, że wget ignoruje często pobierane (nawet częściowo) pliki.
wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc
Bardzo brzydkie, ale hej, to działa. : P
-b
Flaga 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.
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"
axel -n 4 "user:pasword@http://domain.tld/path/file.ext"
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-threads
jest teraz --max-threads
.
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.
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ć -x
flagi, 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 -j
flagi, 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 .
wget nie mogę pobrać w wielu połączeniach, zamiast tego możesz spróbować użyć innego programu, takiego jak aria2.
spróbuj pcurl
http://sourceforge.net/projects/pcurl/
używa curl zamiast wget, pobieranie w 10 segmentach równolegle.
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
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
służy xargs
do wget
pracy 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
-k
lub --min-split-size
ma 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ść -x
lub-s
make
można łatwo sparaliżować (np make -j 4
.). Na przykład oto prosty, Makefile
któ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
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, H
a 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-address
do 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.