用scrapy导航div

时间:2017-01-10 03:59:03

标签: python web-scraping scrapy

我正在抓取亚马逊,我只是抓取标题中包含特定关键字的项目,所以为了做到这一点,我将传递给我的 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

1 个答案:

答案 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标记。对图像应用相同的机制。

希望您了解如何执行此操作的逻辑。如果您这样做,您应该能够自己获得所需的其他信息。否则只需评论,我会尽力为你澄清。