Быстрый способ скачать много маленьких веб-страниц?
Мне нужно как можно быстрее загружать множество маленьких страниц. Средний размер одной страницы - 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/{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 & )
Кстати, очевидно, что запуск нескольких экземпляров в некоторой степени улучшит скорость обоих методов.
2 ответа
Вы ускоряете это, разбивая свою работу на несколько небольших операций. Например, вы можете создать 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/{1}" ::: $(seq -w 1000000)
что намного элегантнее
Скачайте и научитесь использовать GNU Parallel
https://www.gnu.org/software/parallel/
С помощью однострочных команд вы очень скоро будете выполнять параллельные процессы, а не только загрузку веб-страниц.