Scrapy: Поиск правильного селектора для веб-сайта Lowes (включен скриншот) - PullRequest
1 голос
/ 27 апреля 2020

Итак, вот мой код:

# -*- coding: utf-8 -*-
import scrapy
from ..items import LowesspiderItem
from scrapy.http import Request
import requests
import pandas as pd



class LowesSpider(scrapy.Spider):
    name = 'lowes'

    def start_requests(self):

        start_urls = ['https://www.lowes.com/pd/ZLINE-KITCHEN-BATH-Alpine-Brushed-Nickel-2-Handle-Widespread-Bathroom-Sink-Faucet-with-Drain/1002623090']

        for url in start_urls:
            yield Request(url,
                        headers={'Cookie': 'sn=2333;'}, #Preset a location
                        meta={'dont_merge_cookies': True, #Allows location cookie to get through
                        'url':url}) #Using to get the product SKU

    def parse(self, response):
        item = LowesspiderItem()



        #get product price
        productPrice = response.css('.sc-kjoXOD iNCICL::text').get()




        item["productPrice"] = productPrice




        yield item

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

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

enter image description here


Итак, я проверил источник страницы и просто CTRL + F цена чтобы найти тот селектор, который я бы хотел / нужен.

enter image description here

и вот скриншот в виде текста (если это поможет)

left"><svg data-test="arrow-left" color="interactive" viewBox="0 0 24 24" class="sc-jhAzac boeLhr"><path d="M16.88 5.88L15 4l-8 8 8 8 1.88-1.88L10.773 12z"></path></svg></button><button class="arrowNav right"><svg data-test="arrow-right" color="interactive" viewBox="0 0 24 24" class="sc-jhAzac boeLhr"><path d="M8.88 4L7 5.88 13.107 12 7 18.12 8.88 20l8-8z"></path></svg></button></div></div></div></div></div><div class="sc-iQKALj jeIzsl"><div class="sc-gwVKww kbEspX"><div class="sc-esOvli jhvGZy"><div tabindex="0" class="styles__PriceWrapper-sc-1ezid1y-0 cgqauT"><span class="finalPrice"><div class="sc-kjoXOD iNCICL">$314.96 </div><span class="aPrice large" aria-hidden="true"><sup itemProp="PriceCurrency" content="USD" aria-hidden="true">$</sup><span aria-hidden="true">314</span><sup aria-hidden="true">.<!-- --

и вот ссылка на страницу source: view-source: https://www.lowes.com/pd/ZLINE-KITCHEN-BATH-Alpine-Brushed-Nickel-2-Handle-Widespread-Bathroom-Sink-Faucet-with-Drain/1002623090

Редактировать *


Просматривая веб-сайт, я подумал, что этот селектор будет иметь больше смысла:

productPrice = response.css('.primary-font jumbo strong art-pd-contractPricing::text').get()

потому что: enter image description here

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


РЕДАКТИРОВАТЬ: Так что, если кто-нибудь когда-нибудь решит очистить На этом сайте цены на их продукцию будут различаться в зависимости от местоположения. Повар ie, который я установил, был не для того места, которое я выбрал для своего местного магазина.

Ответы [ 2 ]

1 голос
/ 30 апреля 2020
So then, I inspected page source and just CTRL + F the price to find the selector that I'd want/need.

Это не оригинальный источник - это html код, который уже изменился в результате javascript.

Вам необходимо просмотреть оригинальный html код как scrapy работает с raw html
Вы можете получить к нему доступ, нажав CTRU + U или правую кнопку мыши -> Просмотреть исходный код страницы ( not Inspect )

В результате вы можете увидеть, что Существует существенная разница между исходным кодом html и кодом html, измененным на javascript.

В исходном коде цена встречается в нескольких местах.
Внутри тега script. - некоторые опции .
Внутри input метка:

price = response.css("input[data-productprice]::attr(data-productprice)").extract_first()

Внутри span метка:

 price = response.css('span[itemprop="price"]::attr(content)').extract_first()

UPD селекторы fullprices и saleprices будут немного отличаться.

saleprice = response.css('span[itemprop="price"]::attr(content)').extract_first()
wasprice_text = response.css('span.art-pd-wasPriceLbl::text).extract_first()
if "$" in wasprice_text:
    fullprice =  wasprice_text.split("$")[-1]
1 голос
/ 28 апреля 2020

Как показало бы самое простое использование scrapy shell , response.css('.sc-kjoXOD iNCICL') не является правильным CSS селектором для вашего случая, поскольку пробел означает потомок

На основании вашего обновленного комментария о том, что страницы с ценой продажи отличаются от других страниц, нужно использовать более общий c селектор. К счастью, Lowe's, похоже, соблюдает стандарт https://schema.org/Offer, который определяет итерацию цены , что означает, что вы уверены, что наценка не изменится со страницы продажи на не страница продажи

for offer in response.css('[itemtype="http://schema.org/Offer"]'):
    offered_price = offer.css('[itemprop="price"][content]').xpath('@content').get() 

Звездочка для этого комментария состоит в том, что стандарт schema.org позволяет кодировать информацию itemprop несколькими способами, и их использование атрибута content="" является только текущий способ, так что следите за этим изменением

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