从amazon.ca刮取产品标题

时间:2018-07-14 05:50:11

标签: python scrapy

我正在使用以下链接:https://www.amazon.ca/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=ssd 我想帮助您从亚马逊检索产品标题。我已经尝试了100万种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(),
              }

1 个答案:

答案 0 :(得分:1)

前言

好的,首先,亚马逊有API端点,我建议任何阅读此内容的人都可以在刮取时使用它们: https://docs.aws.amazon.com/AWSECommerceService/latest/DG/Welcome.html

为什么通过HTML抓取使用API​​端点?

  • 如果要抓取的HTML发生更改,您的查询可能会中断。像Amazon这样的网站会不断更新,我希望今天编写的XPath查询不会在几个月后生效。
  • 使用所有这些精美的JavaScript框架,直到发送并处理了非常大的js有效负载后,才会生成某些HTML。
  • 抓取工具通常具有非常大的依赖项跟踪(需要处理很多边缘情况),这会引入大量不必要的故障点。

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

看来自 2018年7月14日起可以使用的XPath查询(不保证明天就可以使用): //*/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(),}

结果(07/14/2018):

{'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查询的策略

许多站点(例如Amazon)都经过非常繁琐的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