Чи є паралельний wget? Щось на кшталт fping, але тільки для завантаження?


15

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

 puf < urls.txt

теж не працює.

Встановлена ​​на сервері операційна система - Ubuntu.


Це можна зробити за допомогою бібліотеки Python та pycurl та трохи логіки клею в сценарії. Але я не знаю "консервованого" інструменту для цього.
Кіт

@Keith Чи кращий такий підхід, ніж використання якоїсь бібліотеки async як gevent з urllib?
Moonwalker

urllib не призначений для асинхронного використання. У libcurl є власний цикл асинхронізації, і його можна налаштувати, щоб зробити щонайменше 1000 одночасних підходів за допомогою інтерфейсу "мульти".
Кіт

@Keith мені найкраще подобається ваша відповідь, щоб ви могли написати це як "справжню" відповідь, щоб взяти належну заслугу за це?
Moonwalker

Відповіді:


25

Використовуючи паралель GNU ,

$ паралельна -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пов'язаної мережі IO), і xargsбуде працювати по одному.

Одна хороша особливість , яка parallelмає більш ніж xargsтримає вихід з паралельно-запущених завдань розділені, але якщо ви не дбаєте про те, що, xargsшвидше за все, бути попередньо встановлена.


Оптимальний jobsзалежить від багатьох факторів: затримка шляху, пропускна здатність шляху, політика віддаленого сервера тощо
dhchdhd

6

Ця відповідь буде покращена фактичним прикладом, який вирішує задану проблему, натомість це кваліфікується як відповідь лише для посилання. meta.stackexchange.com/questions/225370/…
Jeff Schaller

2

Ви можете реалізувати це, використовуючи Python та бібліотеку pycurl. Бібліотека pycurl має "мульти" інтерфейс, який реалізує свій власний рівномірний цикл, що забезпечує безліч одночасних з'єднань.

Однак інтерфейс досить схожий на C і тому трохи громіздкий порівняно з іншими, більш «пітонічними» кодами.

Я написав обгортку для цього, який будує більш повний клієнт, схожий на браузер. Ви можете використовувати це як приклад. Дивіться модуль 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 {}                             \
)

1

Частина сторінки GNU Parallel містить приклад паралельного рекурсивного wget.

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

HTML завантажується двічі: один раз для вилучення посилань та один раз для завантаження на диск. Інший вміст завантажується лише один раз.

Якщо вам не потрібна відповідь прорекурсивності, ефеміент здається очевидним.


Просто пізній FYI, що будь-яке паралельне плюс wget "рішення" за своєю суттю неефективне, тому що для цього потрібно завантажувати вміст удвічі , повільно через всю багатофазність завантаження, а також не приємно для сисопів, яким доводиться платити за всю витрату вашої пропускної здатності, оскільки ви цього не зробили не використовувати ефективне рішення.
dhchdhd

0

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


1
Але він може завантажувати файли з різних серверів, тому це не стосується.
Ренан

Крім того, що сказав @vonbrand, ви можете отримати щось на кшталт "Забагато з'єднань" і не зможете завантажити всі файли. І це може бути трохи повільніше (наприклад, повторне використання одного HTTP-з'єднання порівняно зі створенням декількох HTTP-з'єднань)
golimar

2
Поки ти тримаєш номер із розумом, це не велика справа. Наприклад, у той час, коли ви це писали, Firefox використовував 15 підключень на сервері, коли не використовував стійких з'єднань (з тих пір вони перейшли лише на спроби постійних з'єднань, обмежених 6 на кожен сервер). Інші браузери використовують подібні номери.
дероберт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.