python - 无法从多个页面中抓取评论,并且只能在(新行距)间距之前抓取评论
问题描述
提前感谢您的宝贵时间。我非常感谢。
我正在尝试从亚马逊上抓取产品评论、评级和其他信息。下面是相同的代码。我得到的问题是:
- 第一页有 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)
输出:
解决方案
您忘记选择 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())
推荐阅读
- c# - 使用 ServiceStack 增加 AuthSession
- iis - 在 ASP.NET Core 2.1 + IIS 上设置 HTTPS 的麻烦
- vba - End If without Block if - 缩进,但仍然不起作用
- excel - 文件比较报告
- mysql - 获取加密密钥 MYSQL
- python - 使用 TocoConverter.from_keras_model_file 将 Keras 模型转换为 Tensorflow-Lite 时出现问题
- java - Java 10 中的泛型类型到基元?
- javascript - 使用对象组合的多态性 - JavaScript
- laravel - 如何在我的翻译字符串中使用另一个键
- excel - 数据透视表中条形图上的目标线