要大规模抓取客户评论,你需要渲染 JavaScript 密集型页面,系统地收集所有评论页面或滚动加载的内容,并将评分、文本和日期等关键字段提取为结构化格式。

大多数评论平台无法通过简单的请求返回全部内容。评论是动态加载的,分页显示,可能跨越数十甚至数百页,并且受到速率限制或机器人检测的保护。因此,如果您想要获得超过几页的可靠结果,就需要基于浏览器的爬虫层,并结合一致的解析方法。

本指南演示了如何构建一个生产级评论抓取系统,该系统每天可处理数千条评论,提取准确率超过 95%,并使用基于浏览器的渲染来处理 JavaScript 密集型平台和结构化解析。 可靠的数据收集.

TL;DR 抓取客户评论

大规模抓取客户评论很困难,因为大多数平台动态加载内容,分页显示数百页,并且会主动阻止自动请求,这使得基本的 HTTP 脚本不可靠。

要构建可靠的管道,你需要基于浏览器的 JavaScript 内容渲染、结构化的分页来捕获所有评论,以及一致的解析来将评分、文本和日期等字段提取为可用的数据。

管理这种基础设施、无头浏览器、代理、重试和反机器人处理很快就会变得非常复杂。 Crawlbase 它通过一个 API 处理渲染、阻塞和缩放,从而简化了这一过程,因此您可以专注于提取和分析评论数据,而不是维护抓取系统。

什么是评论抓取?它为什么重要?

评论抓取是指大规模地从电商网站、评论平台和商业目录等渠道自动提取客户反馈的过程。要高效地大规模抓取客户评论,需要三个核心组件:用于处理动态内容的 JavaScript 渲染、用于捕获所有可用评论的系统化分页管理,以及将原始 HTML 转换为可分析数据集的结构化数据提取。

大多数企业依赖评论数据进行竞争情报分析,平均每月分析 2,500 到 10,000 条评论,以指导产品决策。结构化的评论抓取流程如果配置得当,通常可以达到 92% 到 98% 的数据准确率,而基本的 HTTP 请求准确率仅为 60% 到 75%,并且会遗漏 JavaScript 加载的内容。

挑战不仅在于收集评论,还在于随着规模扩大如何保持数据质量。评论平台会不断更新其反机器人防御机制,主要网站平均每 45-90 天就会更改一次 HTML 结构。这意味着您的网络爬虫基础设施必须在可靠性、可维护性和适应性之间取得平衡。

你从客户评论中提取了哪些信息?

最具实用价值的评论数据来自五个在各个平台上始终存在的中心字段,它们分别是:

  • 评分: 这提供了一种标准化的量化情感分析方法。大多数平台使用 1-5 星评级,但也有一些平台,例如 G2,使用 1-10 星评级,需要进行标准化处理。
  • 评论文本: 它包含定性见解,揭示了产品的具体优势和痛点。文本字段通常为 50 到 500 字,较长的评论与更高的有用评分相关,评分越高,得分越高,评分 ...
  • 发布日期: 它能够进行时间序列分析,以跟踪产品更新或竞争对手产品发布后的情绪变化。
  • 购买状态已验证: 它有助于过滤掉可能带有偏见的评论。根据2024年的信任度指标,经过验证的评论在消费者购买决策中的权重是普通评论的3.2倍。
  • 有帮助的投票: 这些评论最有价值,得票最高的评论获得的浏览量是平均评分的 8-12 倍。

关键因素在于结构一致性。当亚马逊使用整数(1-5)表示评分,Trustpilot 使用小数(4.5),而 G2 使用完全不同的评分标准时,不一致的数据结构使得跨平台分析在不进行标准化的情况下无法实现。

简洁统一的格式效果很好:

1
2
3
4
5
6
7
8
{
“评分”: 4.5,
“文本”: “很棒的产品”,
“日期”: “ 2025-01-10”,
“已验证”: true,
“有用投票”: 12,
“网址”: "source_url"
}

一旦所有内容都符合这种结构,就可以跨平台进行比较,而无需额外的清理工作。

如何处理大量使用 JavaScript 的评论页面?

现代评论平台80-95%的内容都是通过客户端渲染的。 JavaScript框架 例如 React、Vue 或 Angular。向这些网站发出的标准 HTTP 请求会返回不完整的 HTML,因为实际的评论内容是在初始页面响应之后加载的。

考虑一下基本请求的情况:服务器返回一个极简的 HTML 框架,其中主要包含 div 占位符和 script 标签。评论内容本身是通过后续由 JavaScript 执行触发的 API 调用加载的,通常在页面初始加载后的 2-4 秒内完成。有些平台采用无限滚动,只有当用户向下滚动时才会加载更多评论,这使得传统的爬虫工具完全无法访问这些内容。

基于浏览器的渲染通过像真实浏览器一样执行 JavaScript 来解决这个问题。爬虫会等待动态内容加载完毕,捕获滚动触发的元素,并返回可供解析的完整 HTML。与直接 HTTP 请求 40-60% 的内容捕获率相比,这种方法可以实现 95% 以上的内容捕获率。

自行构建此基础设施需要管理像 Puppeteer 或 Playwright 这样的无头浏览器,维护代理轮换以避免 IP 封锁(对于中等规模的抓取,通常需要 10-50 个代理),实现失败请求的重试逻辑,以及处理大规模请求中 15-30% 出现的 CAPTCHA 挑战。

为何使用 Crawlbase 用于抓取评论?

Crawlbase 完全移除了这一层。你无需构建自己的基础设施,只需发送一个 JavaScript 请求 并返回完全渲染的 HTML。页面加载方式与真实浏览器加载页面的方式相同。

你得到什么:

  • 开箱即用的 JavaScript 执行
  • 自动 IP 轮换
  • 内置阻塞和速率限制处理功能
  • 一致的 HTML 输出

有两种实现方式 Crawlbase:

评论抓取流程的核心组成部分有哪些?

从宏观层面来看,评论抓取就像一个流水线。每一步都接收原始输入,并将其转化为更易于使用的信息。

实际情况如下:

评论抓取流程图:评论网站连接到 Crawlbase API,然后是获取器层,平台特定的解析器,JSONL 存储,最后是情感分析或仪表板。
  1. 查看网站
    这些是您的数据来源。 Amazon, Trustpilot, G2, Yelp, 谷歌评论它们各自都有自己的结构和特点。
  2. Crawlbase API
    这是检索层。API 不会自行处理代理、代码块或 JavaScript 渲染,而是返回每个页面的完整渲染 HTML。
  3. 提取器
    代码中的一个小层,用于发送请求、处理 page_wait 等参数,并在需要时管理重试。
  4. 解析器(扩展点)
    这里存放着平台特定的逻辑。Trustpilot、Yelp、Amazon 和 G2 都需要不同的选择器。其余的流程保持不变。
  5. JSONL 存储
    解析后的评论以结构化格式存储。JSONL 格式非常适用,因为它简单易用,而且可以轻松地导入到其他系统中。
  6. 情绪/仪表盘
    数据结构化完成后,就可以进行分析了。情感模型、趋势仪表盘、竞品对比等等,这才是真正价值的体现。

几点实用建议:

  • 解析器层是唯一经常发生变化的部分。
  • 设置完成后,其他一切都应该保持稳定。
  • 添加新平台通常意味着添加新的解析器,而不是重写管道。

这种分离使得系统具有可扩展性。每次网站布局更改时,您无需重建所有内容。

在实施此流程之前,您只需要进行最基本的配置。无需复杂,只需足以获取页面和解析结果即可。

入门指南:所需设置和配置

你需要:

您还需要一些用于获取页面和解析 HTML 的库:

如果你以前做过刮削工作,这应该会让你感到熟悉。主要区别在于…… Crawlbase 处理渲染和阻塞,因此您可以专注于提取而不是基础设施。

第一步:如何在不被屏蔽的情况下获取评论页面?

环境准备就绪后,首先拉取完全渲染的 HTML。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
进口 os
进口 要求
token = os.environ.get(“CRAWLBASE_TOKEN”)
网址= "https://www.trustpilot.com/review/example.com"
参数= {
“令牌”:令牌,
“网址”:网址,
“页面等待”: 2000
}
响应 = 请求.get(
“https://api.crawlbase.com/”,
参数=参数,
超时=90
)
html = response.text

此 Crawling API 操作很简单。你发送一个包含账户令牌和目标 URL 的 GET 请求,它就会返回完全渲染的页面。

快速参考:

基本网址: https://api.crawlbase.com

所需参数: token, url

可选参数:

  • page_wait 对于动态内容
  • scroll=truescroll_interval 用于无限滚动页面

建议超时时间:至少 90 秒

典型响应时间:4 至 10 秒

观看 完整的获取脚本 实现了重试机制和错误处理。

步骤 2:处理分页的最简单方法是什么?

仅仅获取单个页面通常是不够的。大多数评论平台会将内容拆分成几十甚至几百个页面。

例如:

  • Trustpilot 使用 ?page=2, ?page=3, 等等
  • 一些平台使用 offset 而不是页码
  • 其他人则依赖于无限滚动。

如果你只请求第一页,你会错过大部分评论。

通常的做法是生成页面 URL,然后循环遍历这些 URL,直到达到限制或没有更多评论返回为止。

获取完整版 分页脚本 在 ScraperHub 中,它包含一个辅助工具,可以从基础评论页面构建分页 URL,并能清晰地处理查询参数。此外,它还提供了一个实用工具,用于在迭代过程中动态更新页码。

一些实用建议:

  • 设置合理的页面限制,避免不必要的请求。
  • 当页面没有返回任何评论时停止。
  • 对于无限滚动页面,请使用 scroll=true 而不是分页

目标是确保收集到所有可用的评论,而不仅仅是第一页的评论。

步骤 3:如何准确解析评论数据?

这就涉及到平台差异了。每个网站的 HTML 结构都不同,因此解析器需要具备灵活性。下面的 Trustpilot 解析器就是一个很好的例子,展示了这方面的实际应用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
进口 re
,来自 bs4 进口 美丽汤
,来自 模型 进口 评价
,来自 解析器.base 进口 评论解析器

Trustpilot解析器(评论解析器):
“”“
从HTML中解析Trustpilot评论卡片。
Trustpilot结构:文章/章节容器中的评论卡片。
选择器可能会发生变化;请根据目标页面结构进行调整。
“”“
DEF 解析(自身,html: STR,source_url: STR = "")-> 名单[审查]:
评论: 名单[评论] = []
汤 = BeautifulSoup(html, “html.解析器”)
# Trustpilot:评论卡片使用 .review-card、[class*="reviewCard"] 等。
cards = soup.select(
"article[data-review-id],"
"[data-review-id]", "
".review-card,"
"[class*='reviewCard'], "
"[class*='review-card'], "
"section[data-review-id]"
)
if 不会 牌:
cards = soup.select('[class*="review"]')
HPMC胶囊in 牌:
尝试:
评论= ._extract_review(card, source_url)
if 评估 review.get(“文本”):
reviews.append(review)
例外:
继续
回报 评论
DEF _extract_review(自我、卡片、source_url: STR) -> 评论:
评论:评论 = {“来源”: “trustpilot”, “网址”: source_url}
# 评分:例如带有 data-rating 或包含“star”的 class 的 span 元素
rating_el = card.select_one(
"[数据评级]", "
"[data-review-rating]", "
“.星级评分, “
'[class*="star"][class*="rating"]'
)
if rating_el:
rating_str = (
rating_el.get(“数据评级”)
or rating_el.get(“数据评论评级”)
or rating_el.get_text(strip=)
)
if rating_str:
匹配 = re.search(r"(\d+(?:\.\d+)?)", STR(rating_str)
if 匹配:
审查[“评分”] = 浮动(匹配。团体(1))
# 文本:评论正文(Trustpilot 使用 reviewContent、review-content__body)
text_el = card.select_one(
"[data-review-body], "
".review-content__body, "
".review-body, "
"p.review-content,"
"[class*='reviewContent'], "
"[class*='review-content']"
)
if text_el:
审查[“文本”] = text_el.get_text(separator=“”,条带=)
# 日期
date_el = card.select_one(
"[data-review-created-at]", "
"time[datetime], "
".review-date"
)
if date_el:
审查[“日期”] = (
date_el.get(“约会时间”)
or date_el.get("data-review-created-at")
or date_el.get_text(strip=)
)
# 已验证
verified_el = card.select_one(
'[class*="verified"], '
'[数据消费者名称]'
)
审查[“已验证”] = verified_el is 不会 没有
# 有帮助的投票
help_el = card.select_one(
"[data-review-helpful-count]", "
'[class*="helpful"]'
)
if 有用的_el:
txt = helped_el.get_text(strip=) or help_el.get("data-review-helpful-count", "")
匹配 = re.search(r"(\d+)", STR(TXT))
if 匹配:
审查[“有用投票”] = INT(匹配。团体(1))
回报 评估

完整代码:ScraperHub → 解析器/trustpilot.py

步骤 4:如何规范化评论抓取数据?

在解析评论时,大多数字段已经结构化。解析器会将评分、文本、日期和其他属性提取成统一的格式。

但是,如果您要跨多个平台工作,则可能需要额外的规范化步骤。

典型调整包括:

  • 将评分转换为通用等级(例如,1-10 → 1-5)
  • 将相对日期解析为标准格式
  • 跨源统一字段名称

对于单一平台,解析器通常就足够了。对于多平台分析,此步骤可确保数据具有可比性。

步骤五:如何存储评论以进行数据分析

评论解析和规范化完成后,需要将其存储为易于后续处理的格式。

JSONL(JSON Lines)是一种简单实用的选择。每条评论都以单行格式编写,这使得数据能够轻松地导入分析工具或数据管道。

完整的实现方案,包括它如何连接到管道,可在 ScraperHub 上找到 → 存储.py

如果计划进一步扩展,以后可以用数据库或数据仓库替换 JSONL。流程的其余部分无需更改。

步骤 6:扩展到多种产品

当你需要扩展规模或收集数十个或数百个网址上的评论时,挑战就开始了。

此时,简单的循环和本地脚本就难以管理了。你需要处理并发、重试和请求调度。这就是…… Crawlbase Enterprise Crawler 用武之地。

你无需逐个发送请求,而是将 URL 列表推送到目标位置。 Crawlbase然后,爬虫程序会在云端处理这些页面。每个页面都会被获取、渲染,并通过 webhook 发送回您的系统。

切换到此模式只需要几个参数:

1
2
参数[“打回来”] = 
参数[“爬行者”] = 我的评价Crawler" #自定义爬虫名称

从那里:

  • URL 并行处理。
  • 失败的请求会自动重试。
  • 您将通过 webhook 异步接收结果。

您不再需要在自己的代码中管理队列或扩展逻辑。

这种设置适用于:

  • 监控多个产品或品牌
  • 收集用于情感分析的大型数据集
  • 定期运行评论抓取程序

如果你只需要处理少量页面,那么 Crawling API 这就足够了。一旦你处理更大的数据集, Enterprise Crawler 消除了大部分运营开销。

完整可运行实现(ScraperHub)

本指南中的示例侧重于流程的各个部分。如果您需要包含简化设置说明的完整项目,可以直接跳转到[此处插入链接]。 评论抓取工具自述文件.

该存储库包含了本指南中介绍的相同流程,因此很容易映射每个步骤:

文件它做什么
配置文件处理 API 令牌、基本 URL、超时和重试等配置。
模型.py定义评论对象(模式)的结构
fetcher.py通过以下方式发送请求 Crawlbase 并检索渲染后的 HTML
分页.py生成和管理分页URL
存储.py将提取的评论保存为 JSONL 格式
解析器/基础.py用于构建自定义评论解析器的基础类
解析器/trustpilot.py用于提取 Trustpilot 评论数据的解析器
主文件运行从获取、解析到存储的完整管道

评论抓取有哪些商业应用?

一旦评论结构化,它们就不仅仅是文字了。你实际上可以利用它们来做决策。

竞争分析

比较竞争对手的评分和用户情绪。不要只看平均值,要找出用户经常抱怨或称赞的地方。

产品改进

按主题对负面反馈进行分类。一旦收集到足够的数据,诸如运输问题或产品缺陷之类的模式就会变得显而易见。

品牌监控

长期跟踪评分趋势。评论数量突然下降或负面反馈激增通常表明存在实际问题。

随着时间的推移情绪

定期运行爬虫程序并衡量用户感知的变化。这有助于您了解更新或修复是否真正改善了用户体验。

结语

抓取客户评论不仅仅是收集文本,而是要构建一个结构化的流程,将原始反馈转化为可衡量的洞察。

一旦跨平台实现评论数据的标准化,你就能追踪用户情绪、发现产品缺陷,并比竞争对手更快地应对市场变化。挑战不仅在于数据提取,还在于如何在无需持续维护的情况下处理渲染、分页、分屏和扩展等问题。

从简单开始:

  1. 创建一个免费的 Crawlbase 帐户
  2. 使用以下方法获取评论页面 Crawling API
  3. 使用平台特定的解析器解析结构化数据
  4. 存储分析结果

随着数据集的增长,请迁移到 Enterprise Crawler 无需管理基础设施即可处理数千个 URL。

创建一个免费账户 现在运行您的第一个评论提取。

常見問題解答

如何从大量使用 JavaScript 的网站上抓取评论?

这些平台使用 React 等框架在浏览器中渲染内容。标准的 HTTP 请求返回的是不完整的 HTML。

你需要一个基于浏览器的爬虫。 Crawlbase 使用 JavaScript 请求 (通过 JavaScript 令牌)在真实的浏览器会话中执行页面,确保所有评论内容在提取之前完全加载。

我可以使用这些数据进行情感分析和机器学习吗?

是的。结构化评论数据通常用于:

  • 情感分类
  • 主题建模
  • 特征提取
  • 随时间变化的趋势分析

一旦评论被规范化为一致的模式,就可以直接将其输入到 NLP 管道或 BI 工具中。

我需要代理服务器才能抓取评论网站的内容吗?

如果你自己组装刮刀,那么答案是肯定的。

你会需要:

  • 旋转代理
  • 验证码处理
  • 浏览器自动化

Crawlbase 它通过自动处理 IP 轮换、反机器人缓解和渲染来消除这一要求,因此您可以专注于解析和分析,而不是基础设施。