Jak scrapować recenzje firm i dane o wynagrodzeniach z Glassdoor w 2026 (BFF GraphQL, DataDome i proxy)

Praktyczny przewodnik dla inżynierów danych HR: jak pobierać publiczne recenzje Glassdoor przez proxy residensialne, omijać DataDome i Cloudflare, oraz korzystać z endpointów GraphQL BFF z zachowaniem GDPR i CFAA.

How to Scrape Glassdoor Company Reviews and Salaries in 2026 (BFF GraphQL, DataDome, and Proxies)

Zastrzeżenie prawne: Ten artykuł dotyczy wyłącznie dostępu do publicznie dostępnych danych na Glassdoor. Scrapowanie stron w sposób naruszający Computer Fraud and Abuse Act (CFAA) w USA lub RODO (GDPR) w UE może być nielegalne. Zawsze sprawdzaj Warunki korzystania z Glassdoor, plik robots.txt i stosuj się do ograniczeń stawek. Nie scrapeuj danych za loginem bez wyraźnej zgody platformy.

Dla zespołów HR-analytics i inżynierów rynku pracy, scrape Glassdoor oznacza ekstrakcję publicznych recenzji, ocen i zagregowanych danych o wynagrodzeniach w skali masowej. Glassdoor jest cennym źródłem nastrojów pracowników, ale jego infrastruktura anty-botowa — DataDome i Cloudflare Bot Management — sprawia, że zwykłe biblioteki HTTP zawodzą. W tym przewodniku pokazujemy, jak zbudować Glassdoor reviews scraper używając proxy residensialnych ProxyHat, emulacji TLS Chrome i endpointów GraphQL BFF, z pełnym poszanowaniem limitów prawnych.

Dlaczego scrapowanie Glassdoor jest trudne w 2026 roku

Glassdoor chroni swoje dane wieloma warstwami. Strony recenzji pod URL-em /Reviews/<company>-Reviews-E<id>.htm są publicznie dostępne, ale Glassdoor intensywnie monitoruje automatyczny ruch. Główne przeszkody to:

  • DataDome — system ochrony botów oparty na ocenie IP, sygnaturach przeglądarki i analizie behawioralnej. Według dokumentacji DataDome, platforma analizuje ponad 40 sygnatur w czasie rzeczywistym.
  • Cloudflare Bot Management — wyzwania JavaScript, fingerprinting TLS (JA3/JA4), i weryfikacja nagłówków HTTP.
  • Wymóg logowania dla pełnych danych o wynagrodzeniach — Glassdoor wymaga konta do przeglądania szczegółowych breakdownów płacowych, co wykracza poza zakres legalnego publicznego scrapowania.

Zwykły requests.get() w Pythonie zostanie zablokowany w ciągu kilku zapytań, ponieważ biblioteka urllib3 ma charakterystyczną sygnaturę TLS, którą systemy anty-bot łatwo identyfikują.

Co jest dostępne bez logowania vs. za autoryzacją

Zanim zaczniesz budować Glassdoor salary data pipeline, musisz zrozumieć granicę danych publicznych i gated:

Typ danychDostępnośćUwagi
Przegląd firmy (overview)PublicznyNazwa, branża, wielkość, lokalizacja HQ
Skrócone recenzje (truncated)PublicznyratingOverall, pros, cons, jobTitle — widoczne na stronie listy
Pełne recenzjePubliczny (z ograniczeniami)Dostępne, ale DataDome ogranicza liczbę zapytań
Szczegółowe wynagrodzeniaZa loginemNie scrapeuj — wymaga konta, narusza ToS
Zagregowane zakresy płacCzęściowo publiczneTylko jeśli widoczne bez logowania
Kluczowa zasada: Jeśli dane wymagają zalogowania się na konto Glassdoor, ich scrapowanie narusza Warunki korzystania i potencjalnie CFAA. Ten przewodnik obejmuje wyłącznie dane publiczne.

Stack anty-bot Glassdoor: DataDome + Cloudflare

Fingerprinting TLS i dlaczego curl_cffi jest konieczny

Cloudflare i DataDome używają fingerprintingu TLS do rozróżniania prawdziwych przeglądarek od botów. Biblioteka requests w Pythonie używa urllib3, którego handshake TLS (ClientHello) różni się od Chrome. To wystarczy, aby zostać oznaczonym jako bot.

Rozwiązaniem jest curl_cffi — biblioteka Pythona, która używa biblioteki C curl skompilowanej z emulacją TLS Chrome. Oznacza to, że Twój handshake TLS jest identyczny z przeglądarką Chrome, co omija podstawowe kontrole JA3/JA4.

from curl_cffi import requests as cffi_requests

session = cffi_requests.Session(impersonate="chrome120")
response = session.get("https://www.glassdoor.com/Reviews/Example-Reviews-E12345.htm")
print(response.status_code)  # 200 zamiast 403

Sam curl_cffi nie wystarczy jednak na dłuższą metę — DataDome ocenia również reputację IP. Setki zapytań z tego samego adresu IP zostaną oflagowane, dlatego rotacja proxy residensialnych jest krytyczna.

Endpointy GraphQL BFF: ukryte API Glassdoor

Glassdoor używa architektury Backend-for-Frontend (BFF) z endpointami GraphQL do zasilania interfejsu. Te endpointy zwracają ustrukturyzowane JSON z recenzjami, co jest znacznie wygodniejsze niż parsowanie HTML.

  • /graph — główny endpoint GraphQL
  • /bff/ — endpointy BFF zwracające zagregowane dane

Endpointy te wymagają nagłówka gd-csrf-token, który jest generowany po stronie klienta i powiązany z ciasteczkami sesji DataDome. Musisz najpierw odwiedzić stronę recenzji, odebrać ciasteczka DataDome i token CSRF, a następnie użyć ich w zapytaniu GraphQL.

Dlaczego proxy residensialne pokonują ocenę IP DataDome

DataDome klasyfikuje adresy IP według reputacji: datacenter IPs (AWS, GCP, DigitalOcean) są natychmiast oflagowane jako wysokie ryzyko. Proxy residensialne używają adresów IP przypisanych do realnych dostawców ISP (Comcast, AT&T, Orange), co daje im wysoką reputację. Rotacja IP na każde zapytanie lub sesję zapobiega kumulowaniu się flag ryzyka na jednym adresie.

Praktyczna implementacja: Python + ProxyHat + GraphQL BFF

Poniżej znajduje się kompletny przykład pobierania jednej skróconej recenzji przez endpoint BFF GraphQL z użyciem proxy residensialnych ProxyHat.

from curl_cffi import requests as cffi_requests
import json

# Konfiguracja proxy residensialnego ProxyHat
# Format: http://UŻYTKOWNIK:HASŁO@gate.proxyhat.com:8080
# Geo-targeting: user-country-US w nazwie użytkownika
PROXY_URL = "http://user-country-US-session-abc123:twoje_hasło@gate.proxyhat.com:8080"

session = cffi_requests.Session(impersonate="chrome120")
session.proxies = {"http": PROXY_URL, "https": PROXY_URL}

# Krok 1: Odwiedź stronę recenzji, aby odebrać ciasteczka DataDome i CSRF token
review_page_url = "https://www.glassdoor.com/Reviews/Acme-Corp-Reviews-E12345.htm"
page_response = session.get(review_page_url, timeout=30)

if page_response.status_code != 200:
    print(f"Blokada: {page_response.status_code}")
    exit()

# Wyciągnij gd-csrf-token z HTML lub ciasteczek
csrf_token = None
for cookie in session.cookies:
    if "csrf" in cookie.name.lower():
        csrf_token = cookie.value
        break

# Alternatywnie, token może być w meta tagu HTML
import re
token_match = re.search(r'gd-csrf-token"\s*[:=]\s*["\']([^"\']+)', page_response.text)
if token_match:
    csrf_token = token_match.group(1)

# Krok 2: Zapytanie GraphQL BFF o recenzje
graphql_url = "https://www.glassdoor.com/bff/reviews"
headers = {
    "Content-Type": "application/json",
    "gd-csrf-token": csrf_token,
    "Origin": "https://www.glassdoor.com",
    "Referer": review_page_url,
}

query = {
    "operationName": "GetReviews",
    "variables": {
        "employerId": 12345,
        "cursor": None,
        "limit": 10
    },
    "query": """
        query GetReviews($employerId: Long!, $cursor: String, $limit: Int) {
          reviews(employerId: $employerId, after: $cursor, first: $limit) {
            edges {
              node {
                ratingOverall
                pros
                cons
                jobTitle
              }
              cursor
            }
            pageInfo {
              hasNextPage
              endCursor
            }
          }
        }
    """
}

response = session.post(graphql_url, json=query, headers=headers, timeout=30)
data = response.json()

# Krok 3: Parsuj recenzje
for edge in data.get("data", {}).get("reviews", {}).get("edges", []):
    node = edge["node"]
    print(f"Ocena: {node['ratingOverall']}")
    print(f"Stanowisko: {node['jobTitle']}")
    print(f"Zalety: {node['pros'][:100]}...")
    print(f"Wady: {node['cons'][:100]}...")
    print("---")

Ten kod pobiera skrócone recenzje z polami ratingOverall, pros, cons i jobTitle — wszystkie dostępne publicznie bez logowania.

Rotacja IP, sesje sticky i paginacja

Sesje sticky dla ciasteczek DataDome

DataDome weryfikuje ciasteczka sesji powiązane z adresem IP. Jeśli zmienisz IP w środku sesji, ciasteczka stają się nieważne i otrzymasz wyzwanie CAPTCHA. Dlatego używaj sesji sticky w ProxyHat:

# Sesja sticky — ten sam IP dla wielu zapytań
PROXY_STICKY = "http://user-country-US-session-rev123:hasło@gate.proxyhat.com:8080"

# Po zakończeniu paginacji zmień sesję (nowy IP)
PROXY_NEW_SESSION = "http://user-country-US-session-rev456:hasło@gate.proxyhat.com:8080"

Paginacja kursorowa

GraphQL BFF używa paginacji kursorowej (cursor-based pagination). Każda odpowiedź zawiera pageInfo.endCursor, którego używasz jako cursor w następnym zapytaniu.

cursor = None
all_reviews = []

while True:
    query["variables"]["cursor"] = cursor
    response = session.post(graphql_url, json=query, headers=headers, timeout=30)
    data = response.json()
    
    reviews = data["data"]["reviews"]
    all_reviews.extend([e["node"] for e in reviews["edges"]])
    
    if not reviews["pageInfo"]["hasNextPage"]:
        break
    
    cursor = reviews["pageInfo"]["endCursor"]
    
    # Pacing: 2-5 sekund między zapytaniami
    import time
    time.sleep(3)

print(f"Pobrano {len(all_reviews)} recenzji")

Logika retry przy wyzwaniach

Gdy DataDome zwróci wyzwanie (status 403 lub 429), nie ponawiaj natychmiast. Zamiast tego:

  1. Poczekaj 30-60 sekund.
  2. Zmień sesję proxy (nowy IP residensialny).
  3. Wyczyść ciasteczka i rozpocznij nową sesję curl_cffi.
  4. Odśwież CSRF token, ponownie odwiedzając stronę recenzji.
  5. Spróbuj ponownie z opóźnieniem wykładniczym (max 3 próby).

Przykład Node.js z proxy SOCKS5

Dla środowisk Node.js możesz użyć ProxyHat przez SOCKS5:

const { SOCKSProxyAgent } = require('socks-proxy-agent');

const agent = new SOCKSProxyAgent(
  'socks5://user-country-US-session-node1:hasło@gate.proxyhat.com:1080'
);

const response = await fetch('https://www.glassdoor.com/Reviews/Acme-Reviews-E12345.htm', {
  agent,
  headers: {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Accept': 'text/html,application/xhtml+xml',
  }
});

console.log('Status:', response.status);

Uwaga: Node.js fetch nie emuluje TLS Chrome natywnie. Do produkcji rozważ undici z konfiguracją TLS lub bibliotekę got z odpowiednimi opcjami TLS.

ProxyHat: konfiguracja i najlepsze praktyki

ProxyHat oferuje proxy residensialne, mobilne i datacenter. Do scrapowania Glassdoor zalecamy wyłącznie proxy residensialne z geo-targetingiem US, ponieważ Glassdoor jest platformą amerykańską i ruch z IP spoza USA może być dodatkowo oflagowany.

Konfiguracja proxy ProxyHat jest prosta — wszystkie parametry (kraj, miasto, sesja) przekazujesz w nazwie użytkownika:

# Proxy HTTP (domyślny port 8080)
http://user-country-US:hasło@gate.proxyhat.com:8080

# Proxy z geo-targetingiem miasta
http://user-country-US-city-newyork:hasło@gate.proxyhat.com:8080

# Proxy z sesją sticky
http://user-country-US-session-moja-sesja-1:hasło@gate.proxyhat.com:8080

# Proxy SOCKS5 (port 1080)
socks5://user-country-US-session-socks1:hasło@gate.proxyhat.com:1080

Szczegóły konfiguracji znajdziesz w dokumentacji ProxyHat. Cennik proxy residensialnych sprawdź na stronie ProxyHat Pricing. Pełną listę dostępnych lokalizacji znajdziesz na ProxyHat Locations.

Więcej o zastosowaniach proxy w scrapowaniu przeczytasz w naszych artykułach: Web Scraping i SERP Tracking.

Etyczne scrapowanie i kiedy użyć oficjalnego API

Scrapowanie Glassdoor niesie poważne implikacje prawne i etyczne. Oto kluczowe zasady:

1. Agreguj, nie identyfikuj

Recenzje na Glassdoor mogą zawierać dane osobowe — imiona, stanowiska, lokalizacje. Zgodnie z RODO (GDPR), obywatelom UE przysługuje prawo do prywatności danych. Scrapuj wyłącznie zagregowane, nieosobiste dane: oceny ogólne, rozkłady ocen, trendy w czasie. Nie gromadź ani nie przechowuj danych identyfikujących poszczególne osoby.

2. Nie scrapeuj za loginem

Pełne dane o wynagrodzeniach wymagają konta Glassdoor. Scrapowanie treści za ścianą logowania narusza Warunki korzystania z Glassdoor i może stanowić naruszenie CFAA w USA. Jeśli potrzebujesz danych o wynagrodzeniach, rozważ oficjalne API lub licencję na dane.

3. Szanuj robots.txt i limity

Sprawdź https://www.glassdoor.com/robots.txt przed rozpoczęciem. Stosuj opóźnienia 2-5 sekund między zapytaniami. Nie wysyłaj więcej niż ~100 zapytań na godzinę z jednej sesji. Jeśli otrzymasz status 429 (Too Many Requests), zatrzymaj się na co najmniej 60 sekund.

4. Kiedy oficjalna licencja na dane jest właściwa

Dla zastosowań komercyjnych na dużą skalę — np. platformy HR-analytics, narzędzia do analizy rynku pracy — oficjalna licencja na dane Glassdoor jest bezpieczniejsza i bardziej niezawodna niż scrapowanie. Licencje zapewniają:

  • Dostęp do pełnych, znormalizowanych zbiorów danych
  • Brak ryzyka prawnego
  • SLA dotyczące dostępności i jakości danych
  • Dane o wynagrodzeniach, które nie są dostępne publicznie

Jeśli Twój przypadek użycia wymaga danych na poziomie przedsiębiorstwa, skontaktuj się z Glassdoor w sprawie programu Glassdoor for Employers lub partnerskiego API.

Najczęstsze błędy i przypadki brzegowe

  • Używanie datacenter proxy — AWS/Azure IPs są natychmiast blokowane przez DataDome. Zawsze używaj proxy residensialnych.
  • Zbyt szybkie zapytania — bez opóźnień otrzymasz 429 w ciągu kilkunastu zapytań. Pacing 2-5 sekund to minimum.
  • Brak odświeżania CSRF tokena — token gd-csrf-token wygasa. Odświeżaj go co ~50 zapytań lub po każdej zmianie sesji.
  • Mieszanie sesji proxy — jeśli używasz sesji sticky, nie zmieniaj IP w trakcie paginacji, bo stracisz ciasteczka DataDome.
  • Ignorowanie struktury GraphQL — endpointy BFF mogą się zmieniać. Zawsze sprawdzaj aktualną strukturę zapytania w zakładce Network w DevTools Chrome.

Kluczowe wnioski

  • Scrapowanie Glassdoor w 2026 wymaga proxy residensialnych (ProxyHat gate.proxyhat.com:8080), emulacji TLS Chrome (curl_cffi) i endpointów GraphQL BFF.
  • Publicznie dostępne: skrócone recenzje, oceny, przeglądy firm. Za loginem: pełne dane o wynagrodzeniach — ich scrapowanie narusza ToS.
  • DataDome + Cloudflare Bot Management wymagają sesji sticky z rotacją IP przy blokadach.
  • Pacing 2-5 sekund, max ~100 zapytań/godzina na sesję, retry z wykładniczym opóźnieniem.
  • Etyka: agreguj dane, nie identyfikuj osób, przestrzegaj GDPR/RODO i CFAA. Rozważ oficjalną licencję dla zastosowań komercyjnych.

Z proxy residensialnymi ProxyHat możesz zbudować niezawodny Glassdoor reviews scraper, który omija DataDome bez naruszania prawnych granic dostępu do danych publicznych. Zacznij od cennika ProxyHat i przetestuj z darmowej sesji już dziś.

Gotowy, aby zacząć?

Dostęp do ponad 50 mln rezydencjalnych IP w ponad 148 krajach z filtrowaniem AI.

Zobacz cenyProxy rezydencjalne
← Powrót do Bloga