Scrapy несколько вставок по нескольким ссылкам - PullRequest
0 голосов
/ 20 июня 2019

Вчера я опубликовал вопрос относительно проблемы, но он был потенциально слишком многословным, чтобы с ним бороться. Вместо этого я решил задать тот же вопрос, но с менее подробным примером. Пожалуйста, учтите следующее.

Примечания

  • 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? В настоящее время код демонстрирует здесь пишет все, но мне нужен только последний элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...