Cómo extraer salarios y reseñas de Glassdoor para la comparación de compensaciones
Glassdoor oculta sus datos detrás de una superposición de inicio de sesión, pero el contenido ya está en el JSON de la página, ubicado debajo del modal. Aquí se explica cómo encontrar un ID de empleador, leer ese JSON y comparar compensaciones sin activar el bloqueo.
Glassdoor es el conjunto de datos de referencia para la investigación de compensaciones y reputación de empleadores: salarios, calificaciones y reseñas de millones de empresas. También lanza una superposición de inicio de sesión en tu cara y limita la tasa agresivamente. El truco que la mayoría de la gente pasa por alto: esa superposición es cosmética. Los datos de la empresa ya están cargados en el JSON de la página, ubicados debajo del modal. Esta guía muestra cómo extraer salarios y reseñas de Glassdoor para la comparación de compensaciones: resuelve un ID de empleador, lee el JSON y ajusta las solicitudes para no toparte con el muro 403.
Paso 1: resuelve la empresa a un ID de empleador
Cada página de Glassdoor se basa en un ID de empleador numérico, no en un nombre. Hay un endpoint interno de autocompletado que asigna un nombre de empresa a su ID, el mismo que alimenta el cuadro de búsqueda. Accede a él y obtendrás el nombre canónico más el ID que necesitas para construir cualquier otra 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"))
Con el ID puedes construir la URL de resumen (/Overview/Working-at-NAME-EI_IE{id}.htm) y la URL de reseñas (/Reviews/NAME-Reviews-E{id}.htm). Aún no se necesita navegador.

Paso 2: lee el JSON, no el HTML
Glassdoor es una aplicación Next.js, por lo que cada página envía sus datos como un blob JSON, en la etiqueta de script __NEXT_DATA__ y una caché de Apollo GraphQL. Analiza eso en lugar de extraer el DOM renderizado: lleva calificaciones, cifras de salario, texto de reseñas, además de datos firmográficos como ingresos, sede, tamaño de la empresa, año de fundación e industria. Es mucho más estable que los selectores CSS, que Glassdoor rota detrás de atributos data-test.
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)
El modal de inicio de sesión que ves en un navegador es una superposición fija (su id de contenedor es HardsellOverlay) dibujada sobre la página. Debido a que el contenido subyacente ya está en el DOM y el JSON, una solicitud HTTP que lee el marcado bruto nunca ve el modal. Si renderizas con un navegador, puedes eliminar la superposición con una inyección CSS de una línea (display:none) en lugar de intentar iniciar sesión.
Paginación de reseñas y lectura de distribuciones salariales
Las reseñas y salarios están paginados, y el cursor de paginación vive en el mismo JSON que ya analizaste, no en un frágil botón "siguiente" que tienes que hacer clic. Lee los datos de la página actual, encuentra el cursor o número de página en la carga útil y solicita directamente la URL de la página siguiente. Por eso analizar el JSON supera a manejar un navegador: recorres las páginas con solicitudes HTTP simples, una por página, al ritmo que elijas. Extrae el cuerpo de la reseña, calificación de estrellas, título del trabajo, ubicación y fecha para cada entrada, y tendrás un corpus de reseñas estructurado sobre el que puedes realizar análisis de sentimientos, el mismo material cubierto en nuestra guía de extracción de reseñas.
Los salarios son el objetivo de mayor valor, y el consejo honesto es tratarlos como distribuciones, no valores puntuales. Una sola cifra extraída es ruidosa; la señal útil es el rango y la mediana de muchas presentaciones para un rol en una ubicación determinada. El JSON expone los números que necesitas: salario base, el conteo de muestras detrás de cada estimación, moneda y ubicación, así que agréguelos tú mismo en lugar de confiar en un solo número. Pondera por tamaño de muestra, descarta roles con muy pocos datos para ser significativos, y siempre empareja un salario con su ubicación y la fecha en que fue recopilado, idealmente a través de una salida residencial en ese mercado, porque las comparaciones de compensación se vuelven obsoletas y varían enormemente según el mercado. Esa disciplina es lo que convierte las filas extraídas en un punto de referencia que un equipo de contratación o finanzas puede realmente defender. También te protege de la trampa clásica de citar una cifra llamativa que resulta descansar en dos presentaciones de hace tres años.
Paso 3: establece la región para que los datos coincidan con tu mercado
Glassdoor localiza salarios y contenido por región a través de una cookie tldp: 1 es EE.UU., 2 el Reino Unido, 3 Canadá, 4 India, 5 Australia, 6 Francia, 7 Alemania. Establécelo para comparar compensaciones en el mercado que realmente te importa: una cifra salarial de EE.UU. no tiene sentido para un rol en el Reino Unido. Combina la cookie con una salida de proxy en el país correspondiente para que la solicitud sea coherente de principio a fin. Nuestra guía de recolección de datos B2B cubre cómo mantener las señales geográficas consistentes a lo largo de un pipeline.
Obtén proxies residenciales geo-dirigidos
Manejo del límite de tasa 403
Glassdoor responde a la extracción agresiva con HTTP 403, no un CAPTCHA. Trata un 403 como una señal de ritmo, no un callejón sin salida: retrocede exponencialmente, rota a una IP nueva y reduce tu ritmo general. Una sola IP de centro de datos que recorre la paginación de reseñas se ve limitada dentro de una o dos páginas; distribuir solicitudes a través de un pool residencial y hacer pausas entre ellas te mantiene bajo el radar.
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
Una breve palabra sobre ética y ley: compara en conjunto. Los salarios y calificaciones son útiles como distribuciones; las reseñas individuales adjuntas a personas identificables son datos personales, así que no reconstruyas perfiles de revisores y respeta los Términos de Glassdoor y las directivas de robots. Esta es una guía, no un consejo legal: verifica tu jurisdicción. Nuestro resumen de la legalidad de la extracción web en 2026 profundiza más.

Preguntas frecuentes
¿Cómo extraigo reseñas de Glassdoor con Python?
Resuelve la empresa a su ID de empleador a través del endpoint interno de autocompletado, construye la URL de reseñas con ese ID, luego analiza el JSON __NEXT_DATA__ en la página en lugar del HTML. Dirige las solicitudes a través de proxies residenciales y retrocede ante cualquier 403. El texto de la reseña, las calificaciones y los cursores de paginación están todos en esa carga útil de JSON.
¿Puedo pasar la barrera de inicio de sesión de Glassdoor?
Normalmente no es necesario. El aviso de inicio de sesión es una superposición cosmética dibujada sobre contenido que ya está cargado en la página y su JSON. Una solicitud HTTP simple que lee el marcado bruto nunca renderiza el modal. Si usas un navegador real, oculta la superposición con una inyección CSS display:none en lugar de iniciar sesión.
¿Por qué Glassdoor devuelve errores 403?
Un 403 es Glassdoor limitando tu tasa, típicamente porque demasiadas solicitudes provienen de una IP demasiado rápido. Reduce la velocidad, añade retroceso exponencial y rota a través de un pool de proxies residenciales para que las solicitudes se distribuyan entre muchas IPs. Es un problema de ritmo, no un bloqueo permanente: un tiempo constante y humano lo soluciona.
¿Es legal extraer datos de Glassdoor?
Recopilar datos públicos y agregados de empresas para comparación generalmente tiene menor riesgo, pero los Términos de Glassdoor restringen el acceso automatizado y las reseñas individuales pueden ser datos personales. Manténlo agregado, no reconstruyas personas identificables y respeta los robots y Términos. Esta es una guía general, no un consejo legal: evalúa tu propio caso de uso.
Todo el trabajo son tres movimientos: resuelve el ID de empleador, lee el JSON que la página ya contiene y ajusta las solicitudes a través de IPs limpias para que los 403 sean raros. Haz eso y Glassdoor se convierte en un flujo de comparación de compensaciones en vivo en lugar de una barrera de inicio de sesión con la que sigues chocando.