前言
好的,首先,亚马逊有 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