# 如何抓取Glassdoor的薪资和评论进行薪酬基准测试

Glassdoor将其数据隐藏在登录覆盖层后面——但内容已经在页面的JSON中，位于模态框下方。以下是如何找到雇主ID，读取该JSON，并在不触发封锁的情况下进行薪酬基准测试。

Glassdoor是薪酬和雇主声誉研究的参考数据集——涵盖数百万家公司中的薪资、评级和评论。它还会在你面前弹出一个登录覆盖层，并且限制请求频率。大多数人忽略的技巧是：那个覆盖层只是装饰。公司数据已经加载到页面的JSON中，位于**模态框下方**。本指南展示了如何**抓取Glassdoor的薪资和评论**进行薪酬基准测试——解决雇主ID，读取JSON，并调整请求频率以避免触发403错误。

## 步骤1：将公司解析为雇主ID

每个Glassdoor页面都基于一个数字雇主ID，而不是名称。有一个内部的自动完成端点可以将公司名称映射到其ID——这也是搜索框的驱动机制。访问它，你就可以获得构建其他URL所需的标准名称和ID：

```python
import requests

proxy = "http://USER:PASS@residentialpremium.quantumproxies.io:8080"
proxies = {"http": proxy, "https": proxy}

def find_employer_id(name):
    url = "https://www.glassdoor.com/api-web/employer/find.htm"
    params = {"autocomplete": "true", "maxEmployersForAutocomplete": 10, "term": name}
    r = requests.get(url, params=params, proxies=proxies, timeout=15,
                     headers={"User-Agent": "Mozilla/5.0"})
    return r.json()  # -> [{"id": 7853, "shortName": "eBay", ...}, ...]

print(find_employer_id("eBay"))
```

有了ID，你可以构建概览URL（`/Overview/Working-at-NAME-EI_IE{id}.htm`）和评论URL（`/Reviews/NAME-Reviews-E{id}.htm`）。此时还不需要浏览器。

![四步抓取 Glassdoor：typeahead 端点把 eBay 解析为雇主 ID 7853，用该 ID 构建概览页和评论页 URL，再把页面中的 __NEXT_DATA__ 和 Apollo 缓存作为 JSON 读取；卡片列出了这份 JSON 包含的内容：评分、薪资、公司概况数据和分页游标。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335182/blog/generated/qp-b9-047-diag1.png)
*首先解析ID；每个Glassdoor URL和JSON负载都基于该数字。*

## 步骤2：读取JSON，而不是HTML

Glassdoor是一个Next.js应用程序，因此每个页面的数据都作为JSON块提供——在`__NEXT_DATA__`脚本标签和Apollo GraphQL缓存中。解析这些而不是抓取渲染的DOM：它包含评级、薪资数据、评论文本，以及公司信息如收入、总部、公司规模、成立年份和行业。它比CSS选择器更稳定，后者在`data-test`属性后面不断变化。

```python
import json, re

def scrape_overview(name, employer_id):
    url = f"https://www.glassdoor.com/Overview/Working-at-{name}-EI_IE{employer_id}.htm"
    r = requests.get(url, proxies=proxies, timeout=20,
                     headers={"User-Agent": "Mozilla/5.0"})
    m = re.search(r'<script id="__NEXT_DATA__"[^>]*>(.*?)</script>', r.text, re.S)
    data = json.loads(m.group(1))
    # firmographics + ratings live inside the Apollo cache under props
    return data["props"]["pageProps"]

data = scrape_overview("eBay", 7853)
```

你在浏览器中看到的登录模态框是一个固定的覆盖层（其容器ID为`HardsellOverlay`），绘制在页面上方。因为底层内容已经在DOM和JSON中，读取原始标记的HTTP请求根本不会看到模态框。如果你确实使用浏览器渲染，可以通过一行CSS注入（`display:none`）去掉覆盖层，而不是尝试登录。

## 分页评论和读取薪资分布

评论和薪资是分页的，分页游标位于你已经解析的JSON中——而不是你必须点击的脆弱的“下一页”按钮。读取当前页面的数据，在负载中找到游标或页码，然后直接请求下一页的URL。这就是为什么解析JSON比驱动浏览器更好：你可以用简单的HTTP请求逐页浏览，以你选择的速度。提取每条评论的正文、星级、职位名称、地点和日期，你就有了一个结构化的评论语料库，可以进行情感分析——这与我们在[评论抓取指南](https://quantumproxies.io/blog/scraping-product-reviews-with-proxies)中涵盖的原材料相同。

薪资是更高价值的目标，诚实的建议是将其视为分布而不是点值。单个抓取的数字是噪声；有用的信号是某个职位在特定地点的多个提交的范围和中位数。JSON中提供了你需要的数字——基本工资、每个估算背后的样本数量、货币和地点——所以自己进行汇总，而不是相信任何一个数字。按样本大小加权，去掉数据点太少而无意义的职位，并始终将薪资与其地点和收集日期配对——理想情况下通过该市场的[住宅出口](https://quantumproxies.io/residential-proxies)——因为薪酬基准会过时，并且因市场而异。这种纪律是将抓取的行转化为招聘或财务团队可以实际辩护的基准的关键。它还保护你免于引用一个看似引人注目的数字的经典陷阱，而这个数字实际上基于三年前的两个提交。

## 步骤3：设置地区以便数据与您的市场匹配

Glassdoor通过`tldp` cookie按地区本地化薪资和内容：1是美国，2是英国，3是加拿大，4是印度，5是澳大利亚，6是法国，7是德国。设置它以在你真正关心的市场中进行薪酬基准测试——美国的薪资数据对英国的职位没有意义。将cookie与匹配国家的代理出口配对，以确保请求从头到尾一致。我们的[B2B数据收集指南](https://quantumproxies.io/blog/lead-generation-data-scraping-with-proxies)涵盖了在整个管道中保持地理信号一致。

[获取地理定位的住宅代理](https://quantumproxies.io/residential-proxies)

## 处理403速率限制

Glassdoor对激进的抓取以`HTTP 403`回应，而不是CAPTCHA。将403视为节奏信号，而不是死胡同：指数退避，切换到新的IP，并减慢整体速率。单个数据中心IP在评论分页中行走时在一两页内就会被限制；将请求分散到[住宅池](https://quantumproxies.io/residential-proxies)中，并在其间暂停，以保持低调。

```python
import time, random

def get_with_backoff(url, tries=4):
    for attempt in range(tries):
        r = requests.get(url, proxies=proxies, timeout=20,
                         headers={"User-Agent": "Mozilla/5.0"})
        if r.status_code == 200:
            return r
        if r.status_code == 403:              # rate-limited: pace + rotate
            wait = (2 ** attempt) + random.random()
            time.sleep(wait)                   # rotating gateway gives a new IP
    return None
```

关于伦理和法律的简短说明：以汇总形式进行基准测试。薪资和评级作为分布是有用的；附加到可识别个人的单个评论是个人数据，因此不要重建评论者的个人资料，并尊重Glassdoor的条款和robots指令。这是指导，不是法律建议——请检查您的司法管辖区。我们对[2026年网络抓取合法性](https://quantumproxies.io/blog/is-web-scraping-legal-2026)的概述更深入。

![Glassdoor 的退避循环：收到 200 时返回响应，收到 403 时抓取器按指数退避等待，轮换网关为其分配新 IP；卡片列出了该做和应避免的事：读取 JSON，遇到 403 时退避并轮换，做汇总层面的基准对比，绝不重建个人评论者的档案。](https://res.cloudinary.com/dmqliab0t/image/upload/f_auto,q_auto,w_1200/v1785335182/blog/generated/qp-b9-047-diag2.png)
*读取JSON，调整请求频率，汇总结果——永远不要重建个人评论者的个人资料。*

## 常见问题解答

### 如何使用Python抓取Glassdoor评论？

通过内部自动完成端点将公司解析为其雇主ID，使用该ID构建评论URL，然后解析页面中的`__NEXT_DATA__` JSON而不是HTML。通过住宅代理路由请求，并在任何403时退避。评论文本、评级和分页游标都在那个JSON负载中。

### 我能绕过Glassdoor的登录墙吗？

通常你不需要。登录提示是一个绘制在已经加载到页面及其JSON中的内容上的装饰性覆盖层。读取原始标记的简单HTTP请求从未呈现模态框。如果你使用真实浏览器，用CSS `display:none`注入隐藏覆盖层，而不是登录。

### 为什么Glassdoor返回403错误？

403是Glassdoor对你进行速率限制，通常是因为来自一个IP的请求太多太快。放慢速度，增加指数退避，并通过住宅代理池进行切换，以便请求分散到多个IP。这是一个节奏问题，而不是永久封锁——稳定的、类似人类的时间安排可以解决它。

### 抓取Glassdoor合法吗？

收集公共的、汇总的公司数据进行基准测试通常风险较低，但Glassdoor的条款限制自动访问，个人评论可能是个人数据。保持汇总，不要重建可识别的人，并尊重robots和条款。这是一般指导，不是法律建议——评估你自己的使用案例。

整个工作只有三步：解析雇主ID，读取页面已经包含的JSON，并将请求分配到干净的IP上以使403保持稀少。做到这一点，Glassdoor就会成为一个实时的薪酬基准测试源，而不是一个你不断碰壁的登录墙。

[开始使用住宅代理进行基准测试](https://quantumproxies.io/residential-proxies)
