Кілька одночасних завантажень за допомогою Wget?


207

Я використовую wget для завантаження вмісту веб-сайту, але wget завантажує файли по одному.

Як можна зробити завантаження wget за допомогою 4 одночасних з'єднань?


4
Аналогічне питання з хорошим рішенням: stackoverflow.com/questions/7577615/parallel-wget-in-bash
JohnEye

Подивіться на цей проект github.com/rockdaboot/wget2
user9869932

Відповіді:


197

використовувати aria2:

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

http://aria2.sourceforge.net

Я це люблю !!


26
Я не бачу, як це допомагає завантажити веб-сайт - схоже, він завантажує лише 1 файл. Якщо це правда - голоси повинні бути -ведучими.
Стівен

8
Я погоджуюся, це не є гарною відповіддю, оскільки aria2 не може робити дзеркальне відображення в Інтернеті чи ftp, як wget чи lftp. lftp робить дзеркальне відображення, а також підтримує безліч з'єднань.
Анахроніст

9
Не забудьте -sвказати кількість розщеплень та -kвказати мінімальний розмір на розділений сегмент - інакше ви ніколи не зможете досягти -xмаксимальних з'єднань.
Боб

2
@Stephen - це набагато швидше завантажувати дуже великі файли з веб-сайтів, використовуючи кілька сокетів на сервер замість одного. Це не означає для скребки веб-сайту.
gabeio

не підтримує шкарпетки *
Fedcomp

111

Wget не підтримує декілька з'єднань з сокетами, щоб прискорити завантаження файлів.

Я думаю, що ми можемо зробити трохи кращу, ніж відповідь гармана.

Правильний спосіб - це використання aria2.

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

19
Документувати -x, --max-connection-per-server=NUM The maximum number of connections to one server for each download. Possible Values: 1-16 Default: 1і-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
Нік

Дякую за детальну роботу над параметрами, Нік.
thomas.han

4
Опція -s більше не розділяє файл з одного сервера після випуску 1.10. Потрібно використовувати --max-connection-per-server разом, щоб змусити встановити декілька з'єднань. Дивіться документацію на 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.
Самуель Лі

1
Стенограма оновлення @ SamuelLi aria2c -x 4 -k 1M urlдля мене працює і добре (сервер з обмеженням 100k на з'єднання дозволить мені завантажити 400k із зазначеними параметрами)
EkriirkE

Критично, aria2це НЕ підтримує рекурсивні завантаження HTTP, що робить його заміну неякісних для wgetякщо -rпотрібно.
користувач2943160

55

Оскільки паралель GNU ще не згадувався, дозвольте сказати інший спосіб:

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

5
Це цікавий підхід. Не дуже застосовно, коли вам потрібно завантажити величезний файл, і ви отримуєте обмежену швидкість за з'єднання, але може бути корисною для завантаження декількох файлів.
Микола Петканський

Виконання цієї команди запустило б список 8 разів, ні? Я зробив це так само, і замість того, щоб обробляти кожен рядок 8 паралелями, він просто обробляє весь список 8 разів.
DomainsFeatured

4
Ні, він розбиває список на 8 робочих місць
Микола Шмирев

Гаразд, я напевно роблю щось дивне. Вияснимо це. Дякуємо за швидку відповідь.
DomainsFeatured

1
Це марне використанняcat , хоча. У цьому обмеженому контексті це зовсім нешкідливо, але, можливо, ви не хочете, щоб вчинити цей антипатерн.
tripleee

39

Я знайшов (ймовірно) рішення

У процесі завантаження декількох тисяч файлів журналів з одного сервера на інший мені раптом виникла потреба зробити кілька серйозних багатопотокових завантажень у BSD, бажано з Wget, оскільки це був найпростіший спосіб, з яким я міг би подумати про це. Трохи озирнувшись, привели мене до цього маленького самородка:

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

Просто повторіть wget -r -np -N [url]стільки ниток, скільки вам потрібно ... Тепер з огляду на це не дуже, і, безумовно, є кращі способи зробити це, але якщо ви хочете чогось швидкого і брудного, слід зробити трюк ...

Примітка. Цей параметр -Nдозволяє wgetзавантажувати лише "новіші" файли, а це означає, що вони не перезаписують і не завантажують файли, якщо їх часова мітка не зміниться на сервері.


11
Але це не завантажує весь набір артефактів для кожного процесу?
Кай Маттерн

10
@KaiMattern: додайте -ncопцію: "no clobber" - це змушує wget ігнорувати завантажені (навіть частково) файли aready.
СФ.

1
У мене був список зображень, які мені потрібно було завантажити, і це працювало і для мене: wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -ncДуже потворно, але ей, це працює. : P
Джаред

1
Перерване з таких причин одне з цих з'єднань дає вам незавершені файли, не торкаючись інших з'єднань. Цей метод створює проблеми з цілісністю.
muhammedv

-bПрапор буде запускати процес Wget в фоновому режимі, в якості альтернативи бити по &контролю роботи вбудованого. STDOUT буде записаний у wget-log, якщо -o <filename>він не вказаний. Добре для сценаріїв. Дивіться wget (1) для більш детальної інформації.
Павло

21

Ще одна програма, яка може це зробити, це axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

Для базового HTTP Auth,

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

Сторінка Ubuntu man .


5
ця програма дозволяє необмежену кількість підключень, що дуже корисно в деяких випадках.
потворний

1
Чудовий інструмент. для centos6.xi використано rpm.pbone.net/index.php3/stat/4/idpl/16390122/dir/redhat_el_6/…
satch_boogie

Axel не може зробити HTTP базовим auth :(
rustyx

1
Я зазвичай роблюaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Лорд Loh.

Чи можу я використовувати axel для рекурсивного завантаження цілої папки?
Ryan Arief

17

Новий (але ще не випущений) інструмент - Mget . У Wget вже є багато варіантів, відомих від Wget, і вона має бібліотеку, яка дозволяє легко вбудовувати (рекурсивну) завантаження у власну програму.

Щоб відповісти на ваше запитання:

mget --num-threads=4 [url]

ОНОВЛЕННЯ

Зараз Mget розроблений як Wget2 з виправленими помилками та додатковими функціями (наприклад, підтримка HTTP / 2).

--num-threadsє зараз --max-threads.


Приємна знахідка. Дякую!
користувач9869932

будь-які поради щодо встановлення wget2 на mac? На сайті розміщено лише документи, як встановити його з джерела та мати проблеми з отриманням автоточки
Кріс

У скрипті TravisCI ми використовуємо homebrew для встановлення gettext (який включає автоточку). Погляньте на .travis_setup.sh з репорта wget2.
rockdaboot

13

Я настійно пропоную використовувати httrack.

колишній: httrack -v -w http://example.com/

Він зробить дзеркало з 8 одночасними з'єднаннями за замовчуванням. У Httrack є багато варіантів, де грати. Подивитися.


@ aaa90210: Було б чудово, якби ви коротко пояснили недоліки програми. Коментар ArturBodera набагато інформативніший.
Річард

@ArturBodera Ви можете додати файл cookies.txt до папки, з якої працює ваша програма, і він автоматично додасть ці файли cookie до заголовка завантаження.
Bertoncelj1

httrack не підтримує наступні переадресації
Chris Hunt

11

Як уже згадували інші афіші, я пропоную вам поглянути на aria2 . На сторінці користувача Ubuntu для версії 1.16.1:

aria2 - це утиліта для завантаження файлів. Підтримувані протоколи - HTTP (S), FTP, BitTorrent і Metalink. aria2 може завантажити файл з декількох джерел / протоколів і намагається використовувати вашу максимальну пропускну здатність для завантаження. Він підтримує завантаження файлу з HTTP (S) / FTP та BitTorrent одночасно, в той час як дані, завантажені з HTTP (S) / FTP, завантажуються в рой BitTorrent. Використовуючи контрольні суми Metalink, aria2 автоматично перевіряє шматки даних під час завантаження файлу типу BitTorrent.

Ви можете використовувати -xпрапор, щоб вказати максимальну кількість з'єднань на сервері (за замовчуванням: 1):

aria2c -x 16 [url] 

Якщо один і той же файл доступний з декількох місць, ви можете завантажити з усіх них. Використовуйте -jпрапор, щоб вказати максимальну кількість паралельних завантажень для кожного статичного URI (за замовчуванням: 5).

aria2c -j 5 [url] [url2]

Перегляньте сторінку http://aria2.sourceforge.net/ для отримання додаткової інформації. Щодо інформації про використання, довідкова сторінка є дійсно описовою та має внизу розділ із прикладами використання. Інтернет-версію можна знайти за адресою http://aria2.sourceforge.net/manual/en/html/README.html .


8

wget cant скачати в декількох з'єднаннях, замість цього ви можете спробувати скористатися іншою програмою, наприклад aria2.



4

використання

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

у веб-сайтах.txt введіть 1 URL на рядок, наприклад:

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

Вони завжди кажуть, що це залежить, але коли мова заходить про дзеркальне відображення веб-сайту, найкращий існує httrack . Це дуже швидко і легко працювати. Єдиний мінус - це так званий форум підтримки, але ви можете знайти свій шлях, використовуючи офіційну документацію . Він має інтерфейс GUI та CLI, і він підтримує файли cookie, які читають документи. Це найкраще.

httrack -c8 [url]

За замовчуванням максимальна кількість одночасних з'єднань обмежена 8, щоб уникнути перевантаження сервера


2

використовувати, xargsщоб зробити wgetроботу в декількох файлах паралельно

#!/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, правильний спосіб роботи з файлом розміром менше 20 Мб

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

-k 2M розділити файл на шматок 2 Мб

-kабо --min-split-sizeмає значення за замовчуванням 20mb, якщо ви не встановили цей параметр і файл під 20mb, він працюватиме лише в одному з'єднанні незалежно від значення -xабо-s


1

makeможна легко паралелізувати (наприклад, make -j 4). Наприклад, ось простий, який Makefileя використовую для завантаження файлів паралельно за допомогою 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

Подумайте про використання регулярних виразів або FTP Globbing . Тим самим ви можете запускати wget кілька разів з різними групами початкових символів імен файлів, залежно від частоти їх появи.

Ось, наприклад, як я синхронізував папку між двома 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 &

Перший wget синхронізує всі файли / папки, починаючи з, 0, 1, 2... F, G, Hа другий потік синхронізує все інше.

Це було найпростішим способом синхронізації між NAS з одним портом Ethernet 10G (10.0.0.100) та NAS з двома портами 1G Ethernet (10.0.0.10 та 10.0.0.11). Я прив’язав два wget-потоки --bind-addressдо різних портів Ethernet і назвав їх паралельними, поставивши &в кінці кожного рядка. Тим самим мені вдалося скопіювати величезні файли з 2x 100 Мб / с = 200 МБ / с.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.