Как остановить всех пауков и двигатель сразу после выполнения условия в конвейере?

У нас есть система, написанная с помощью scrapy для сканирования нескольких веб-сайтов. Существует несколько пауков и несколько каскадированных конвейеров для всех элементов, передаваемых всеми сканерами. Один из компонентов конвейера запрашивает серверы google для адресов геокодирования . Google налагает ограничение на 2500 запросов в день на каждый IP-адрес и угрожает запретить IP-адрес, если он продолжает запрашивать Google даже после того, как Google ответила предупреждающим сообщением: «OVER_QUERY_LIMIT».

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

Я проверил другие подобные вопросы, и их ответы не сработали:

  • Принудительный мой паук для паузы, чтобы остановить сканирование
from scrapy.project import crawler crawler._signal_shutdown(9,0) #Run this if the cnxn fails. 

это не сработает, так как пауку нужно прекратить выполнение и, следовательно, еще много запросов сделано в Google (что потенциально может запретить мой IP-адрес)

 import sys sys.exit("SHUT DOWN EVERYTHING!") 

этот не работает вообще; элементы продолжают получать сгенерированные и передаются в конвейер, хотя лог vomits sys.exit () -> exceptions.SystemExit повышен (без эффекта)

  • Как я могу сделать обход сканирования и выходить из него, когда сталкивается с первым исключением?
 crawler.engine.close_spider(self, 'log message') 

эта проблема имеет ту же проблему, что и первый случай, упомянутый выше.

Я пытался:

 scrapy.project.crawler.engine.stop() 

Но безрезультатно

РЕДАКТИРОВАТЬ : Если я делаю это:

от scrapy.contrib.closespider импорт CloseSpider

что я должен передать как аргумент «искателя» для init () CloseSpider из области моего конвейера?

One Solution collect form web for “Как остановить всех пауков и двигатель сразу после выполнения условия в конвейере?”

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

EDIT : avaleske отмечает в комментариях к этому ответу, что он смог поднять исключение CloseSpider из конвейера. Наиболее разумным было бы использовать это.

Аналогичная ситуация была описана в группе «Пользователи Scrapy» в этом потоке.

Я цитирую:

Чтобы закрыть паук для любой части вашего кода, вы должны использовать метод engine.close_spider . См. Это расширение для примера использования: https://github.com/scrapy/scrapy/blob/master/scrapy/contrib/closespider.py#L61

Вы можете написать свое собственное расширение, в то время как в качестве примера посмотрите на closespider.py, который отключит паука, если будет выполнено определенное условие.

Другой «взлом» – это установить флаг на пауке в конвейере. Например:

трубопровод:

 def process_item(self, item, spider): if some_flag: spider.close_down = True 

паук:

 def parse(self, response): if self.close_down: raise CloseSpider(reason='API usage exceeded') 
  • Как заставить scrapy сканировать дублирующий URL?
  • Извлеките ссылки для определенного раздела только из blogspot с помощью BeautifulSoup
  • Локально запустите всех пауков в Scrapy
  • Передача аргументов в process.crawl в Scrapy python
  • Переход от Ruby к Python: Crawlers
  • Python-Requests (> = 1. *): Как отключить keep-alive?
  • Как извлечь URL-адреса с HTML-страницы в Python
  • Как создать веб-искатель на основе Scrapy для работы навсегда?
  • python: Существующее соединение было принудительно закрыто удаленным хостом
  • Scrapy необходимо просканировать все следующие ссылки на веб-сайте и перейти к следующей странице
  • Идентификация больших тел текста через BeautifulSoup или другие экстракторы на основе python
  • Python - лучший язык программирования в мире.