Распределенное общение между Scrapy Spiders - PullRequest
0 голосов
/ 14 марта 2019

Я хочу скооперировать двух пауков.Первый паук очистит какой-то веб-сайт и выдаст URL, а второй будет использовать эти адреса.Я не могу дождаться окончания работы первого паука, а затем запустить второго, поскольку веб-сайт очень быстро меняется, и URL-адреса, созданные первым пауком, нужно сразу же удалить.Очень простая архитектура показана ниже.В настоящее время я использую Scrapy отдельно для каждой очистки.Есть идеи, как мне это сделать?Каждый паук ведет себя по-разному (имеет разные настройки) и выполняет свою работу.Было бы неплохо иметь их на разных машинах (распределенных).

enter image description here

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Ваши два паука все еще могут быть независимыми. Их не нужно координировать, и им не нужно общаться друг с другом. Обеим нужен только доступ к центральной базе данных.

Spider1 отвечает только за заполнение таблицы базы данных URL-адресами. И Spider2 просто отвечает за чтение из него (и, возможно, обновление строк, если вы хотите отслеживать). Оба паука могут запускаться / останавливаться независимо. Если Spider1 останавливается, Spider2 может продолжать работать, пока есть URL.

В случае, если в настоящее время больше нет URL-адресов для Spider2, вы можете сохранить его, настроив сигнал spider_idle, который вызывает исключение DontCloseSpider ( документация ). На этом этапе вы также можете получить новый пакет URL-адресов из базы данных и сканировать их ( пример сканирования по сигналу ).

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

0 голосов
/ 14 марта 2019

Одна идея, может быть, это плохая идея

Запустите 1-го паука, который сохраняет ненужные URL в БД

Запустите 2-го паука отдельно, как это

def start_requests(self):
    while 1:
        select url from 1st_spider_urls
        yield Request(url)

        if first_spider_finished:
            break

он будет продолжать получать URL-адреса из таблицы и немедленно их удалять

...