【问题标题】:Python / Scrapy - code skips products, even though xpath is the same for all products listedPython / Scrapy - 代码跳过产品,即使列出的所有产品的 xpath 都是相同的
【发布时间】:2021-03-12 09:15:33
【问题描述】:

试图从包含历史产品数据的www.archive.org 中抓取信息。我在下面的代码尝试单击列出的每个产品,scrape 每个产品的信息,并对后续页面执行相同操作。

问题是它跳过了一些产品(特别是 20 个),即使 xpath:

 products = response.xpath("//article[contains(@class,'product result-prd')]")

对于所有产品都是一样的。请在下面查看我的完整代码。


class CurrysSpider(scrapy.Spider):
    name = 'currys_mobiles_2015'
    #allowed_domains = ['www.currys.co.uk']
    start_urls = ['https://web.archive.org/web/20151204170941/http://www.currys.co.uk/gbuk/phones-broadband-and-sat-nav/mobile-phones-and-accessories/mobile-phones/362_3412_32041_xx_xx/xx-criteria.html']

    def parse(self, response):
        products = response.xpath("//article[contains(@class,'product result-prd')]") # done

        for product in products:
            brand = product.xpath(".//span[@data-product='brand']/text()").get() # done
            link = product.xpath(".//div[@class='productListImage']/a/@href").get() # done
            price = product.xpath(".//strong[@class='price']/text()").get().strip() # done
            description = product.xpath(".//ul[@class='productDescription']/li/text()").getall() # done

            absolute_url = link # done
           
            yield scrapy.Request(url=absolute_url,callback=self.parse_product,
             meta={'brand_name':brand,
            'product_price':price,
            'product_description':description}) # done

        # process next page
        next_page_url = response.xpath("//ul[@class='pagination']//li[last()]//@href").get()
        absolute_next_page_url = next_page_url

        if next_page_url:
            yield scrapy.Request(url=absolute_next_page_url,callback=self.parse)


    def parse_product(self, response):
        .....

我在尝试抓取的许多网站中都注意到了这个问题,但我不确定为什么会跳过某些产品,因为所有产品列表的 xpath 都是相同的。

希望能对此提供一些反馈。

【问题讨论】:

    标签: python xpath web-scraping scrapy response


    【解决方案1】:

    由于 JS 加载,个别页面可能无法正确加载,因为您的代码的其余部分看起来不错(尽管我建议使用 normalize-space($xpath) 而不是 .strip() 的价格)。

    为了测试这个(在 Chrome 上),访问你的目标网页,打开 Chrome 开发工具(F12),点击“控制台”和 Ctrl+Shift+P 拉出命令窗口。

    接下来,输入“禁用 Javascript”并在出现时选择该选项。现在,Ctrl+R 刷新页面,这是您的网络抓取工具获得的“视图”。现在检查您的 Xpath 表达式。

    如果您确实有问题,请考虑使用 scrapy-splashscrapy-selenium 加载此 JS。

    编辑:我会检查内存泄漏的可能性。根据scrapy docs,在回调中使用元属性有时会导致泄漏。

    【讨论】:

    • 感谢您的回答。使用normalize-space 而不是strip 是一个好点。关于你的其余答案,这正是我所做的。我关闭 JS 并检查页面,并使用 Scrapy 控制台先测试 xpath 表达式。
    【解决方案2】:

    尝试查看这些产品是否存在于页面 html 中或通过 js 加载。 只需 ctrl+U 并检查这些产品的 html 正文。

    【讨论】:

    • 感谢您的回答。不幸的是,情况并非如此,因为当我使用xpath 搜索网站的 HTML 树时,即使禁用 JS 也可以找到产品。
    • 我建议使用response.css('article.product'),因为它的选择器更宽一些,但仍然适合您的目的。而且它更漂亮(:其次,我建议您使用例如 IPDB,条件如下 - 如果没有找到产品 - 转到调试器。保存页面 html 并手动检查,因为您的代码对我来说看起来不错。
    • 谢谢。那么你的意思是在网页抓取时通常使用css而不是xpath?还是只是在特定场合?
    猜你喜欢
    • 2013-12-24
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多