@Megos

Как получить данные с 2 сайтов в один item Scrapy в одном пауке?

Первый паук собирает данные и урлы с одного сайта, второй должен пройти по собранным урлам и дополнить данные в тех же айтемах с другого сайта. Но получается либо сохранить данные первого паука, либо только второго.

def parse(self, response): 

        l = ItemLoader(item=Product(), response=response)
        l.add_value('product_url', response.url)
        l.add_xpath('category', '//p/a[contains....')
        l.add_xpath('name', '/html/body/...' )
        
        l.add_value('new_link', new_link)

        yield Request(url=new_link, callback=self.parse_steam, meta={'item': l})

    def parse_steam(self, response):

        l2 = response.meta['item']
        l2.add_xpath('new_links', '//div[@id="search/@href')

        yield l2.load_item()


Так сохраняет данные только первого. Но если тут `l2.add_xpath('new_links', '//div[@id="search/@href')` вместо xpath указать значение, то сохраняет все.

Если заменить `l2 = response.meta['item']` на `l2 = ItemLoader(item=Product(), response=response)`, то парсит урлы из первого паука, но сохраняет данные только второго.

Как сохранить все данные?
  • Вопрос задан
  • 62 просмотра
Пригласить эксперта
Ответы на вопрос 1
gedeys
@gedeys
Все данные с одного сайта передавать по "цепочке" на другой в словаре (cb_kwargs или meta)....
def start_requests(self):
    yield scrapy.Request(
                url=url_1,
                callback=self.parse
            )

def parse(self, response, **cb_kwargs):
    cb_kwargs['some_data'] = response.css('title::text').get()
    yield scrapy.Request(
                url=new_url,
                callback=self.parse_2,
                cb_kwargs=cb_kwargs
            )
def parse_2(self, response, **cb_kwargs):
    print(f"Title from first site {cb_kwargs['some_data']}")
    print(f"Title from second site {response.css('title::text').get()}")
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы