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

У нас есть система, написанная с помощью 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') 
  • Как очистить XML-ленту с помощью xmlfeedspider
  • Scrapy - Сканирование и очистка веб-сайта
  • Как запустить Scrapy из сценария Python
  • Scrapy - Реактор не восстанавливается
  • как фильтровать повторяющиеся запросы на основе url в scrapy
  • Ошибка selexbox при проверке на селене
  • Вращающиеся прокси для веб-соскабливания
  • Splinter или Selenium: можем ли мы получить текущую html-страницу после нажатия кнопки?
  •  
    Interesting Posts for Van-Lav

    Невозможно импортировать имя _uuid_generate_random в heroku django

    Самый простой способ комбинирования строк даты и времени для одиночного объекта datetime с использованием Python

    Добавить массив в DataFrame

    Может ли запись в UDP-сокет когда-либо блокироваться?

    Проблемы с PyPi – Ошибка загрузки (401): вы должны быть идентифицированы для редактирования информации о пакете

    Получение данных из SQL с помощью pyodbc

    Как проверить код асинхронного кода Python 3.4?

    Импортировать ошибки при запуске носетов, которые я не могу воспроизвести вне носа

    Как объединить список dicts в один dict?

    matplotlib, как начать тики, оставляя пространство от начала оси

    Специальные (магические) методы в Python

    Как я могу связываться между двумя скриптами python?

    Каков дурацкий способ преобразования некоторой строки (utf-8 или else) в простую ASCII-строку в python

    Обработка верхних треугольных элементов только с помощью NumPy einsum

    Python-Запросы закрыть http-соединение

    Python - лучший язык программирования в мире.