Как создать масштабируемый сканер для сканирования миллионов страниц на одной машине всего за 2 часа

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

Вам не нужно знать, как управлять обработкой, потоком или даже очередью, просто введите URL-адреса, которые вы хотите очистить, извлеките веб-структуру по мере необходимости, измените количество поисковых роботов и параллелизма для генерации, а остальное все «Сожги это»!

Весь код здесь просто имитирует эффективный распределенный краулер и учит, как использовать docker и celery. Прежде чем мы начнем, нужно объявить несколько вещей:

  1. Независимо от того, какой веб-сайт вы хотите очистить, получите его политику в отношении роботов и TOS.
  1. Не отправляйте большие запросы на один и тот же сайт одновременно. Пожалуйста, будьте нежны.
  1. Не делайте ничего, что нарушает местное законодательство вашей страны

Этот учебник является обновленной версией предыдущего сообщения, Как собрать докер-кластер с помощью celery и RabbitMQ за 10 минут. Там много технических подробностей о том, как писать dockerfile, использовать docker-compose и как настраивать Celery и RabbiMQ, так что я не буду говорить о них снова.

1. Поехали

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

КЛЮЧ ОДИН:

run_tasks

Список URL-адресов: вы можете получить список Alexa из 1 миллиона лучших доменов из этого Веб-сайт, сохраните их в своей базе данных или текстовом файле по мере необходимости. Чтобы провести быстрый тест, я просто создаю страницу приветствия nginx на своем облачном сервере. Затем увеличьте его до списка 1000000.

Затем используйте метод longtime_add.delay, чтобы отправить их все в RabbitMQ, брокер сообщений.

КЛЮЧ ВТОРОЙ:

задачи

С помощью команды «docker-compose scale worker=10» docker-compose создаст рабочий кластер с этим файлом «задач». Он получит список URL-адресов и отправит его на запросы, вернет status_code и сохранит status_code с помощью метода time.time(). Если это сработает, вы увидите что-то вроде этого в базе данных Mongo:

{‘статус’:200,’create_time’:1488271604.63484}

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

@app.task(bind=Истина,default_retry_delay=10)

2. Настройте dockerfile и docker-compose

ENTRYPOINT celery -A test_celery worker — concurrency=20 — loglevel=info

Здесь следует обратить внимание: не устанавливайте слишком высокий параллелизм в dockerfile. В этом случае 20 достаточно для моей машины.

Что мы должны добавить в файл docker-compose, так это базу данных mongo и установить порт «27018:27017». Первое число должно быть таким же, как и в задачах.

3. Давай побежим

Если вам сложно следить за этим, просто клонируйте код на свой локальный компьютер, затем сделайте то же самое, что и предыдущая статья.


Особенности процессора. Источник:Интел

Моя локальная машина имеет два процессора, каждый из которых имеет 12 потоков и 6 ядер, а общий объем памяти составляет 32 ГБ. Этого достаточно, чтобы запустить 40 рабочих процессов, каждый из которых имеет 20 параллелизма.


40 рабочих

Чем больше параллелизма для каждого рабочего процесса, тем больше памяти ему потребуется. В этом случае 40 рабочих стоили около 12 ГБ памяти, а осталось около половины. Если я немного увеличу количество параллелизма или воркеров, скорость краулера будет выше, однако пропускная способность сети в моем доме составляет всего 1 МБ/с. Несмотря на увеличение рабочих, скорость не увеличивается вообще. В этом тесте узким местом является моя плохая сеть.

40 рабочих и 15 минут спустя я получил около 100 000 элементов в своей базе данных Mongo, используя одну машину.

Вывод

Если у вас есть мощный сервер или компьютер, необходимо развернуть кластеры докеров, чтобы максимизировать производительность вашей машины, или с небольшим сервером, таким как Raspberry Pi, докер также является лучшим выбором. Конечно, без докера вы могли бы создать и распределенный краулер. Некоторые программы, такие как Ткань развернет ваши приложения на кластерах серверов с помощью нескольких команд.

Если у вас есть какие-либо вопросы или предложения по этому поводу, пожалуйста, не стесняйтесь оставлять ответы здесь, и вы можете отправлять запросы на включение в этот проект. Увидимся на следующем уроке!

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *