Швидкий спосіб завантажити багато маленьких веб-сторінок?


2

Мені потрібно завантажувати багато невеликих сторінок якомога швидше. Середній розмір для однієї сторінки - 3 кб. Є мільйони сторінок. Спочатку я спробував, curlале це було занадто повільно, ймовірно, тому, що він чекав, коли сервер відповість на запит, а потім виконати той же процес для наступної сторінки.

curl -O "http://website.com/pages/[0000001-1000000].html"

Редагувати: Після деяких тестів я помітив ці результати. Я завжди відкритий до більшої кількості пропозицій. Я хотів би ще більше підвищити швидкість.

Порівняння 1: (dns проти no dns)

повільніше:

curl -O "http://website.com/pages/[1-1000].html" -s -S

швидше:

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S

Під час завантаження безлічі невеликих сторінок затримка dns є критичною.

Порівняння 2: (використовуючи послідовність згортання проти "seq")

повільніше:

curl -O "http://90.111.123.222/pages/{1}.html" -s -S ::: $(seq 1 1000)

швидше:

curl -O "http://90.111.123.222/pages/[1-1000].html" -s -S

Порівняння 3: (паралельне виконання)

повільніше:

time parallel -j 5 curl -O \'"http://90.111.123.222/pages/{1}.html"\'
-S -s ::: $(seq 1 1000)

швидше:

( time curl -O "http://90.111.123.222/pages/[1-200].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[201-400].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[401-600].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[601-800].html" -s -S &
  time curl -O "http://90.111.123.222/pages/[801-1000].html" -s -S & )

Btw, очевидно, що запущено більше екземплярів, до певного моменту покращить швидкість обох методів.


curl є більш повільним, оскільки він обробляє протокол у використанні, wget - це інший варіант, але я не впевнений, якщо його використання буде швидше.
Франсіско Тапія

Я думаю, що і curl, і wget будуть повільними, якщо немає способу запустити їх паралельно. Коли я запускав 5 команд curl в різних діапазонах одночасно, загальна швидкість підскочила до 4-5x, але це був не практичний шлях.
dandidondi

Відповіді:


2

Ви прискорите це, поділивши свою операцію на кілька менших операцій. Наприклад, ви можете створити 10 процесів завивки та передати їх фоном:

curl -O "http://website.com/pages/0[000000-999999].html" &
curl -O "http://website.com/pages/1[000000-999999].html" &
curl -O "http://website.com/pages/2[000000-999999].html" &
...

і так далі.

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

встановіть його разом із вибором менеджера пакунків, тоді це було б щось просто

parallel -j 10 curl -O "http://website.com/pages/{1}" ::: $(seq -w 1000000)

що набагато елегантніше


мої URL-адреси містять символ "&", і це викликає проблему при паралельному використанні. Це добре працює при використанні його без паралельності: curl -O "http://website.com/page1.php?varx=1&vary=0"але цей не читає посилання після "&":parallel -j 10 curl -O "http://website.com/page{1}.php?varx=1&vary=0" ::: $(seq -w 1000000)
dandidondi

використання '/ до і після посилання вирішило мою проблему:parallel -j 10 curl -O '/ "http://website.com/page{1}.php?varx=1&vary=0"'/ ::: $(seq -w 1000000)
dandidondi

1
Ви також можете уникнути спеціальних символів оболонки (&,; і т. Д.) За допомогою backtick (\)
chui101

Якщо ви «знаєте» URL - адреса для всіх ваших сторінок, ви можете спробувати використовувати підтримку параметризованих URI з aria2c.
Олексій Іванов

1

Завантажте та навчіться користуватися GNU Parallel
https://www.gnu.org/software/parallel/

За допомогою команд з одного рядка ви досить скоро паралельно будете виконувати речі, не тільки завантажуючи веб-сторінки.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.