Заставь моего паука-скрапа перестать ползать - PullRequest
31 голосов
/ 15 декабря 2010

есть ли шанс прекратить сканирование, если определено, если условие истинно (например, scrap_item_id == предопределенный_значение).Моя проблема похожа на Scrapy - как определить уже очищенные URL-адреса , но я хочу «заставить» моего паука-скрапа перестать ползать после того, как обнаружил последний очищенный элемент.

Ответы [ 2 ]

33 голосов
/ 01 ноября 2011

В последней версии Scrapy, доступной на GitHub, вы можете вызвать исключение CloseSpider для ручного закрытия паука.

В примечании к выпуску 0.14 упоминается документ : «Добавлен CloseSpiderисключение для ручного закрытия пауков (r2691) "

Пример согласно документам:

def parse_page(self, response):
  if 'Bandwidth exceeded' in response.body:
    raise CloseSpider('bandwidth_exceeded')

См. также: http://readthedocs.org/docs/scrapy/en/latest/topics/exceptions.html?highlight=closeSpider

8 голосов
/ 16 августа 2011

Этот вопрос был задан 8 месяцев назад, но мне было интересно то же самое, и я нашел другое (не очень) решение.Надеюсь, это поможет будущим читателям.

Я подключаюсь к базе данных в моем файле конвейера, если соединение с базой данных не удалось, я хотел, чтобы Spider прекратил сканирование (нет смысла собирать данные, если их некуда отправить).В конечном итоге я использовал:

from scrapy.project import crawler
crawler._signal_shutdown(9,0) #Run this if the cnxn fails.

Это заставляет Паука сделать следующее:

[scrapy] INFO: Received SIGKILL, shutting down gracefully. Send again to force unclean shutdown.

Я просто собрал это воедино после прочтения вашего комментария и просмотраФайл "/usr/local/lib/python2.7/dist-packages/Scrapy-0.12.0.2543-py2.7.egg/scrapy/crawler.py".Я не совсем уверен, что он делает, первое число, доставленное в функцию - это имя (например, использование 3,0 вместо 9,0 возвращает ошибку [scrapy] INFO: Received SIGKILL...

Кажется, что работает достаточно хорошо, хотяСчастливого удаления.

РЕДАКТИРОВАТЬ: Я также полагаю, что вы могли бы просто заставить свою программу завершить что-то вроде:

import sys
sys.exit("SHUT DOWN EVERYTHING!")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...