
本文详解如何绕过 kununu 动态加载限制,直接调用其后端 ajax api 分页获取全部员工评论及评分,避免 selenium 点击模拟的不可靠性与 json 数据滞后问题。
本文详解如何绕过 kununu 动态加载限制,直接调用其后端 ajax api 分页获取全部员工评论及评分,避免 selenium 点击模拟的不可靠性与 json 数据滞后问题。
Kununu 页面(如 https://www.kununu.com/de/adidas/kommentare)采用服务端渲染 + 客户端动态加载混合架构:初始 HTML 包含基础结构,但真实评论数据由前端 JavaScript 通过 Ajax 请求后端 API 动态注入。你当前使用的 #__NEXT_DATA__ 脚本标签仅包含首屏(通常为前10条)静态渲染的初始数据,即使通过 Selenium 模拟点击“Read more reviews”,该 JSON 块也不会自动更新——因为它在页面首次渲染后即固化,后续增量数据仅注入 DOM,不重写该脚本节点。
因此,可靠方案不是等待或解析动态 DOM,而是直接对接其真实数据源:Kununu 的 Reviews API。该接口设计规范、响应稳定,且支持分页与参数化筛选,是规模化采集的首选路径。
✅ 正确做法:直连官方 Reviews API
首先从主页提取企业唯一标识 ID(非 URL 路径中的 adidas,而是评论链接中嵌入的数字 ID):
from bs4 import BeautifulSoup
import requests
url = "https://www.kununu.com/de/adidas/kommentare"
soup = BeautifulSoup(requests.get(url).content, "html.parser")
# 提取任意一条评论链接中的 ID(例如 /review/123456789/...)
id_ = soup.select_one('a[href*="/review/"]')["href"].split("/")[3]然后构造 API 请求(注意:API 地址格式为 https://www.kununu.com/middlewares/profiles/{country}/{company_slug}/{id}/reviews):
api_url = "https://www.kununu.com/middlewares/profiles/de/adidas/{}/reviews"
params = {
"fetchFactorScores": "0", # 是否获取维度评分(如工作氛围、薪酬等),设为0可提速
"reviewType": "employees", # 固定值,表示员工评论
"urlParams": "", # 保留空字符串即可
"page": "1" # 页码,从1开始
}
all_reviews = []
for page_num in range(1, 6): # 抓取前5页(每页约10–15条)
params["page"] = str(page_num)
try:
resp = requests.get(api_url.format(id_), params=params, timeout=10)
resp.raise_for_status()
data = resp.json()
for review in data.get("reviews", []):
# 提取核心字段
rating = review.get("rating", {}).get("overall") # 总体评分(1–5)
author = review.get("author", {}).get("name", "Anonymous")
date = review.get("date", "")
# 多段文本(标题、正文、改进建议等)
texts = [t["text"] for t in review.get("texts", []) if t.get("text")]
full_text = "\n".join(texts)
all_reviews.append({
"rating": rating,
"author": author,
"date": date,
"text": full_text
})
except (requests.RequestException, KeyError, ValueError) as e:
print(f"第 {page_num} 页请求失败:{e}")
break⚠️ 注意事项与最佳实践
-
User-Agent 必须设置:Kununu API 会拒绝无 UA 的请求,建议添加
headers={"User-Agent": "Mozilla/5.0..."}; - 请求频率控制:单次抓取建议间隔 ≥1 秒,避免触发风控;大规模采集请使用代理池与随机延迟;
-
ID 稳定性验证:企业 ID 可能随网站重构变化,建议每次运行前校验
soup.select_one('a[href*="/review/"]')是否存在; -
错误处理强化:API 返回可能为空或结构变更,需对
data.get("reviews")和嵌套键做防御性访问; -
评分字段说明:
review["rating"]["overall"]为整数(1–5),另有"factors"字典提供细分维度(如workLifeBalance,salary),按需解析。
该方法完全规避了浏览器自动化带来的性能开销、稳定性风险与反爬干扰,数据完整性与一致性显著优于 DOM 解析+JSON 混合策略。对于需要长期维护的采集任务,这是更专业、可持续的技术选型。

















