Задания: приостановка и возобновление сканирования

Иногда для больших сайтов желательно приостановить сканирование и иметь возможность возобновить его позже.

Scrapy поддерживает эту функцию из коробки, предоставляя следующие возможности:

  • планировщик, который сохраняет запланированные запросы на диске

  • фильтр дубликатов, который сохраняет посещенные запросы на диске

  • расширение, которое сохраняет некоторое состояние паука (пары ключ / значение) постоянным между пакетами

Каталог работ

Чтобы включить поддержку постоянства, вам просто нужно определить каталог работ через параметр JOBDIR. Данный каталог будет для хранения всех необходимых данных для сохранения состояния отдельного задания (например, запуска паука). Важно отметить, что данный каталог не должен совместно использоваться разными пауками или даже разными заданиями / запусками одного и того же паука, поскольку он предназначен для хранения одиночного состояния задания.

Как это использовать

Чтобы запустить паук с включенной поддержкой постоянства, запустить его следующим образом:

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

Затем вы можете безопасно остановить паука в любое время (нажав Ctrl-C или послав сигнал) и возобновить его позже, введя ту же команду:

scrapy crawl somespider -s JOBDIR=crawls/somespider-1

Сохранение постоянного состояния между партиями

Иногда вам нужно сохранить какое-то постоянное состояние паука между пакетами паузы/возобновления. Для этого вы можете использовать атрибут spider.state, который должен быть dict. Есть встроенное расширение, которое заботится о сериализации, хранении и загрузке этого атрибута из каталога заданий, когда паук запускается и останавливается.

Вот пример обратного вызова, который использует состояние паука (другой код паука пропущен для краткости):

def parse_item(self, response):
    # parse item here
    self.state['items_count'] = self.state.get('items_count', 0) + 1

Проблемы с настойчивостью

Если вы хотите использовать поддержку постоянства Scrapy, следует помнить о нескольких вещах:

Срок действия cookie

Срок действия cookie может истечь. Итак, если вы не возобновите работу паука быстро, запланированные запросы могут больше не работать. Это не будет проблемой, если ваш паук не использует cookie.

Запросить сериализацию

Для сохранения работоспособности объекты Request должны быть сериализуемыми с помощью pickle, за исключением значений callback и errback, переданных их методу __init__, которые должны быть методами работающего класса Spider.

Если вы хотите регистрировать запросы, которые не удалось сериализовать, вы можете установить для параметра SCHEDULER_DEBUG значение True на странице настроек проекта. По умолчанию это False.