Jak zeskrobać wynagrodzenia i recenzje z Glassdoor do porównania wynagrodzeń
Glassdoor ukrywa swoje dane za nakładką logowania - ale treść jest już w JSON strony, znajdując się pod modalem. Oto jak znaleźć ID pracodawcy, odczytać ten JSON i porównać wynagrodzenia bez wywoływania blokady.
Glassdoor to referencyjny zbiór danych do badań nad wynagrodzeniami i reputacją pracodawcy - wynagrodzenia, oceny i recenzje w milionach firm. Rzuca także nakładkę logowania na twarz i agresywnie ogranicza tempo. Sztuczka, której większość ludzi nie zauważa: ta nakładka jest kosmetyczna. Dane firmy są już załadowane do JSON strony, znajdując się pod modalem. Ten przewodnik pokazuje, jak zeskrobać wynagrodzenia i recenzje z Glassdoor do porównania wynagrodzeń - rozwiąż ID pracodawcy, odczytaj JSON i dostosuj tempo zapytań, aby nie trafić na ścianę 403.
Krok 1: rozwiąż firmę do ID pracodawcy
Każda strona Glassdoor opiera się na numerycznym ID pracodawcy, a nie nazwie. Istnieje wewnętrzny punkt końcowy typu typeahead, który mapuje nazwę firmy na jej ID - ten sam, który zasila pole wyszukiwania. Uderz w niego, a otrzymasz kanoniczną nazwę plus ID, którego potrzebujesz do zbudowania każdego innego 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"))
Dzięki ID możesz zbudować URL przeglądu (/Overview/Working-at-NAME-EI_IE{id}.htm) i URL recenzji (/Reviews/NAME-Reviews-E{id}.htm). Przeglądarka nie jest jeszcze potrzebna.

Krok 2: odczytaj JSON, nie HTML
Glassdoor to aplikacja Next.js, więc każda strona dostarcza swoje dane jako blok JSON - w tagu skryptu __NEXT_DATA__ i w pamięci podręcznej Apollo GraphQL. Parsuj to zamiast zeskrobywać renderowany DOM: zawiera oceny, liczby wynagrodzeń, tekst recenzji, a także dane firmograficzne, takie jak przychody, siedziba, wielkość firmy, rok założenia i branża. Jest to znacznie bardziej stabilne niż selektory CSS, które Glassdoor rotuje za data-test atrybutami.
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)
Modal logowania, który widzisz w przeglądarce, to stała nakładka (jej id kontenera to HardsellOverlay) narysowana na górze strony. Ponieważ zawartość leżąca pod spodem jest już w DOM i JSON, żądanie HTTP, które odczytuje surowy znacznik, nigdy nie widzi modalu. Jeśli renderujesz z przeglądarką, możesz usunąć nakładkę za pomocą jednowierszowej iniekcji CSS (display:none) zamiast próbować się zalogować.
Stronicowanie recenzji i odczytywanie rozkładów wynagrodzeń
Recenzje i wynagrodzenia są stronicowane, a kursor stronicowania znajduje się w tym samym JSON, który już przeanalizowałeś - nie w delikatnym przycisku "następny", który musisz kliknąć. Odczytaj dane bieżącej strony, znajdź kursor lub numer strony w ładunku i bezpośrednio zażądaj URL następnej strony. Dlatego parsowanie JSON jest lepsze niż sterowanie przeglądarką: przechodzisz przez strony za pomocą zwykłych żądań HTTP, jedno na stronę, w dowolnym tempie, jaki wybierzesz. Wyciągnij treść recenzji, ocenę gwiazdkową, tytuł pracy, lokalizację i datę dla każdego wpisu, a otrzymasz ustrukturyzowany korpus recenzji, który możesz poddać analizie sentymentu - ten sam surowiec omówiony w naszym przewodniku po zeskrobywaniu recenzji.
Wynagrodzenia są celem o wyższej wartości, a uczciwa rada to traktować je jako rozkłady, a nie wartości punktowe. Pojedyncza zeskrobana liczba jest szumem; użyteczny sygnał to zakres i mediana w wielu zgłoszeniach dla danej roli w określonej lokalizacji. JSON ujawnia liczby, których potrzebujesz - podstawowe wynagrodzenie, liczba próbek za każdą estymacją, waluta i lokalizacja - więc agreguj je samodzielnie, zamiast ufać jednej liczbie. Waż według wielkości próby, pomijaj role z zbyt małą liczbą danych, aby były znaczące, i zawsze łącz wynagrodzenie z jego lokalizacją i datą zebrania - najlepiej przez wyjście rezydencjalne na tym rynku - ponieważ porównania wynagrodzeń się starzeją i różnią się znacznie w zależności od rynku. Ta dyscyplina to to, co zamienia zeskrobane wiersze w benchmark, który zespół rekrutacyjny lub finansowy może faktycznie obronić. Chroni cię także przed klasyczną pułapką cytowania jednej przyciągającej wzrok liczby, która okazuje się opierać na dwóch zgłoszeniach sprzed trzech lat.
Krok 3: ustaw region, aby dane pasowały do twojego rynku
Glassdoor lokalizuje wynagrodzenia i treści według regionu za pomocą ciasteczka tldp: 1 to USA, 2 to Wielka Brytania, 3 Kanada, 4 Indie, 5 Australia, 6 Francja, 7 Niemcy. Ustaw je, aby porównać wynagrodzenia na rynku, na którym ci zależy - liczba wynagrodzeń w USA jest bez znaczenia dla roli w Wielkiej Brytanii. Połącz ciasteczko z wyjściem proxy w pasującym kraju, aby żądanie było spójne od początku do końca. Nasz przewodnik po zbieraniu danych B2B obejmuje utrzymanie spójnych sygnałów geograficznych w całym rurociągu.
Zdobądź geotargetowane rezydencjalne proxy
Obsługa limitu szybkości 403
Glassdoor odpowiada na agresywne zeskrobywanie HTTP 403, a nie CAPTCHA. Traktuj 403 jako sygnał tempa, a nie ślepą uliczkę: wycofaj się wykładniczo, przełącz na świeży IP i zwolnij ogólne tempo. Pojedynczy IP z centrum danych przechodzący przez stronicowanie recenzji jest ograniczany w ciągu jednej lub dwóch stron; rozpraszanie żądań w puli rezydencjalnej i pauzowanie między nimi utrzymuje cię pod radarem.
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
Krótka uwaga na temat etyki i prawa: porównuj w agregacie. Wynagrodzenia i oceny są użyteczne jako rozkłady; indywidualne recenzje przypisane do identyfikowalnych osób to dane osobowe, więc nie odbudowuj profili recenzentów i szanuj Warunki Glassdoor i dyrektywy robots. To jest wskazówka, a nie porada prawna - sprawdź swoją jurysdykcję. Nasz przegląd legalności zeskrobywania w 2026 roku idzie głębiej.

Często zadawane pytania
Jak zeskrobać recenzje z Glassdoor za pomocą Pythona?
Rozwiąż firmę do jej ID pracodawcy za pomocą wewnętrznego punktu końcowego typu typeahead, zbuduj URL recenzji z tym ID, a następnie przeanalizuj JSON __NEXT_DATA__ na stronie zamiast HTML. Kieruj żądania przez rezydencjalne proxy i wycofaj się przy każdym 403. Tekst recenzji, oceny i kursory stronicowania znajdują się w tym ładunku JSON.
Czy mogę przejść przez ścianę logowania Glassdoor?
Zwykle nie musisz. Monit logowania to kosmetyczna nakładka narysowana na treści, która jest już załadowana na stronie i w jej JSON. Zwykłe żądanie HTTP, które odczytuje surowy znacznik, nigdy nie renderuje modalu. Jeśli używasz prawdziwej przeglądarki, ukryj nakładkę za pomocą iniekcji CSS display:none zamiast logować się.
Dlaczego Glassdoor zwraca błędy 403?
403 to ograniczenie tempa Glassdoor, zazwyczaj dlatego, że zbyt wiele żądań pochodziło z jednego IP zbyt szybko. Zwolnij, dodaj wykładnicze wycofanie i przełączaj się przez pulę rezydencjalnych proxy, aby żądania rozprzestrzeniły się na wiele IP. To problem z tempem, a nie trwała blokada - stałe, ludzkie tempo to rozwiązuje.
Czy zeskrobywanie Glassdoor jest legalne?
Zbieranie publicznych, zbiorczych danych firmowych do porównania jest zazwyczaj mniej ryzykowne, ale Warunki Glassdoor ograniczają zautomatyzowany dostęp, a indywidualne recenzje mogą być danymi osobowymi. Trzymaj się agregatu, nie rekonstruuj identyfikowalnych osób i szanuj robots i Warunki. To ogólne wskazówki, a nie porada prawna - oceń swój własny przypadek użycia.
Cała praca to trzy ruchy: rozwiąż ID pracodawcy, odczytaj JSON, który strona już zawiera, i dostosuj tempo zapytań na czystych IP, aby 403 były rzadkie. Zrób to, a Glassdoor stanie się żywym źródłem porównań wynagrodzeń, a nie ścianą logowania, od której ciągle się odbijasz.