#python #scrapy
#питон #скребок
Вопрос:
Я пытаюсь извлечь данные веб-страницы с помощью scrapy
, и все идет хорошо, пока мне не понадобится собрать несколько элементов из URL-адреса элементов.
Веб-сайт, который я извлекаю, — это eBay, и я отправлю ответ на веб-страницу и соберу информацию об URL-адресе товаров и цене. Вот конкретный код, который я использовал:
def parse(self, response, page_cntr): if page_cntr gt; 5000: return all_cards = response.xpath('//div[@class="s-item__wrapper clearfix"]') for card in all_cards: loader = ItemLoader(EbayItem(), selector=card) loader.add_xpath('name', './/h3/text()') loader.add_xpath('price', './/span[@class="s-item__price"]//text()') loader.add_xpath('product_url', './/a[@class="s-item__link"]//@href')
А затем я отправлю URL-адреса продуктов в yield в виде запроса на получение URL-адреса продуктов. Я повторю следующие несколько страниц на веб-странице (для чего page_cnt
она предназначена) с моим следующим кодом, но затем, когда я создаю функцию для извлечения сведений из URL-адреса продукта, у меня возникают проблемы.
Это сработает, если я настрою свой код таким образом, чтобы получить дополнительные данные вместе с тем, что описано в приведенном выше фрагменте кода:
def parse_product_details(self, response, loader): location = response.xpath("//span[@itemprop='availableAtOrFrom']/text()").get() loader.add_value('location', location) yield loader.load_item()
Однако, если бы я хотел получить дополнительную информацию со страницы продукта, я бы подошел к ней так:
def parse_product_details(self, response, loader): #location = response.xpath("//span[@itemprop='availableAtOrFrom']/text()").get() data_cards = response.xpath('//div[@class="tab-content-m"]').get() for details in data_cards: loader = ItemLoader(EbayItem(), selector=details) loader.add_xpath('condition','.//div[@class="ux-layout-section__row"][3]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('character','.//div[@class="ux-layout-section__row"][1]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('rarity','.//div[@class="ux-layout-section__row"][8]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('graded','.//div[@class="ux-layout-section__row"][4]/div[@class="ux-labels-values__values"][2]/div[@class="ux-labels-values__values-content"]/div/span//text()') loader.add_xpath('set','.//div[@class="ux-layout-section__row"][1]/div[@class="ux-labels-values__values"][1]/div[@class="ux-labels-values__values-content"]/div/span//text()') yield loader.load_item()
Но таким образом я не получаю никаких данных. Как я могу получить дополнительные сведения на странице продукта, как это было бы при использовании первых двух фрагментов кода?
Комментарии:
1. всегда помещайте полное сообщение об ошибке (начинающееся со слова «Обратная связь») в вопрос (не в комментариях) в виде текста (не скриншот, не ссылка на внешний портал). Есть и другая полезная информация.
2. лучше создайте минимальный рабочий код с реальным URL-адресом, чтобы мы могли просто скопировать его и увидеть проблему.
3. может
parse_product_details
быть, вам следует использовать оригиналloader
вместо создания нового,loader = ItemLoader(EbayItem(), selector=details)
который не знает значения оригиналаloader
. Возможно, вам следует дублировать оригиналloader
в цикле for. И вы должныyield
быть внутриfor
цикла. Если вы используетеyield
afterfor
-loop, вы отправляете только один элемент.