【问题标题】:Can't scrape reviews from multiple pages and it's only scraping reviews before (new line spacing) spacing无法从多个页面中抓取评论,并且只能在(新行距)间距之前抓取评论
【发布时间】:2020-06-23 12:31:59
【问题描述】:

提前感谢您抽出宝贵时间。我真的很感激。

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

  • 首页有 10 条评论。
  • 在抓取的数据中,所有评论仅来自这 10 位客户。
  • 10 行评论数据,然后是一个空行,然后是这 10 行,依此类推。以同样的方式一共 196 行。
  • 此外,如果客户在任何评论中使用“ENTER”作为间距,则评论中只有间距之前的文本。如下图黄色突出显示的那样。

抓取链接 - 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)

输出:

enter image description here

【问题讨论】:

    标签: python scrapy web-crawler scrapy-shell


    【解决方案1】:

    您忘记选择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())
    

    【讨论】:

    • 嗨,伊戈尔,感谢您的回答。您能否帮助回答问题的另一部分“此外,如果客户在任何评论中使用 'ENTER' 来表示间距,那么评论中只有间距之前的文本。如下图黄色突出显示的那样。”以及为什么每次页面更改后都会在 excel 文件中创建一个空行。感谢您的帮助和时间。
    • 嗨@IgorDragushhak,感谢您帮助我。我真的很感谢你的时间。此外,我不清楚为什么我无法抓取所有可用评论的一件事。亚马逊对刮痧有什么限制吗?感谢您的帮助和时间。
    猜你喜欢
    • 2019-12-07
    • 2018-05-31
    • 1970-01-01
    • 2019-10-17
    • 2019-05-08
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多