最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何通过 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
关键参数说明:
-
fetchFactorScores: 设为"0"表示不拉取维度评分(如工作氛围、薪酬福利等子项),仅主评论; -
reviewType:"employees"(员工评价)或"former_employees"(前员工); -
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)
⚠️ 注意事项与优化建议
-
分页健壮性:API 返回
data["pagination"]["totalPages"]字段,建议先请求第1页获取总页数,再循环拉取,避免硬编码页数; -
请求头与频率:添加
User-Agent头(如'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)'),并控制请求间隔(如time.sleep(1)),降低被限流风险; -
异常处理:
requests.get()应包裹try/except,捕获网络错误、JSON 解析失败及空响应; -
数据完整性:部分评论可能含 HTML 标签(如
<br/>),需用html.unescape()或BeautifulSoup(text, "html.parser").get_text()清洗; -
替代方案:若 API 路径变更,可使用浏览器开发者工具(Network → XHR)实时捕获
reviews请求,复现最新 endpoint 与参数。
通过此方法,你将彻底摆脱 Selenium 渲染延迟与 DOM 同步难题,以轻量、高效、可维护的方式获取 Kununu 全量结构化评论数据。
相关文章
- 华为面板路由器怎么设置(华为面板路由器设置教程) 08-16
- 华为a2路由器覆盖面积(华为a2路由器覆盖面积有多大) 08-16
- 华为ax3路由器覆盖面积(华为ax3路由器覆盖面积有多大) 08-16
- 如何下载汽水音乐电脑版 08-16
- 华为AX6路由器覆盖面积(华为AX6路由器覆盖面积是多大) 08-16
- 华为ax2pro路由器覆盖面积(华为ax2pro路由器覆盖面积是多少) 08-16