Несколько одновременных загрузок с использованием 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 не может выполнять зеркалирование через web или ftp как wget или lftp. lftp выполняет зеркалирование, а также поддерживает несколько соединений.
анахронист

9
Не забудьте -sуказать количество разделений и -kуказать минимальный размер на разделенный сегмент, иначе вы никогда не достигнете -xмаксимального количества подключений.
Боб

2
@Stephen это для того, чтобы загружать очень большие файлы с веб-сайтов намного быстрее , используя несколько сокетов на сервере вместо одного. Это не значит, что вы можете соскрести сайт.
Габейо

не поддерживает носки *
Fedcomp

111

Wget не поддерживает множественные сокетные соединения для ускорения загрузки файлов.

Я думаю, что мы можем сделать немного лучше, чем gmarian ответ.

Правильный способ заключается в использовании 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для меня хорошо работает (сервер с лимитом 100 КБ на соединение позволяет мне загружать 400 КБ с указанными параметрами)
EkriirkE

Критически, aria2это не поддерживает рекурсивные загрузки HTTP, что делает его замену некачественных для wgetесли -rтребуется.
user2943160

55

Поскольку параллель GNU еще не упоминалась, позвольте мне дать другой способ:

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

5
Это интересный подход. Не очень применимо, когда вам нужно скачать огромный файл и вы получаете ограниченную скорость на соединение, но может быть полезно при загрузке нескольких файлов.
Никола Петкански

Выполнение этой команды запустит список 8 раз, нет? Я сделал это так же, и вместо обработки каждой строки с 8 параллелями, он просто обрабатывает весь список 8 раз.
ДоменыРекомендуемые

4
Нет, это разбивает список на 8 рабочих мест
Николай Шмырев

Хорошо, я определенно делаю что-то странное. Разберусь. Спасибо за быстрый ответ.
ДоменыРекомендуемые

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 игнорировать некоторые загруженные (даже частично) файлы.
SF.

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

1
Если одно из этих соединений по какой-то причине разорвано, вы получите незавершенные файлы, не затронутые другими соединениями. Этот метод создает проблемы целостности.
Мухаммед

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

21

Еще одна программа, которая может сделать это axel.

axel -n <NUMBER_OF_CONNECTIONS> URL

Для байсового HTTP-аутентификации,

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

Страница справочника Ubuntu .


5
Эта программа позволяет неограниченное количество подключений, что очень полезно в некоторых случаях.
uglide

1
Отличный инструмент. для centos6.xi используется rpm.pbone.net/index.php3/stat/4/idpl/16390122/dir/redhat_el_6/…
satch_boogie

Аксель не может выполнить базовую аутентификацию HTTP :(
rustyx

1
Я обычно делаюaxel -n 4 "user:pasword@http://domain.tld/path/file.ext"
лорд Ло.

Могу ли я использовать аксель для рекурсивной загрузки всей папки?
Райан Ариф

17

Новый (но еще не выпущенный) инструмент - Mget . У него уже есть много опций, известных от Wget, и поставляется с библиотекой, которая позволяет легко встраивать (рекурсивную) загрузку в ваше собственное приложение.

Чтобы ответить на ваш вопрос:

mget --num-threads=4 [url]

ОБНОВИТЬ

Mget теперь разработан как Wget2 с множеством исправленных ошибок и дополнительными функциями (например, поддержка HTTP / 2).

--num-threadsв настоящее время --max-threads.


Хорошая находка. Спасибо!
user9869932 22.09.16

какие-либо советы о том, как установить wget2 на Mac? Сайт только документирует, как установить его из исходного кода и не может получить автоматическую точку
Крис

В нашем скрипте TravisCI мы используем homebrew для установки gettext (который включает в себя autopoint). Взгляните на .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 не может загрузить несколько соединений, вместо этого вы можете попробовать использовать другую программу, такую ​​как aria2.



4

использование

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

2

Они всегда говорят, что это зависит, но когда дело доходит до зеркалирования веб-сайта, лучшее существует httrack . Это супер быстро и легко работать. Единственный недостаток - это так называемый форум поддержки, но вы можете найти свой путь, используя официальную документацию . Он имеет как GUI, так и интерфейс CLI, и поддерживает куки, просто читайте документы. Это лучшее. (Будьте осторожны с этим инструментом, вы можете загрузить всю сеть на свой жесткий диск).

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имеет значение по умолчанию 20 МБ, если вы не установите эту опцию и файл меньше 20 МБ, он будет работать только в одном соединении независимо от того, какое значение -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-глобинга . Таким образом, вы можете запускать 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 МБ / с.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.