用 Python 调用 Glassdoor 薪资数据 API:按职位、城市和公司查询薪资
做薪酬对标、海外招聘分析或 offer 评估时,最核心的问题是:某个职位在某个城市、某家公司,到底值多少钱。Glassdoor 上有大量员工匿名提交的薪资样本,但网页有登录墙和反爬限制,自建爬虫要维护代理池、Cookie 和页面解析,成本高且不稳定。Glassdoor 数据接口把这些公开数据整理成普通 GET 请求:一次调用就能拿到按职位和公司划分的薪资区间、样本量和置信度。本文用 Python 演示完整链路:公司名解析为 company_id,查单公司薪资,再与市场估值对比,最后批量拉取全公司薪资列表。
接口一览
本文涉及薪资链路的四个操作,完整参数见 Glassdoor 数据 API 文档页:
| 操作 | 必填参数 | 用途 |
|---|---|---|
company-search | query | 按公司名搜索,解析出全项目通用的 company_id |
company-salaries | company_id、job_title | 查某公司某职位的薪资区间(最低/中位/最高) |
salary-estimate | job_title、location | 不限公司,查某职位在某城市的市场薪资估值 |
company-salaries-v2 | company_id | 分页浏览某公司所有职位的薪资报告列表 |
同项目还有公司概览(company-overview)、员工评价(company-reviews)、职位搜索(job-search / company-jobs)和面试经验(company-interviews),FAQ 里会简要说明。
准备工作
注册并在控制台复制自己的 API Key,新账号自带免费测试额度。请把 Key 放在服务端环境变量里(下文用 OPENDATA_API_KEY),不要写进前端代码或公开仓库;Key 出现在查询参数中,可能进入访问日志,注意脱敏。接口数据来自公开内容,仅供研究与信息参考。
第一步:公司名解析为 company_id
除 salary-estimate 外,薪资、评价、职位、面试接口都以 company_id 为入口。先用 company-search 把公司名解析成 ID:
curl --get 'https://api.opendata-api.com/api/project/glassdoor/company-search?key=YOUR_API_KEY' \
--data-urlencode 'query=google' \
--data-urlencode 'limit=5'
响应外层是 {code, message, data} 信封:code=200 只表示平台受理了请求,业务结果要看 data。这里 data 是按相关度排序的公司数组,每项含 company_id、name、rating、review_count、salary_count、job_count、headquarters_location、logo、industry 等字段。建议解析一次后把 company_id 入库,后续接口全部复用它。如果 data 是空数组,说明没有匹配公司,应停止流程而不是原地重试。
第二步:查某公司某职位的薪资
company-salaries 返回单个估值:总包最低/中位/最高(min_salary、median_salary、max_salary),并拆出基本工资(*_base_salary)与额外薪酬(*_additional_pay),附 salary_period(如 YEAR)、salary_currency、salary_count(背后的员工报告数)和 confidence 置信度。可选 location + location_type(CITY/STATE/COUNTRY)把口径从全国收窄到城市,years_of_experience 按经验年限分档:
curl --get 'https://api.opendata-api.com/api/project/glassdoor/company-salaries?key=YOUR_API_KEY' \
--data-urlencode 'company_id=9079' \
--data-urlencode 'job_title=software engineer' \
--data-urlencode 'location=san francisco' \
--data-urlencode 'location_type=CITY'
注意一个容易踩的坑:company_id 不存在时 HTTP 仍是 200,code 也是 200,但响应里没有 data 字段。这是业务层的"未找到",应当停止后续流程,既不能当成有效数据入库,也不要原地重试。
第三步:Python 对比公司薪资与市场行情
salary-estimate 不需要公司 ID,传职位和城市就能拿到该市场的薪资估值区间(含薪资周期与币种)。把两个接口串起来,就能回答"这家公司的 offer 相对市场水平是高是低":
import os
import time
import requests
BASE = "https://api.opendata-api.com/api/project/glassdoor"
KEY = os.environ["OPENDATA_API_KEY"].strip()
def call(operation_id, params):
resp = requests.get(
f"{BASE}/{operation_id}",
params={"key": KEY, **params},
timeout=30,
)
resp.raise_for_status() # HTTP layer: 4xx/5xx means transport or quota trouble
envelope = resp.json()
if str(envelope.get("code")) != "200":
raise RuntimeError(f"Platform rejected the request: {envelope.get('message')}")
return envelope.get("data")
def resolve_company_id(name):
data = call("company-search", {"query": name, "limit": 1})
if not data:
return None # Empty array means no matching employer
return str(data[0].get("company_id"))
def company_salary(company_id, job_title, location=None):
params = {"company_id": company_id, "job_title": job_title}
if location:
params.update({"location": location, "location_type": "CITY"})
# Unknown company id returns HTTP 200 with no data field at all
return call("company-salaries", params)
def market_salary(job_title, location):
return call("salary-estimate", {
"job_title": job_title,
"location": location,
"location_type": "CITY",
})
company_id = resolve_company_id("google")
if company_id is None:
raise SystemExit("Company not found; stop instead of retrying")
offer = company_salary(company_id, "software engineer", location="san francisco")
if offer:
print("company median:", offer.get("median_salary"), offer.get("salary_currency"))
print("reports behind it:", offer.get("salary_count"), offer.get("confidence"))
time.sleep(1) # Pause between calls
market = market_salary("software engineer", "san francisco")
if market:
print("market estimate payload:", market) # Range plus period and currency
第四步:批量拉取全公司薪资列表
需要某公司所有职位的薪资分布时,用 company-salaries-v2 分页浏览,不必一个职位一个职位地查:
curl --get 'https://api.opendata-api.com/api/project/glassdoor/company-salaries-v2?key=YOUR_API_KEY' \
--data-urlencode 'company_id=9079' \
--data-urlencode 'sort=MOST_SALARIES' \
--data-urlencode 'page=1'
sort 支持 MOST_SALARIES(报告数最多的职位优先)、HIGH_TO_LOW(薪资从高到低)、MOST_RECENT(最新报告优先);可用 job_title、location 收窄列表,用 page 逐页翻完。行数据与公司薪资页一致,可直接进分布图或导出 CSV。
薪资字段的解读要点
- 总包与拆分:
median_salary是总包中位数,基本工资与额外薪酬(奖金、股票等)分别在*_base_salary与*_additional_pay里,做对比时先统一口径。 - 周期与币种:
salary_period可能是年薪也可能是时薪,跨国家对比务必先看salary_currency再做汇率归一。 - 样本量加权:
salary_count小、confidence低的估值波动大,建基准库时建议按样本量设最小阈值。 - 区域站点:所有接口支持
domain参数切换区域站点(默认美国站),做英国、印度等市场时带上对应域名,结果更贴近当地口径。
使用场景
- Offer 评估工具:候选人输入公司和职位,对比该公司中位数与市场估值。
- 薪酬对标表:同一职位跨多家目标公司批量查
company-salaries,建基准库。 - 招聘市场分析:
salary-estimate按城市横切同一职位,画薪酬热力图。 - 人力资源预算:按经验年限分档估算各岗位薪酬带。
- 雇主品牌与舆情:
company-reviews拉取员工评价的优缺点文本做情感分析。
常见问题
Glassdoor 有官方 API 吗? 官方接口基本只面向合作方开放,普通开发者很难申请到。本平台提供的是第三方数据接口,数据来自公开可查内容,供研究与信息参考。
怎么抓取 Glassdoor 数据不被封? 不要自建爬虫。网页端有登录墙和行为风控,需要住宅代理池加浏览器指纹,成本高且随时可能失效。走数据接口就是普通 HTTPS 请求,不需要任何代理。
如何获取 Glassdoor 公司 ID?
调用 company-search 传公司名(如 query=google),返回数组里每项的 company_id 即为所求。解析一次入库,后续所有接口复用。
如何批量获取公司薪资数据?
两条路:对固定职位清单循环调 company-salaries;或用 company-salaries-v2 按页翻完某公司全部职位的薪资报告。注意控制请求间隔。
海外招聘信息用什么 API 接口?
本项目的 job-search 支持按关键词和城市搜全球在招职位,可按发布时间、远程、易申请、最低公司评分过滤;company-jobs 则能拉取某公司全部在招岗位。两者都返回职位链接与薪资区间(如雇主披露)。
怎么用 Python 调用 Glassdoor 接口?
见上文完整示例:requests 发 GET,先查 code 信封再取 data,公司名先解析成 company_id,识别"HTTP 200 但无 data"的未找到语义。
薪资对比数据从哪里可以拿到?
公司维度用 company-salaries(含样本量与置信度),市场维度用 salary-estimate(不限公司),两者相减就是溢价或折价。
如何获取某公司的面试经验和面试题?
用 company-interviews 传 company_id,返回候选人提交的面试流程、真实面试题、难度与结果,支持按职位过滤和 received_offer_only 只看拿到 offer 的样本。
怎么做公司评价的舆情监控?
用 company-reviews 定时拉取:每页 10 条,可按关键词、语言、在职状态过滤,按 MOST_RECENT 排序只看最新评价,响应里的 page_count 和 filtered_review_count 用于规划翻页。职位搜索场景注意 job-search 用的是不透明 cursor 翻页令牌,要原样带回,不要按页码推算。另外所有接口都支持 domain 参数切换区域站点(如英国 www.glassdoor.co.uk),做非美国市场时记得带上。
更多支持
如果你还需要 Indeed、LinkedIn、Levels.fyi、Kununu 等相似平台的数据接口,可以通过联系我们页面提出需求,我们会按需评估新增。对数据安全或调用量有更高要求的团队,也支持源码级私有化部署。
立即试用
在 Glassdoor 数据 API 页面在线测试,或阅读 company-search、company-salaries、salary-estimate 与 company-salaries-v2 的参考文档。单次调用费用见定价。