Python Can';t从多个页面中刮取评论,it';s仅在(新行间距)间距之前进行刮片检查

Python Can';t从多个页面中刮取评论,it';s仅在(新行间距)间距之前进行刮片检查,python,scrapy,web-crawler,scrapy-shell,Python,Scrapy,Web Crawler,Scrapy Shell,提前感谢您抽出时间。我真的很感激 我试图从亚马逊网站上获取产品评论、评级和其他信息。下面是相同的代码。我遇到的问题是: 第一页有10篇评论 在爬网数据中,所有评论都只来自这10位客户 10行审查数据,然后是一个空行,然后再这10行,依此类推。以相同方式总共196行 此外,如果客户在任何审查中使用“回车”作为间距,则审查中只有间距前的文本。如下图中以黄色突出显示的 链接到scrape- 我的代码: import scrapy class ReviewspiderSpider(scra

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

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

  • 第一页有10篇评论
  • 在爬网数据中,所有评论都只来自这10位客户
  • 10行审查数据,然后是一个空行,然后再这10行,依此类推。以相同方式总共196行
  • 此外,如果客户在任何审查中使用“回车”作为间距,则审查中只有间距前的文本。如下图中以黄色突出显示的
链接到scrape-

我的代码:


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)
输出:


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)

您忘记选择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文件中会出现空行。谢谢你的帮助和时间。嗨@igordragushak,谢谢你在这方面帮助我。我真的很感谢你抽出时间。此外,有一点我不清楚,那就是为什么我不能把所有可用的评论都删掉。亚马逊对刮削有什么限制吗。谢谢你的帮助和时间。