我正在抓取亚马逊,我只是抓取标题中包含特定关键字的项目,所以为了做到这一点,我将传递给我的 start_urls 亚马逊搜索包含关键字的链接。现在这个链接在亚马逊的网站上返回了一系列项目,我希望循环它们中的每一个,而不是像下面的代码中那样只获得第一个。我需要以某种方式递增result_0中的0;这是包含特定项目的所有信息的html类,如价格,图像等。
scrapy的最佳做法是抓取列表并从每个项目中删除JSON数组。
我的解析方法
def parse(self, response):
item = AmazonItem()
title = response.xpath('//*[@id="result_0"]/div/div/div/div[2]/div[2]/div[1]/a/@title').extract()
item['name'] = title
item['id'] = re.findall(r'\d+', title)
item['price'] = response.xpath('//*[@id="result_0"]/div/div/div/div[2]/div[3]/div[1]/div[2]/a/span[2]/text()').extract()
item['publication_date'] = response.xpath('//*[@id="result_0"]/div/div/div/div[2]/div[2]/div[1]/span[3]/text()').extract()
item['image'] = response.xpath('//*[@id="result_0"]/div/div/div/div[1]/div/div/a/img/@src').extract()
item['availability'] = response.xpath('//*[@id="result_0"]/div/div/div/div[2]/div[3]/div[1]/div[4]/span/text()').extract()
item['store_link'] = response.xpath('//*[@id="result_0"]/div/div/div/div[2]/div[2]/div[1]/a/@href').extract()
yield item
答案 0 :(得分:1)
我可能会这样做:
def parse(self, response):
for result in response.xpath('//div[@class="s-item-container"]'):
item = AmazonItem()
item['name'] = result.xpath('.//a[contains(@class,"s-access-detail-page")]/@title').extract_first()
item['image'] = result.xpath('.//img/@src').extract_first()
yield item
那它是如何运作的?
我们使用类s-item-container循环遍历所有div。
请注意,在循环中,我们不再使用响应,而是结果。
结果包含亚马逊上显示的每个产品的内容。
我们可以像以前一样使用xpath从中提取信息。
我们用.
启动xpath
如果您忘记了.
,它将使用完整的源代码(与使用响应相同)
因此,xpaths使用class =“s-item-container”在div中搜索a
标记。对图像应用相同的机制。
希望您了解如何执行此操作的逻辑。如果您这样做,您应该能够自己获得所需的其他信息。否则只需评论,我会尽力为你澄清。