Я использую wget для загрузки содержимого сайта, но wget загружает файлы один за другим.
Как я могу сделать загрузку wget, используя 4 одновременных соединения?
Я использую wget для загрузки содержимого сайта, но wget загружает файлы один за другим.
Как я могу сделать загрузку wget, используя 4 одновременных соединения?
Ответы:
используйте aria2:
aria2c -x 16 [url]
# |
# |
# |
# ----> the number of connections
Я люблю это !!
-sуказать количество разделений и -kуказать минимальный размер на разделенный сегмент, иначе вы никогда не достигнете -xмаксимального количества подключений.
Wget не поддерживает множественные сокетные соединения для ускорения загрузки файлов.
Я думаю, что мы можем сделать немного лучше, чем gmarian ответ.
Правильный способ заключается в использовании 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для меня хорошо работает (сервер с лимитом 100 КБ на соединение позволяет мне загружать 400 КБ с указанными параметрами)
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 игнорировать некоторые загруженные (даже частично) файлы.
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-аутентификации,
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, и поставляется с библиотекой, которая позволяет легко встраивать (рекурсивную) загрузку в ваше собственное приложение.
Чтобы ответить на ваш вопрос:
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 не может загрузить несколько соединений, вместо этого вы можете попробовать использовать другую программу, такую как aria2.
попробуй pcurl
http://sourceforge.net/projects/pcurl/
использует curl вместо wget, загружает в 10 сегментах параллельно.
использование
aria2c -x 10 -i websites.txt >/dev/null 2>/dev/null &
в website.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, и поддерживает куки, просто читайте документы. Это лучшее. (Будьте осторожны с этим инструментом, вы можете загрузить всю сеть на свой жесткий диск).
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имеет значение по умолчанию 20 МБ, если вы не установите эту опцию и файл меньше 20 МБ, он будет работать только в одном соединении независимо от того, какое значение -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-глобинга . Таким образом, вы можете запускать 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 с двумя портами Ethernet 1G (10.0.0.10 и 10.0.0.11). Я связал два потока wget --bind-addressс разными портами Ethernet и назвал их параллельными, поставив &в конце каждой строки. Таким образом я смог скопировать огромные файлы с общей скоростью 2x 100 МБ / с = 200 МБ / с.