Glassdoorの給与とレビューをスクレイピングして報酬をベンチマークする方法

Glassdoorはデータをログインオーバーレイの背後に隠していますが、コンテンツはすでにページのJSONにあり、モーダルの下にあります。ここでは、雇用主IDを見つけ、そのJSONを読み取り、ブロックに引っかからずに報酬をベンチマークする方法を紹介します。

Glassdoorは報酬と雇用主の評判に関する研究のためのリファレンスデータセットです。数百万の企業にわたる給与、評価、レビューが含まれています。しかし、ログインオーバーレイを表示し、積極的にレート制限を行います。多くの人が見逃しているトリックは、そのオーバーレイが化粧的なものであることです。企業データはすでにページのJSONにロードされており、モーダルの下にあります。このガイドでは、報酬をベンチマークするためにGlassdoorの給与とレビューをスクレイピングする方法を示します。雇用主IDを解決し、JSONを読み取り、403の壁にぶつからないようにリクエストを調整します。

ステップ1: 会社を雇用主IDに解決する

Glassdoorの各ページは名前ではなく、数値の雇用主IDに基づいています。会社名をIDにマッピングする内部のタイプアヘッドエンドポイントがあります。これは検索ボックスを動かすものと同じです。それを利用すると、必要なIDと共に正規の名前を取得でき、他のすべてのURLを構築するために必要です。

import requests

proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
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) を構築できます。まだブラウザは必要ありません。

タイプアヘッドの雇用主ID検索からNext.jsとApollo JSONを読み取るGlassdoorスクレイピングパイプラインの図
まずIDを解決します。すべてのGlassdoorのURLとJSONペイロードはその番号に基づいています。

ステップ2: HTMLではなくJSONを読み取る

GlassdoorはNext.jsアプリなので、各ページはJSONブロブとしてデータを提供します。これは__NEXT_DATA__スクリプトタグとApollo GraphQLキャッシュにあります。レンダリングされたDOMをスクレイピングするのではなく、それを解析します。それには評価、給与の数値、レビューのテキスト、収益、本社、会社規模、設立年、業界などのファーモグラフィックスが含まれています。これは、Glassdoorがdata-test属性の背後で回転させるCSSセレクタよりもはるかに安定しています。

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リクエストではモーダルはまったく表示されません。ブラウザでレンダリングする場合は、ログインを試みるのではなく、1行のCSSインジェクション (display:none) でオーバーレイを削除できます。

レビューをページングし、給与分布を読み取る

レビューと給与はページングされており、ページングカーソルはすでに解析したJSONにあります。クリックする必要のある脆弱な「次へ」ボタンではありません。現在のページのデータを読み取り、ペイロード内のカーソルまたはページ番号を見つけ、次のページのURLを直接リクエストします。これがJSONを解析することがブラウザを操作することに勝る理由です。ページごとに1つのプレーンHTTPリクエストでページを移動し、選択したペースで進めます。各エントリのレビュー本文、星評価、職位、所在地、日付を取得し、感情分析を行うための構造化されたレビューコーパスを持つことができます。これは、私たちのレビュー・スクレイピングガイドでカバーされている生の素材と同じです。

給与はより高価値のターゲットであり、正直なアドバイスとしては、それらをポイント値ではなく分布として扱うことです。単一のスクレイプされた数値はノイズが多く、有用なシグナルは、特定の場所での役割に対する多くの提出物の範囲と中央値です。JSONは必要な数値を公開しています - 基本給、各推定の背後にあるサンプル数、通貨、場所 - したがって、任意の1つの数値を信頼するのではなく、独自に集計してください。サンプルサイズで重み付けし、意味のあるデータポイントが少ない役割を削除し、給与をその場所と収集された日付と常にペアにしてください - 理想的にはその市場で住宅用出口を通じて - なぜなら報酬ベンチマークは古くなり、市場によって大きく異なるからです。この規律が、スクレイプされた行を採用または財務チームが実際に擁護できるベンチマークに変えるものです。また、3年前の2件の提出物に基づいていることが判明する目を引く単一の数値を引用するという古典的な罠からも保護されます。

ステップ3: データが市場に一致するように地域を設定する

Glassdoorはtldpクッキーを通じて地域ごとに給与とコンテンツをローカライズします: 1は米国、2は英国、3はカナダ、4はインド、5はオーストラリア、6はフランス、7はドイツです。実際に関心のある市場で報酬をベンチマークするために設定してください - 米国の給与数値は英国の役割には意味がありません。クッキーを一致する国でのプロキシ出口とペアにして、リクエストが端から端まで一貫するようにします。私たちのB2Bデータ収集ガイドは、パイプライン全体で地理的信号を一貫して保つことをカバーしています。

地理ターゲットの住宅用プロキシを取得する

403レート制限の処理

GlassdoorはHTTP 403で積極的なスクレイピングに応答しますが、CAPTCHAではありません。403を行き止まりではなく、ペーシングシグナルとして扱います: 指数的にバックオフし、新しいIPにローテーションし、全体の速度を遅くします。レビューのページングを通過する単一のデータセンターIPは、1ページか2ページ以内にスロットルされます。住宅用プールにリクエストを分散し、その間に一時停止することで、レーダーの下にとどまります。

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年のウェブスクレイピングの合法性の概要はさらに深く掘り下げています。

Glassdoorの給与とレビューをスクレイピングしてブロックを引き起こさないための実行と回避のチェックリスト
JSONを読み取り、リクエストを調整し、結果を集計し、個々のレビュアープロファイルを再構築しないでください。

よくある質問

PythonでGlassdoorのレビューをスクレイピングするにはどうすればよいですか?

内部のタイプアヘッドエンドポイントを介して会社をその雇用主IDに解決し、そのIDでレビューURLを構築し、ページのHTMLではなく__NEXT_DATA__ JSONを解析します。住宅用プロキシを通じてリクエストをルーティングし、403が発生した場合はバックオフします。レビューのテキスト、評価、ページングカーソルはすべてそのJSONペイロードにあります。

Glassdoorのログインウォールを突破できますか?

通常は必要ありません。ログインプロンプトは、ページとそのJSONにすでに読み込まれているコンテンツの上に描かれた化粧的なオーバーレイです。生のマークアップを読み取るプレーンHTTPリクエストは、モーダルをまったくレンダリングしません。実際のブラウザを使用する場合は、ログインする代わりにCSSdisplay:noneインジェクションでオーバーレイを隠します。

なぜGlassdoorは403エラーを返すのですか?

403はGlassdoorがレート制限を行っていることを示しており、通常は1つのIPからのリクエストが多すぎて速すぎるためです。速度を落とし、指数的にバックオフし、住宅用プロキシプールを通じてローテーションして、リクエストを多くのIPに分散させます。それはペーシングの問題であり、永久的なブロックではありません。安定した人間のようなタイミングでクリアします。

Glassdoorのスクレイピングは合法ですか?

公開されている企業データを集計してベンチマークすることは一般的にリスクが低いですが、Glassdoorの利用規約は自動化されたアクセスを制限しており、個別のレビューは個人データである可能性があります。集計を維持し、識別可能な人を再構築せず、robotsと利用規約を尊重してください。これは一般的なガイダンスであり、法的助言ではありません - 自分の使用ケースを評価してください。

全体の作業は3つのステップです: 雇用主IDを解決し、ページにすでに含まれているJSONを読み取り、クリーンなIPでリクエストを調整して403がまれになるようにします。それを行えば、Glassdoorはログインウォールにぶつかるのではなく、ライブの報酬ベンチマークフィードになります。

住宅用プロキシでベンチマークを開始する