Я використовую wget для завантаження вмісту веб-сайту, але wget завантажує файли по одному.
Як можна зробити завантаження wget за допомогою 4 одночасних з'єднань?
Я використовую wget для завантаження вмісту веб-сайту, але wget завантажує файли по одному.
Як можна зробити завантаження wget за допомогою 4 одночасних з'єднань?
Відповіді:
використовувати aria2:
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
Я це люблю !!
-s
вказати кількість розщеплень та -k
вказати мінімальний розмір на розділений сегмент - інакше ви ніколи не зможете досягти -x
максимальних з'єднань.
Wget не підтримує декілька з'єднань з сокетами, щоб прискорити завантаження файлів.
Я думаю, що ми можемо зробити трохи кращу, ніж відповідь гармана.
Правильний спосіб - це використання 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
і-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
для мене працює і добре (сервер з обмеженням 100k на з'єднання дозволить мені завантажити 400k із зазначеними параметрами)
aria2
це НЕ підтримує рекурсивні завантаження HTTP, що робить його заміну неякісних для wget
якщо -r
потрібно.
Оскільки паралель GNU ще не згадувався, дозвольте сказати інший спосіб:
cat url.list | parallel -j 8 wget -O {#}.html {}
cat
, хоча. У цьому обмеженому контексті це зовсім нешкідливо, але, можливо, ви не хочете, щоб вчинити цей антипатерн.
Я знайшов (ймовірно) рішення
У процесі завантаження декількох тисяч файлів журналів з одного сервера на інший мені раптом виникла потреба зробити кілька серйозних багатопотокових завантажень у 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
завантажувати лише "новіші" файли, а це означає, що вони не перезаписують і не завантажують файли, якщо їх часова мітка не зміниться на сервері.
-nc
опцію: "no clobber" - це змушує wget ігнорувати завантажені (навіть частково) файли aready.
wget -i list.txt -nc & wget -i list.txt -nc & wget -i list.txt -nc
Дуже потворно, але ей, це працює. : P
-b
Прапор буде запускати процес Wget в фоновому режимі, в якості альтернативи бити по &
контролю роботи вбудованого. STDOUT буде записаний у wget-log, якщо -o <filename>
він не вказаний. Добре для сценаріїв. Дивіться wget (1) для більш детальної інформації.
Ще одна програма, яка може це зробити, це axel
.
axel -n <NUMBER_OF_CONNECTIONS> URL
Для базового HTTP Auth,
axel -n <NUMBER_OF_CONNECTIONS> "user:password@https://domain.tld/path/file.ext"
axel -n 4 "user:pasword@http://domain.tld/path/file.ext"
Новий (але ще не випущений) інструмент - Mget . У Wget вже є багато варіантів, відомих від Wget, і вона має бібліотеку, яка дозволяє легко вбудовувати (рекурсивну) завантаження у власну програму.
Щоб відповісти на ваше запитання:
mget --num-threads=4 [url]
ОНОВЛЕННЯ
Зараз Mget розроблений як Wget2 з виправленими помилками та додатковими функціями (наприклад, підтримка HTTP / 2).
--num-threads
є зараз --max-threads
.
Я настійно пропоную використовувати httrack.
колишній: httrack -v -w http://example.com/
Він зробить дзеркало з 8 одночасними з'єднаннями за замовчуванням. У Httrack є багато варіантів, де грати. Подивитися.
Як уже згадували інші афіші, я пропоную вам поглянути на 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 .
wget cant скачати в декількох з'єднаннях, замість цього ви можете спробувати скористатися іншою програмою, наприклад aria2.
спробуйте pcurl
http://sourceforge.net/projects/pcurl/
використовує curl замість wget, завантажуючи паралельно у 10 сегментах.
використання
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
Вони завжди кажуть, що це залежить, але коли мова заходить про дзеркальне відображення веб-сайту, найкращий існує httrack . Це дуже швидко і легко працювати. Єдиний мінус - це так званий форум підтримки, але ви можете знайти свій шлях, використовуючи офіційну документацію . Він має інтерфейс GUI та CLI, і він підтримує файли cookie, які читають документи. Це найкраще.
httrack -c8 [url]
За замовчуванням максимальна кількість одночасних з'єднань обмежена 8, щоб уникнути перевантаження сервера
використовувати, 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
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
Подумайте про використання регулярних виразів або 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 МБ / с.