我昨天发布了一个关于该问题的question,但它可能太冗长而无法应对。相反,我决定问同样的问题,但示例问题较少。请考虑以下内容。
注释
doc_n
代表按年份编制索引的文档。#items.py
import scrapy
class GetQuotesItem(scrapy.Item):
key = scrapy.Field()
value = scrapy.Field()
#spider.py
import scrapy
from get_quotes.items import GetQuotesItem
from scrapy.loader import ItemLoader
class MySpider(scrapy.Spider):
name = 'quotes'
start_urls = ["https://quotes.toscrape.com"]
def parse(self, response):
l = ItemLoader(item = GetQuotesItem(), response = response)
l.add_value('key', 'company')
for i in range(4):
l.add_value('value', 'doc_{}'.format(i))
yield l.load_item()
产量:
{'key': ['company'], 'value': ['doc_0', 'doc_1', 'doc_2', 'doc_3']}
如果我尝试产生相似的结果,但是文档位于单独的文档链接上,例如下面。
class MySpider(scrapy.Spider):
name = 'quotes'
start_urls = ["https://quotes.toscrape.com"]
def parse(self, response):
l = ItemLoader(item = GetQuotesItem(), response = response)
l.add_value('key', 'company')
for i, url in enumerate(response.xpath('/html/body/div/div[2]/div[1]/div[1]/div/a/@href').extract()):
yield response.follow(url, callback = self.parse_page_two, meta = {'l' : l, 'i' : i})
def parse_page_two(self, response):
l = response.meta['l']
l.add_value('value', 'doc_{}'.format(response.meta['i']))
yield l.load_item()
产生:
{'key': ['company'], 'value': ['doc_0']}
{'key': ['company'], 'value': ['doc_0', 'doc_1']}
{'key': ['company'], 'value': ['doc_0', 'doc_1', 'doc_2']}
{'key': ['company'], 'value': ['doc_0', 'doc_1', 'doc_2', 'doc_3']}
我猜这是因为代码对每个链接使用load_item()
,但是我很好奇是否有可能只返回最终项目和/或将最终项目保存为.json
格式例?目前,代码表明here正在编写所有内容,但我只需要最后一个项目。