Как предложил Gallaecio, вы можете добавить счетчик, но разница здесь в том, что вы экспортируете элемент после оператора if.Таким образом, почти всегда будет экспортировать 2 элемента.
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.exceptions import CloseSpider
class TitleSpider(scrapy.Spider):
name = "title_bot"
start_urls = ["https://www.google.com/", "https://www.yahoo.com/", "https://www.bing.com/"]
item_limit = 2
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.counter = 0
def parse(self, response):
self.counter += 1
if self.counter > self.item_limit:
raise CloseSpider
yield {'title': response.css('title::text').get()}
Почему почти всегда? , спросите вы.Это связано с расой в методе parse
.
Представьте, что self.counter
в настоящее время равно 1
, что означает, что ожидается экспорт еще одного элемента.Но теперь Scrapy получает два ответа одновременно и вызывает метод parse
для них обоих.Если два потока, выполняющие метод parse
, будут увеличивать счетчик одновременно, они оба будут иметь self.counter
, равный 3
, и, таким образом, оба вызовут исключение CloseSpider
.
В этом случае (что маловероятно, но все же может произойти), паук экспортирует только один элемент.