Быстрый способ скачать много маленьких веб-страниц?

540
dandidondi

Мне нужно как можно быстрее загружать множество маленьких страниц. Средний размер одной страницы - 3 КБ. Есть миллионы страниц. Сначала я попытался, curlно это было слишком медленно, возможно потому, что он ждал, пока сервер ответит на запрос, а затем выполнил тот же процесс для следующей страницы.

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

Изменить: После выполнения некоторых тестов я наблюдал эти результаты. Я всегда открыт для большего количества предложений. Я хотел бы улучшить скорость еще больше.

Сравнение 1: (днс против нет днс)

помедленнее:

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: (с использованием последовательности curl против "seq")

помедленнее:

curl -O "http://90.111.123.222/pages/.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/.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 & ) 

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

2
curl более медленный, потому что он обрабатывает используемый протокол, wget - еще один вариант, но я не уверен, будет ли он быстрее. Francisco Tapia 8 лет назад 0
Я думаю, что curl и wget будут работать медленно, если не будет способа запустить их параллельно. Когда я одновременно запускал 5 команд скручивания в разных диапазонах, общая скорость возросла до 4-5 раз, но это было непрактичным способом. dandidondi 8 лет назад 0

2 ответа на вопрос

2
chui101

Вы ускоряете это, разбивая свою работу на несколько меньших операций. Например, вы можете создать 10 процессов curl и создать фон для них:

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/" ::: $(seq -w 1000000) 

что намного элегантнее

Мои URL-адреса содержат символ «&», и это вызывает проблемы при использовании параллельного. Он работает нормально при использовании без параллели: `curl -O" http://website.com/page1.php?varx=1&vary=0 "`, но этот не читает ссылку после "&": `parallel -j 10 curl -O "http://website.com/pagendom1‹.php?varx=1&vary=0" ::: $ (seq -w 1000000) ` dandidondi 8 лет назад 0
использование `'/` до и после ссылки решило мою проблему: `parallel -j 10 curl -O' /" http://website.com/pagendom1‹.php?varx=1&vary=0"'/ :: : $ (seq -w 1000000) ` dandidondi 8 лет назад 0
Вы также можете экранировать специальные символы оболочки (&,; и т. Д.) С помощью обратного кавычка (\) chui101 8 лет назад 1
Если вы «знаете» URL-адреса всех своих страниц, вы можете попробовать использовать [Параметризованная поддержка URI] (https://aria2.github.io/manual/en/html/aria2c.html#parameterized-uri-support) из `aria2c`. Alexey Ivanov 7 лет назад 0
1
Hannu

Скачайте и научитесь использовать GNU Parallel
https://www.gnu.org/software/parallel/

С помощью однострочных команд вы очень скоро будете выполнять параллельные процессы, а не только загрузку веб-страниц.

Похожие вопросы