Я использую 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 МБ / с.