在多个链接上重复多次插入

2024-09-27 00:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我昨天就一个问题发布了一个question,但它可能太冗长而无法处理。取而代之的是,我决定问同样的问题,但不太详细的例子问题。请考虑以下事项:

注释

  • ^代码中的{}表示按年份索引的文档
  • 第一个示例仅在第一页上演示了多次插入(成功)
  • 第二个示例演示了我在尝试在多个页面上插入多个项目时面临的问题

#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正在编写所有内容,但我只需要最后一项


Tags: key代码importselfdivadddocparse

热门问题