Вы не можете сделать это простым способом из-за того, как работает Scrapy. Он обрабатывает запросы асинхронно, выдавая элементы один за другим, сам по себе не ведет никакой истории. Что вы можете сделать, это использовать буфер некоторых элементов в пауке и использовать сигналы , чтобы сбросить все элементы в конце сканирования.
См. Этот фиктивный пример:
import json
import scrapy
from scrapy import signals
class QuotesSpider(scrapy.Spider):
name = 'quotes'
start_urls = ['http://quotes.toscrape.com/page/1/']
items = []
@classmethod
def from_crawler(cls, crawler, *args, **kwargs):
spider = super(QuotesSpider, cls).from_crawler(crawler, *args, **kwargs)
crawler.signals.connect(spider.spider_closed, signal=signals.spider_closed)
return spider
def parse(self, response):
for quote in response.xpath('//div[@class="quote"]'):
item = {
'text': quote.xpath('normalize-space(./span[@class="text"])').extract_first()
}
self.items.append(item)
def spider_closed(self, spider):
with open('items.json', 'wt') as f:
json.dump(self.items, f)