从亚马逊上删除产品名称。

2024-05-08 16:52:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用此链接:https://www.amazon.ca/s/ref=nb_sb_noss_1?url=search-alias%3Daps&field-keywords=ssd 我想帮助检索亚马逊的产品名称。我已经尝试了无数种xpath和css方法,但无法检索这些项目的产品标题。我在网上看了一下其他人是怎么做的,但是这个链接上的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(),
              }

Tags: httpsimportrefamazon链接wwwutf8xpath
1条回答
网友
1楼 · 发布于 2024-05-08 16:52:38

前言

好吧,首先,Amazon有API端点,我建议阅读本文的任何人都可以使用这些端点而不是刮取: https://docs.aws.amazon.com/AWSECommerceService/latest/DG/Welcome.html

为什么在html抓取上使用API端点?

  • 如果被刮取的HTML发生变化,您的查询可能会中断。像Amazon这样的网站会不断更新,我不希望现在编写的XPath查询在几个月后还能正常工作。在
  • 有了这些奇特的JavaScript框架,一些HTML直到非常大的js有效负载被发送和处理后才会生成。在
  • 刮削工具通常有非常大的依赖关系跟踪(需要处理许多边缘情况),这会引入大量不必要的失败点。在

按原样回答问题(通过刮擦)

截至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(),}

结果(2018年7月14日):

^{pr2}$

构建/查找XPath查询的策略

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

在任何一个chrome网页上,右键单击你认为有你想要的数据并选择“Inspect”,然后在inspector工具中高亮显示的元素节点上,右键单击,选择“Copy”,最后选择“Copy 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

相关问题 更多 >