【问题标题】:Scraping product title off amazon.ca从 amazon.ca 上刮掉产品标题
【发布时间】:2018-07-14 05:50:11
【问题描述】:

我正在使用此链接:https://www.amazon.ca/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=ssd 我想帮助从亚马逊检索产品标题。我已经尝试了一百万种 xpath 和 css 方法,但无法检索这些项目的产品标题。我在网上查看了其他人是如何做到的,但与此链接上的 html 相比,html 与他们的不同。(抱歉,如果缩进,请尝试手动执行,因为它粘贴时没有正确缩进)。

import scrapy
from scrapy import Spider
class SSDSpider(scrapy.Spider):
    name = "SSD_spider"
    start_urls = ['https://www.amazon.ca/ssd/s?ie=UTF8&page=1&rh=i%3Aaps%2Ck%3Assd','https://www.amazon.ca/s/ref=sr_pg_2? rh=i%3Aaps%2Ck%3Assd&page=2&keywords=ssd&ie=UTF8&qid=1531536732']
    DOWNLOAD_DELAY = 10
    def parse(self, response):
        yield {
                'names': response.xpath('//li[contains(@class,"a-size- base s-incline s-access-title a-text-normal")]/text()').extract(),
              }

【问题讨论】:

  • 虽然对于不支持任何类型的 API 端点的网站来说,scrapy 是一个很好的工具,但你有什么理由不能使用亚马逊的产品搜索 API 端点吗?抓取 HTML 很容易出现您在查看其他示例时遇到的确切错误。如果/当他们更新网站的 html 生成时,您的抓取很可能会失败。 API 端点通常是版本化的,不易出错。

标签: python scrapy


【解决方案1】:

前言

好的,首先,亚马逊有 API 端点,我建议任何阅读本文的人使用它们而不是抓取: https://docs.aws.amazon.com/AWSECommerceService/latest/DG/Welcome.html

为什么使用 API 端点而不是 html 抓取?

  • 如果被抓取的 HTML 发生变化,您的查询可能会中断。像 Amazon 这样的网站不断更新,我不希望今天编写的 XPath 查询在几个月后还能正常工作。
  • 对于所有这些花哨的 JavaScript 框架,在发送和处理非常大的 js 负载之前,不会生成一些 HTML。
  • 抓取工具通常具有非常大的依赖轨迹(需要处理大量边缘情况),这会引入大量不必要的故障点。

按原样回答问题(通过抓取)

XPath 查询似乎在 07/14/2018 有效(不保证明天会有效): //*/div/div/div/div[2]/div[1]/div[1]/a/@title

修改后的代码似乎可以工作。

import scrapy
from scrapy import Spider

class SSDSpider(scrapy.Spider):
    name = "SSD_spider"
    DOWNLOAD_DELAY = 10
    def start_requests(self):
        urls = [
            'https://www.amazon.ca/ssd/s?ie=UTF8&page=1&rh=i%3Aaps%2Ck%3Assd',
            'https://www.amazon.ca/s/ref=sr_pg_2? rh=i%3Aaps%2Ck%3Assd&page=2&keywords=ssd&ie=UTF8&qid=1531536732',
        ]
        for url in urls:
            yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):
        yield {'names': response.xpath('//*/div/div/div/div[2]/div[1]/div[1]/a/@title').extract(),}

结果(2018 年 7 月 14 日):

{'names': ['Kingston Digital A400 SSD 120GB SATA 3 2.5” Solid State Drive SA400S37/120G - Increase Performance', 'Kingston Digital A400 SSD 240GB SATA 3 2.5” Solid State Drive SA400S37/240G - Increase Performance', 'WD Blue 3D NAND 500GB PC SSD - SATA III 6 Gb/s 2.5"/7mm Solid State Drive - WDS500G2B0A', 'Samsung 860 Evo 2.5" SATA III 500GB Internal SSD (MZ-76E500B/AM) [US Version]', 'Crucial MX500 500GB 3D NAND SATA 2.5 inch Internal SSD - CT500MX500SSD1(Z)', 'Kingston Digital A400 SSD 480GB SATA 3 2.5” Solid State Drive SA400S37/480G - Increase Performance', 'Kingston Digital120GB UV400 SSD C2C 2.5" SUV400S37/120G', 'Samsung 860 Evo 2.5" SATA III 250GB Internal SSD (MZ-76E250B/AM) [US Version]', 'Samsung 860 EVO 2.5" SATA III 500GB Internal SSD (MZ-76E500B)', 'WD Blue 3D NAND 250GB SATA III 6Gb/s 2.5-inch 7mm Solid State Drive (WDS250G2B0A)', 'TCSunBow 2.5" SATA3 Internal Solid State Drive 60gb SSD for PC Laptop Desktop POS Game Advertising Machine (X3 60GB)', 'Samsung 860 Evo 2.5" SATA III 1TB Internal SSD (MZ-76E1T0B/AM) [US Version]', 'Crucial MX300 525GB 3D NAND SATA 2.5 Inch Internal SSD - CT525MX300SSD1', 'Crucial MX500 250GB 3D NAND SATA 2.5inch Internal SSD - CT250MX500SSD1(Z)', 'Kingston Digital 240GB UV400 SSD C2C 2.5" SUV400S37/240G']}

构建/查找 XPath 查询的策略

许多网站(如亚马逊)都经历了非常繁重的 HTML 生成过程。正因为如此,通常不可能基于智能命名的类和 id 创建干净整洁的 XPath 查询。所以我通常让另一个软件来完成繁重的工作。在这种情况下,chrome 可以复制元素的 XPath。

在任何 chrome 网页上,右键单击您认为具有所需数据的内容并选择“检查”,然后在检查器工具中突出显示的元素节点上,右键单击,选择“复制”,最后选择“复制 XPath ”。

我复制了几个元素的 XPath,这些元素包含我认为您需要的数据:

//*[@id="result_1"]/div/div/div/div[2]/div[1]/div[1]/a/h2
//*[@id="result_2"]/div/div/div/div[2]/div[1]/div[1]/a/h2
//*[@id="result_3"]/div/div/div/div[2]/div[1]/div[1]/a/h2
...

然后删除了与获取单个结果 id 相关的查询部分,并具有以下内容: //*/div/div/div/div[2]/div[1]/div[1]/a/h2

这将返回整个标题,我假设您只需要产品名称。看起来“title”属性确实有一个名称,所以我将它添加到 XPath 查询中。 //*/div/div/div/div[2]/div[1]/div[1]/a/h2/@title

【讨论】:

  • 谢谢。是的,我尝试了许多不同的 xpath,但在此之前都无法正常工作。
猜你喜欢
  • 2015-09-02
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-28
  • 2022-10-07
  • 1970-01-01
  • 2015-12-19
  • 2018-06-14
相关资源
最近更新 更多