首页 > 解决方案 > 无法从多个页面中抓取评论,并且只能在(新行距)间距之前抓取评论

问题描述

提前感谢您的宝贵时间。我非常感谢。

我正在尝试从亚马逊上抓取产品评论、评级和其他信息。下面是相同的代码。我得到的问题是:

链接到刮 - https://www.amazon.com/product-reviews/B01DFKC2SO/ref=cm_cr_arp_d_viewpnt_lft?pageNumber=

我的代码:


import scrapy
 
 
class ReviewspiderSpider(scrapy.Spider):
 
    name = 'reviewspider'
 
    allowed_domains = ["www.amazon.com"]
    start_urls = [
        'https://www.amazon.com/product-reviews/B01DFKC2SO/ref=cm_cr_arp_d_viewpnt_lft?pageNumber=']
 
    def parse(self, response):
        for review in response.xpath("//div[@id='cm_cr-review_list']/div"):
            yield {
                'Name': review.xpath('.//span[@class="a-profile-name"]/text()').get(),
                'Title': review.xpath('.//a[@data-hook="review-title"]/span/text()').get(),
                'Rating': review.xpath('.//span[@class="a-icon-alt"]/text()').get(),
                'Review': review.xpath('.//span[@data-hook="review-body"]/span/text()').get()
            }
 
        next_page = response.xpath(
            "//a[text()='Next page']").get()
        if next_page:
            yield response.follow(url=next_page, callback=self.parse)

输出:

在此处输入图像描述

标签: pythonscrapyweb-crawlerscrapy-shell

解决方案


您忘记选择 href:

next_page = response.xpath("//a[text()='Next page']/@href").get()

您将整个标签加入到 response.url,而不是 href。

至于为什么要删除文本的问题。文本没有被删除,你只是没有得到它,你只是得到了文本的第一部分。text()返回一个纯文本,如果有
它会拆分文本。

关于如何修复它有两种选择。首先是在跨度选择器的 xpath 中使用字符串函数:

review.xpath('string(.//span[@data-hook="review-body"]/span)').get()

但我不推荐它,因为它只删除选择器中的标签。所以文本将没有它们之间的任何分隔符(例如“我有两个。我有这么多......”“。”和“我”之间没有任何分隔符)。

我建议使用getall方法并获取标签的所有纯文本,然后将它们与您认为合适的分隔符简单地连接起来。

'\n'.join(review.xpath('.//span[@data-hook="review-body"]/span/text()').getall())

推荐阅读