一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何通过 Kununu 官方 API 稳定抓取完整员工评价与评分数据

时间:2026-08-16 20:19:50 编辑:袖梨 来源:一聚教程网

本文详解如何绕过 Kununu 动态加载限制,直接调用其后端 REST API 分页获取全部员工评价(含完整文本、评分、时间等),避免 Selenium 点击“查看更多”导致的 JSON 数据滞后问题。

本文详解如何绕过 Kununu 动态加载限制,直接调用其后端 REST API 分页获取全部员工评价(含完整文本、评分、时间等),避免 Selenium 点击“查看更多”导致的 JSON 数据滞后问题。

Kununu 的评论页面(如 https://www.kununu.com/de/adidas/kommentare)采用典型的客户端动态渲染 + 服务端分页策略:初始 HTML 中嵌入的 #__NEXT_DATA__ JSON 仅包含首屏(通常为前10条)评论;后续内容通过 Ajax 异步请求加载,而这些请求不会自动更新 #__NEXT_DATA__ 的内容——这正是你遇到“Soup 能看到展开后的内容,但 JSON 始终只有10条”的根本原因。

与其依赖不稳定且易被反爬干扰的浏览器自动化点击(如 show_more_reviews(driver, 2)),更可靠的方式是逆向分析并直接调用 Kununu 的内部评论 API。该 API 设计规范、响应结构清晰,且无需登录或复杂鉴权,是规模化、高稳定性采集的理想路径。

✅ 正确做法:直连评论 API,按页拉取全量数据

首先,需从主页提取企业唯一标识 ID(即 URL 中的 company-id)。Kununu 将其隐藏在任意一条评论链接中(如 <a href="/review/abc123/...">),可通过 BeautifulSoup 快速解析:

from bs4 import BeautifulSoupimport requestsurl = "https://www.kununu.com/de/adidas/kommentare"soup = BeautifulSoup(requests.get(url).content, "html.parser")# 提取 company ID(位于任意评论链接的第5段路径)id_ = soup.select_one('a[href*="/review/"]')["href"].split("/")[5]

随后,构造 API 请求地址与参数。Kununu 的评论接口格式为:

https://www.kununu.com/middlewares/profiles/{country}/{company-slug}/{company-id}/reviews

关键参数说明:

  1. fetchFactorScores: 设为 "0" 表示不拉取维度评分(如工作氛围、薪酬福利等子项),仅主评论;
  2. reviewType: "employees"(员工评价)或 "former_employees"(前员工);
  3. page: 页码(从 1 开始),每页默认返回 10 条。

完整示例(获取前2页共20条评论):

api_url = "https://www.kununu.com/middlewares/profiles/de/adidas/{id_}/reviews"params = {"fetchFactorScores": "0","reviewType": "employees","urlParams": "","page": "1",}for page in range(1, 3):# 可扩展至所需页数,如 range(1, 6) 获取前50条params["page"] = str(page)response = requests.get(api_url.format(id_=id_), params=params)response.raise_for_status()data = response.json()for review in data.get("reviews", []):# 提取核心字段rating = review.get("rating", 0)# 总体评分(1–5)date = review.get("date", "")author_role = review.get("role", "")# 逐段提取评论正文(支持多段文本,如“优点”“缺点”“建议”)texts = []for text_obj in review.get("texts", []):if text_obj.get("text"):texts.append(text_obj["text"].strip())print(f"[评分: {rating}] [{date}] {author_role}")print("n".join(texts))print("-" * 80)

⚠️ 注意事项与优化建议

  1. 分页健壮性:API 返回 data["pagination"]["totalPages"] 字段,建议先请求第1页获取总页数,再循环拉取,避免硬编码页数;
  2. 请求头与频率:添加 User-Agent 头(如 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'),并控制请求间隔(如 time.sleep(1)),降低被限流风险;
  3. 异常处理requests.get() 应包裹 try/except,捕获网络错误、JSON 解析失败及空响应;
  4. 数据完整性:部分评论可能含 HTML 标签(如 <br/>),需用 html.unescape()BeautifulSoup(text, "html.parser").get_text() 清洗;
  5. 替代方案:若 API 路径变更,可使用浏览器开发者工具(Network → XHR)实时捕获 reviews 请求,复现最新 endpoint 与参数。

通过此方法,你将彻底摆脱 Selenium 渲染延迟与 DOM 同步难题,以轻量、高效、可维护的方式获取 Kununu 全量结构化评论数据。

热门栏目