Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Scrapy:为Lowes网站找到正确的选择器(包括屏幕截图)_Python_Css_Scrapy - Fatal编程技术网

Python Scrapy:为Lowes网站找到正确的选择器(包括屏幕截图)

Python Scrapy:为Lowes网站找到正确的选择器(包括屏幕截图),python,css,scrapy,Python,Css,Scrapy,这是我的代码: # -*- 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): star

这是我的代码:

# -*- 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
这在上周起作用了,但后来我的spider被弃用了,因为我假设网站被修改了,所以我所有的选择器都坏了。我正试图找到新的价格选择器,但我一点运气都没有

首先,我检查了这些数据是否是动态创建的,不是这样,所以我认为使用普通的刮擦应该可以,如果我错了,请纠正我。下面是禁用JavaScript时页面的屏幕截图

然后,我检查了PageSource,只需按住CTRL+F键以查找我想要/需要的选择器

这是一个截图,如果有帮助的话

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">.<!-- --
因为:

价格嵌套在这个选择器下,但我仍然没有得到。我最初认为这是因为这是一个“销售”价格,所以我检查了它是否是通过JavaScript生成的,而事实并非如此


编辑:因此,如果任何人决定刮这个网站,他们的产品价格将根据地点的不同而有所不同。我设置的cookie不是为我的本地商店设置的。最粗略的用法是response.css'.sc kjoXOD iNCICL'不是适合您的css选择器,因为

根据您对与其他页面不同的销售定价页面的最新评论,您需要使用更通用的选择器。谢天谢地,Lowe's似乎遵守了定义a的标准,这意味着你比一般人更有信心标记不会从销售页面变为非销售页面

用于响应中的报价。css'[itemtype=http://schema.org/Offer]': offered_price=offer.css'[itemprop=price][content]'.xpath'@content.get
该注释的星号是schema.org标准允许以多种方式编码itemprop信息,并且它们对content=属性的使用只是当前的方式,因此请注意这种更改,因为最粗略的使用,response.css“.sc kjoXOD iNCICL”不是适合您案例的正确css选择器,因为

So then, I inspected page source and just CTRL + F the price to find the selector that I'd want/need.
根据您对与其他页面不同的销售定价页面的最新评论,您需要使用更通用的选择器。谢天谢地,Lowe's似乎遵守了定义a的标准,这意味着你比一般人更有信心标记不会从销售页面变为非销售页面

用于响应中的报价。css'[itemtype=http://schema.org/Offer]': offered_price=offer.css'[itemprop=price][content]'.xpath'@content.get 该注释的星号是schema.org标准允许以多种方式对itemprop信息进行编码,并且它们对content=属性的使用只是当前的方式,因此请注意这种更改

So then, I inspected page source and just CTRL + F the price to find the selector that I'd want/need.
这不是原始的源代码-这是由于javascript而已经更改的html代码

当scrapy处理原始html时,您需要查看原始html代码 您可以通过按CTRU+U或鼠标右键->查看页面源代码不检查来访问它

结果,您可以看到原始html代码和javascript更改的html代码之间存在显著差异

在原始代码中,价格出现在多个地方。 内部脚本标记。-。 内部输入标记:

内部跨距标记:

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]
这不是原始的源代码-这是由于javascript而已经更改的html代码

当scrapy处理原始html时,您需要查看原始html代码 您可以通过按CTRU+U或鼠标右键->查看页面源代码不检查来访问它

结果,您可以看到原始html代码和javascript更改的html代码之间存在显著差异

在原始代码中,价格出现在多个地方。 内部脚本标记。-。 内部输入标记:

内部跨距标记:

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]

谢谢你的回答!我明天试试这个。您是如何确定要使用哪种选择器的?这是否仅仅是尝试和错误,对于我来说,我只是在猜测何时我会查看页面源代码。还有,为什么在.finalPrice之后有“div”?既有经验,又熟悉HTML和CSS选择器;这是一个明智的投资,阅读的CSS选择器参考,知道什么是可能的。但始终,始终寻找语义标记,因为开发人员添加了语义标记,而不是像minifier那样的自动生成工具。div是因为它是实际的元素,也标记了您针对div的价格,仅使用goofy自动生成的CSS类名称,如果我在该页面后面,我会响应。CSS'script[type=application/ld+json]::text'。获取并将其输入json.loads,因为这已经是结构化数据,如果不需要在HTML tagsAlso中四处探索,我只是尝试了一下。最终价格和它仍然没有返回结果。它在scrapy shell中对你有用吗?我不会发布一个答案,我没有尝试,但有一个
能清楚的看到谢谢你的回答!我明天试试这个。您是如何确定要使用哪种选择器的?这是否仅仅是尝试和错误,对于我来说,我只是在猜测何时我会查看页面源代码。还有,为什么在.finalPrice之后有“div”?既有经验,又熟悉HTML和CSS选择器;这是一个明智的投资,阅读的CSS选择器参考,知道什么是可能的。但始终,始终寻找语义标记,因为开发人员添加了语义标记,而不是像minifier那样的自动生成工具。div是因为它是实际的元素,也标记了您针对div的价格,仅使用goofy自动生成的CSS类名称,如果我在该页面后面,我会响应。CSS'script[type=application/ld+json]::text'。获取并将其输入json.loads,因为这已经是结构化数据,如果不需要在HTML tagsAlso中四处探索,我只是尝试了一下。最终价格和它仍然没有返回结果。它在scrapy shell中对你有用吗?我不会发布一个我没有尝试的答案,但你可以清楚地看到谢谢你的回复/解释!我不知道为什么,但我仍然没有从网页上得到销售价格。就像这里的链接:使用这些选择器只能得到物品的完整价格谢谢,我明天会试试!我也会弄明白这一点,但是否有可能在项目中输入2个选择器?意思是我可以使用or语句使用这些选择器填充我的项目吗?销售价格不是与您原始答案中的跨度选择器相同吗?感谢您的回复/解释!我不知道为什么,但我仍然没有从网页上得到销售价格。就像这里的链接:使用这些选择器只能得到物品的完整价格谢谢,我明天会试试!我也会弄明白这一点,但是否有可能在项目中输入2个选择器?这意味着我可以使用or语句使用这些选择器填充我的项目吗?销售价格是否与原始答案中的跨度选择器相同?
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]