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 danych | Dostępność | Uwagi |
|---|---|---|
| Przegląd firmy (overview) | Publiczny | Nazwa, branża, wielkość, lokalizacja HQ |
| Skrócone recenzje (truncated) | Publiczny | ratingOverall, pros, cons, jobTitle — widoczne na stronie listy |
| Pełne recenzje | Publiczny (z ograniczeniami) | Dostępne, ale DataDome ogranicza liczbę zapytań |
| Szczegółowe wynagrodzenia | Za loginem | Nie scrapeuj — wymaga konta, narusza ToS |
| Zagregowane zakresy płac | Częściowo publiczne | Tylko 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:
- Poczekaj 30-60 sekund.
- Zmień sesję proxy (nowy IP residensialny).
- Wyczyść ciasteczka i rozpocznij nową sesję
curl_cffi. - Odśwież CSRF token, ponownie odwiedzając stronę recenzji.
- 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-tokenwygasa. 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ś.






