我正在使用以下链接: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(),
}
答案 0 :(得分:1)
好的,首先,亚马逊有API端点,我建议任何阅读此内容的人都可以在刮取时使用它们: https://docs.aws.amazon.com/AWSECommerceService/latest/DG/Welcome.html
为什么通过HTML抓取使用API端点?
看来自 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']}
许多站点(例如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