Есть ли параллельный wget? Что-то вроде фпинга но только для скачивания?

15

Я нашел только puf (Parallel URL fetcher), но не смог заставить его читать URL из файла; что-то вроде

 puf < urls.txt

тоже не работает.

На сервере установлена ​​операционная система Ubuntu.

Луноход
источник
Это можно сделать с помощью библиотеки Python и pycurl и немного склеить логику в скрипте. Но я не знаю «консервированного» инструмента для этого.
Кит
@Keith Этот подход лучше, чем использование некоторой асинхронной библиотеки в качестве gevent с urllib?
Moonwalker
urllib не предназначен для асинхронного использования. Libcurl имеет собственный асинхронный цикл и может быть настроен на выполнение как минимум 1000 одновременных выборок с использованием интерфейса «multi».
Кит
@ Мне больше нравится ваш ответ, так что вы могли бы написать его как «настоящий» ответ, чтобы получить за него должное признание?
Moonwalker

Ответы:

25

Используя GNU Parallel ,

$ parallel -j $ {jobs} wget <urls.txt

или xargsиз GNU Findutils ,

$ xargs -n 1 -P $ {jobs} wget <urls.txt

где ${jobs}находится максимальное количество wgetвы хотите , чтобы запустить одновременно (установка -nдля 1получить один wgetвызов в каждой строке в urls.txt). Без -j/ -P, parallelбудет одновременно запускать столько же заданий, сколько и ядра ЦП (что не обязательно имеет смысл для wgetсетевого ввода-вывода), и xargsбудет запускаться по одному за раз.

Одной из приятных особенностей, которая parallelимеет преимущество xargs, xargsявляется разделение выходных данных одновременно выполняемых заданий, но если вам это не важно, скорее всего, они предустановлены.

ephemient
источник
Оптимальное jobsзависит от многих факторов: задержка пути, пропускная способность пути, политики удаленного сервера и т. Д.
dhchdhd
6

aria2 делает это.

http://sourceforge.net/apps/trac/aria2/wiki/UsageExample#Downloadfileslistedinafileconcurrently

Пример: aria2c http://example.org/mylinux.iso

user17591
источник
Этот ответ был бы улучшен с помощью реального примера, который решает заданную проблему, вместо этого он квалифицируется как ответ только для ссылки. meta.stackexchange.com/questions/225370/…
Джефф Шаллер
2

Вы можете реализовать это, используя Python и библиотеку pycurl. Библиотека pycurl имеет «многопользовательский» интерфейс, который реализует свой собственный цикл «четность», который обеспечивает несколько одновременных подключений.

Однако интерфейс довольно C-подобен и, следовательно, немного громоздок по сравнению с другим, более "Pythonic", кодом.

Я написал для него оболочку, которая создает поверх него более полный браузероподобный клиент. Вы можете использовать это в качестве примера. См. Модуль pycopia.WWW.client . HTTPConnectionManager оборачивает мультиинтерфейс.

Кит
источник
2

Это работает, и не будет локальной или удаленной DoS с правильными настройками:

(bandwidth=5000 jobs=8; \
 parallel      \
   --round     \
   -P $jobs    \
   --nice +5   \
   --delay 2   \
   --pipepart  \
   --cat       \
   -a urls.txt \
     wget                                \
       --limit-rate=$((bandwidth/jobs))k \
       -w 1                              \
       -nv                               \
       -i {}                             \
)
dhchdhd
источник
1

Часть справочной страницы GNU Parallel содержит пример параллельного рекурсивного wget.

https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Breadth-first-parallel-web-crawler-mirrorer

HTML загружается дважды: один раз для извлечения ссылок и один раз для загрузки на диск. Другой контент загружается только один раз.

Если вам не нужна рекурсивность, ответ эфиментности кажется очевидным.

Оле Танге
источник
Только в конце вашего финансового сезона, что любое «решение» с параллельными плюсами и wget по своей сути неэффективно, потому что требует загрузки контента дважды , медленное из-за многофазной загрузки, и также не очень приятно sysops, которым приходится платить за все ваши потери пропускной способности, потому что вы не Не используйте эффективное решение.
Дххдхд
0

Жертвам вашей параллельной загрузки не придется удивляться: они ожидают, что одно соединение будет обслуживать каждого клиента, а установка нескольких соединений означает меньше клиентов в целом. (То есть это считается грубым поведением).

vonbrand
источник
1
Но он может загружать файлы с разных серверов, так что это не будет применяться.
Ренан
Кроме того, что сказал @vonbrand, вы можете получить что-то вроде «Слишком много подключений» и не сможете загрузить все файлы. И это может быть немного медленнее (например, повторное использование одного HTTP-соединения по сравнению с созданием нескольких HTTP-соединений)
golimar
2
Пока вы сохраняете число в здравом уме, это не имеет большого значения. Например, в то время, когда вы писали это, Firefox использовал 15 подключений на сервер, когда не использовал постоянные подключения (с тех пор они переключались только на попытки постоянных подключений, которые ограничены 6 на сервер). Другие браузеры используют похожие номера.
Дероберт