Glassdoor 급여 및 리뷰 스크래핑하여 보상 벤치마킹하는 방법

Glassdoor는 로그인 오버레이 뒤에 데이터를 숨기지만, 콘텐츠는 이미 페이지의 JSON에 있으며 모달 아래에 있습니다. 고용주 ID를 찾고, 그 JSON을 읽고, 차단에 걸리지 않고 보상을 벤치마킹하는 방법을 알려드립니다.

Glassdoor는 보상 및 고용주 평판 연구를 위한 참조 데이터셋입니다 - 수백만 개의 회사에 대한 급여, 평가 및 리뷰를 제공합니다. 또한 로그인 오버레이를 던지고 공격적으로 속도 제한을 합니다. 대부분의 사람들이 놓치는 트릭: 그 오버레이는 화장용입니다. 회사 데이터는 이미 페이지의 JSON에 로드되어 있으며 모달 아래에 있습니다. 이 가이드는 보상 벤치마킹을 위해 Glassdoor 급여 및 리뷰를 스크래핑하는 방법을 보여줍니다 - 고용주 ID를 해결하고 JSON을 읽고 요청 속도를 조절하여 403 벽에 부딪히지 않도록 합니다.

1단계: 회사를 고용주 ID로 해결하기

모든 Glassdoor 페이지는 이름이 아닌 숫자 고용주 ID를 기반으로 합니다. 회사 이름을 ID로 매핑하는 내부 자동 완성 엔드포인트가 있습니다 - 검색 상자를 구동하는 것과 동일한 것입니다. 이를 사용하면 캐논 이름과 모든 다른 URL을 구축하는 데 필요한 ID를 얻을 수 있습니다:

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 요청은 모달을 전혀 보지 않습니다. 브라우저로 렌더링하는 경우 로그인 시도 대신 CSS 주입 (display:none)으로 오버레이를 제거할 수 있습니다.

리뷰 페이지 매기기 및 급여 분포 읽기

리뷰와 급여는 페이지로 나뉘며, 페이지 매김 커서는 이미 구문 분석한 JSON에 있습니다 - 클릭해야 하는 취약한 '다음' 버튼에 있지 않습니다. 현재 페이지의 데이터를 읽고, 페이로드에서 커서나 페이지 번호를 찾아 다음 페이지의 URL을 직접 요청하세요. 이것이 JSON을 구문 분석하는 것이 브라우저를 구동하는 것보다 나은 이유입니다: 원하는 속도로 페이지당 하나의 HTTP 요청으로 페이지를 이동할 수 있습니다. 각 항목에 대해 리뷰 본문, 별점, 직책, 위치 및 날짜를 가져오면 감정 분석을 실행할 수 있는 구조화된 리뷰 코퍼스를 얻을 수 있습니다 - 우리 리뷰 스크래핑 가이드에서 다루는 동일한 원자재입니다.

급여는 더 높은 가치의 목표이며, 정직한 조언은 이를 점 값이 아닌 분포로 취급하는 것입니다. 단일 스크래핑 수치는 잡음이 많습니다; 유용한 신호는 주어진 위치에서 역할에 대한 여러 제출물의 범위와 중간값입니다. JSON은 필요한 숫자 - 기본 급여, 각 추정치 뒤의 샘플 수, 통화 및 위치 - 를 노출하므로 하나의 숫자를 신뢰하지 말고 직접 집계하세요. 샘플 크기로 가중치를 두고, 의미 있는 데이터 포인트가 너무 적은 역할을 제거하고, 급여를 수집된 위치와 날짜와 항상 쌍으로 묶으세요 - 이상적으로는 해당 시장의 주거용 출구를 통해 - 보상 벤치마크는 오래되고 시장에 따라 크게 다르기 때문입니다. 이 규율이 스크래핑된 행을 채용 또는 재무 팀이 실제로 방어할 수 있는 벤치마크로 바꿉니다. 또한 3년 전 두 개의 제출물에 의존하는 단일 눈에 띄는 수치를 인용하는 고전적인 함정으로부터 보호합니다.

3단계: 데이터를 시장과 일치시키기 위해 지역 설정

Glassdoor는 tldp 쿠키를 통해 지역별로 급여와 콘텐츠를 현지화합니다: 1은 미국, 2는 영국, 3은 캐나다, 4는 인도, 5는 호주, 6은 프랑스, 7은 독일입니다. 실제로 관심 있는 시장에서 보상을 벤치마킹하려면 이를 설정하세요 - 미국 급여 수치는 영국 역할에 대해 의미가 없습니다. 요청이 처음부터 끝까지 일관되도록 일치하는 국가의 프록시 출구와 쿠키를 쌍으로 만드세요. 우리의 B2B 데이터 수집 가이드는 파이프라인 전반에 걸쳐 지리적 신호를 일관되게 유지하는 방법을 다룹니다.

지리적 타겟팅 주거용 프록시 얻기

403 속도 제한 처리

Glassdoor는 HTTP 403으로 공격적인 스크래핑에 응답합니다, CAPTCHA가 아닙니다. 403을 막다른 길이 아닌 속도 조절 신호로 취급하세요: 기하급수적으로 후퇴하고, 새 IP로 회전하며, 전체 속도를 늦추세요. 리뷰 페이지 매김을 통해 걷는 단일 데이터센터 IP는 한두 페이지 내에 제한됩니다; 요청을 주거용 풀에 분산하고 그 사이에 일시 정지하면 레이더 아래에 머물 수 있습니다.

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을 구축한 다음 페이지의 __NEXT_DATA__ JSON을 HTML이 아닌 구문 분석하세요. 요청을 주거용 프록시를 통해 라우팅하고 403이 발생하면 후퇴하세요. 리뷰 텍스트, 평가 및 페이지 매김 커서는 모두 그 JSON 페이로드에 있습니다.

Glassdoor 로그인 벽을 넘을 수 있나요?

보통 필요하지 않습니다. 로그인 프롬프트는 이미 페이지와 그 JSON에 로드된 콘텐츠 위에 그려진 화장용 오버레이입니다. 원시 마크업을 읽는 일반 HTTP 요청은 모달을 전혀 렌더링하지 않습니다. 실제 브라우저를 사용하는 경우 로그인 대신 CSS display:none 주입으로 오버레이를 숨기세요.

Glassdoor는 왜 403 오류를 반환하나요?

403은 일반적으로 너무 많은 요청이 하나의 IP에서 너무 빠르게 발생했기 때문에 Glassdoor가 속도 제한을 하는 것입니다. 속도를 늦추고, 기하급수적으로 후퇴하며, 주거용 프록시 풀을 통해 회전하여 요청을 여러 IP에 분산시키세요. 이는 속도 문제이지 영구적인 차단이 아닙니다 - 꾸준하고 인간 같은 타이밍이 이를 해결합니다.

Glassdoor 스크래핑은 합법인가요?

공공의 집계 회사 데이터를 벤치마킹을 위해 수집하는 것은 일반적으로 위험이 낮지만, Glassdoor의 약관은 자동화된 접근을 제한하고 개별 리뷰는 개인 데이터일 수 있습니다. 집계로 유지하고 식별 가능한 사람을 재구성하지 말고 robots 및 약관을 존중하세요. 이는 일반적인 지침이지 법률 자문이 아닙니다 - 귀하의 사용 사례를 평가하세요.

전체 작업은 세 가지 움직임입니다: 고용주 ID를 해결하고, 페이지에 이미 포함된 JSON을 읽고, 깨끗한 IP로 요청을 조절하여 403이 드물게 유지되도록 합니다. 이렇게 하면 Glassdoor는 계속 튕겨 나오는 로그인 벽이 아닌 실시간 보상 벤치마킹 피드가 됩니다.

주거용 프록시로 벤치마킹 시작하기