Как собрать данные с разных страниц и назначить один и тот же набор данных? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь сканировать веб-сайт со скупой копией, где item_id вместе с некоторыми данными находится на одной странице, а дополнительная информация об этом элементе - на другой.

Проблема, с которой я сталкиваюсь, как назначитьдополнительная информация к тому же набору данных, найденному на странице 1?

item:

class GetIt(scrapy.Item):
    ID         = scrapy.Field()
    name         = scrapy.Field()

Соответствующая часть моего сканера:

rules = (

        Rule( # first page
            LinkExtractor(allow=['regex']), 
            callback='parse_1'
        ),
        Rule( # second page
            LinkExtractor(allow=['regex']), 
            callback='parse_2'
        ),

        Rule( # index pages
            LinkExtractor(allow=['regex']), 
            follow=True
        ),
    )

    def parse_1(self, response):
        GetIt                    = GetIt()
        GetIt['ID']              = response.xpath('regex').re_first('regex=(\d+)')
        return item

    def parse_2(self, response):
        GetIt                   = GetIt()
        GetIt['name']           = response.xpath('regex').extract()

Так что идея в том, что если правилосрабатывает, он извлекает новый элемент, если срабатывает правило 2, он находит страницу, которая содержит дополнительную информацию об элементах.Правило 3 получает все страницы с индексного сайта.

Таким образом, информация относится к типу страницы 1:

/ maininfo.html

Вторичная информация для элементов типа2:

/ search.php? Itemid = 303

На типе страницы 1 есть ссылка на тип страницы 2, поэтому я могу извлечь ссылку и идентификатор.

ТеоретическиЯ также мог бы просто вызвать страницу непосредственно в функции парсера:

url2 = response.xpath('code').extract_first() # get the link
scrapy.Request(url2, callback=self.parse_unitpage) # get the name from 2nd page
... somehow like this

Возможно ли это?А если нет, то как объединить данные страницы типа 1,2, если идентификатор принадлежит одному и тому же набору данных?

1 Ответ

0 голосов
/ 27 декабря 2018

Я не уверен, что полностью понял, что вы хотите, но, насколько я понимаю, на первой странице вы получаете ID, а на второй вы получаете name.Вот как я бы это сделал:

def parse_1(self, response):
    item = GetIt()
    item['ID'] = response.xpath('regex').re_first('regex=(\d+)')
    url_to_get_name = ...

    yield Request(url_to_get_name, self.parse_2, meta={'item': item})

def parse_2(self, response):
    item = response.meta['item']
    item['name'] = response.xpath('regex').extract()

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