Какое влияние на повышение CloseSpider в Scrapy?
Я хочу знать, какое влияние поднимает CloseSpider. В документации http://doc.scrapy.org/en/latest/topics/exceptions.html об этом нет информации. Как известно, scrapy обрабатывает несколько запросов одновременно. Что если это исключение будет вызвано до того, как будет обработан последний запрос? Будет ли он ждать обработки запросов на отдых, которые были выполнены раньше? Пример:
def parse(self, response):
my_url = 'http://someurl.com/item/'
for i in range(1, 100):
my_url += str(i)
if i == 50:
raise CloseSpider('')
else:
yield Request(url=my_url, callback=self.my_handler)
def my_handler(self, response):
# handler
Спасибо за ваши ответы.
======================== Возможное решение:
is_alive = True
def parse(self, response):
my_url = 'http://url.com/item/'
for i in range(1, 100):
if not is_alive:
break
my_url += str(i)
yield Request(url=my_url, callback=self.my_handler)
def my_handler(self, response):
if (response do not contains new item):
is_alive = False
1 ответ
Согласно исходному коду, если есть CloseSpider
Возникает исключение, engine.close_spider()
метод будет выполнен:
def handle_spider_error(self, _failure, request, response, spider):
exc = _failure.value
if isinstance(exc, CloseSpider):
self.crawler.engine.close_spider(spider, exc.reason or 'cancelled')
return
engine.close_spider()
Сам бы закрыл паука и очистил бы все оставшиеся запросы:
def close_spider(self, spider, reason='cancelled'):
"""Close (cancel) spider and clear all its outstanding requests"""
slot = self.slot
if slot.closing:
return slot.closing
logger.info("Closing spider (%(reason)s)",
{'reason': reason},
extra={'spider': spider})
dfd = slot.close()
# ...
Было бы также запланировать close_spider()
требует различных компонентов архитектуры Scrapy: загрузчик, скребок, планировщик и т. д.