Volver al blog
Guías
Suciu DanLast updated on May 13, 202615 min read

Cómo hacer scraping en LinkedIn en 2026: una guía en Python

Cómo hacer scraping en LinkedIn en 2026: una guía en Python
En resumen: Extraer datos de LinkedIn implica sortear un muro de autenticación agresivo, el seguimiento del comportamiento y la identificación de huellas TLS. Esta guía te ofrece un árbol de decisión con métodos por tipo de página, patrones de Python que funcionan para ofertas de empleo, perfiles y empresas (API oculta, JSON-LD y Selenium cuando sea necesario), y una lista de comprobación consolidada contra el bloqueo para 2026.

Si alguna vez has intentado averiguar cómo hacer scraping en LinkedIn, probablemente te has topado con el mismo muro que el resto de nosotros: un agresivo mensaje de inicio de sesión que aparece tras solo unas pocas visitas a la página, seguido de silenciosas respuestas 999 y, finalmente, nada útil en absoluto. Extraer datos de LinkedIn consiste en extraer datos públicos (perfiles, empresas, ofertas de empleo y resultados de búsqueda) directamente mediante clientes HTTP, navegadores sin interfaz gráfica o API ocultas, sin iniciar sesión en una cuenta personal. Técnicamente es más difícil que extraer datos de un sitio de comercio electrónico típico, pero está lejos de ser imposible.

Esta guía es un tutorial centrado en el código para desarrolladores, ingenieros de datos y equipos de operaciones de crecimiento que necesitan datos públicos de LinkedIn sin quemar cuentas ni rotar proxies a ciegas. Comenzaremos con lo que se puede extraer de forma realista, analizaremos cómo detecta LinkedIn los rastreadores y repasaremos tres métodos en Python (una API oculta de ofertas de empleo, el análisis de JSON-LD y un navegador sin interfaz gráfica como alternativa) con un árbol de decisión para que elijas la ruta más económica y fiable para cada tipo de página. La capa anti-bloqueo y el contexto legal se tratan al final, ya que se aplican independientemente del método que elijas.

Qué datos de LinkedIn puedes extraer de forma realista

Antes de abordar cómo extraer datos de LinkedIn, conviene ser sinceros sobre lo que se puede acceder desde fuera del muro de autenticación. Hay cuatro tipos de páginas que se pueden utilizar sin iniciar sesión: páginas de perfil público, páginas de empresa públicas, ofertas de empleo individuales y la /jobs/search página de resultados. Todo lo demás (Sales Navigator, el índice de búsqueda de personas, los gráficos de mensajes, la lista completa de empleados en la página de una empresa) se encuentra tras la autenticación y una línea de Términos de servicio que esta guía no traspasará.

Dentro de esa superficie pública sigue habiendo un valor real. Se obtienen los campos principales que la mayoría de los equipos necesitan para la información de reclutamiento, la prospección de ventas y la investigación del mercado laboral, siempre y cuando se acepte que la profundidad es limitada y que puede ser necesario combinar fuentes para cubrir las lagunas.

Campos públicos de LinkedIn por tipo de página

La tabla siguiente relaciona cada tipo de página pública con sus campos extraíbles y su caso de uso. Muchas solicitudes del tipo «queremos extraer datos de LinkedIn» se desvanecen en cuanto una parte interesada ve lo que hay disponible sin necesidad de iniciar sesión.

Tipo de página

Campos públicos (típicos)

Útil para

Perfil (/in/...)

Nombre, cargo, titular, ubicación, resumen, URL del perfil, empresa

Prospección de ventas, listas de candidatos de los reclutadores

Empresa (/company/...)

Nombre, sector, sede central, seguidores, sitio web, número de puestos vacantes

Investigación de cuentas, creación de perfiles de cliente ideal

Ofertas de empleo (/jobs/view/...)

Título, empresa, ubicación, fecha de publicación, descripción, nivel de experiencia

Análisis del mercado laboral, agregación de ofertas

Búsqueda de ofertas de empleo (/jobs/search?...)

Lista de ofertas más metadatos de paginación

Recopilación masiva de ofertas a gran escala

Si un campo no aparece en esa tabla, asuma que el muro de autenticación lo impide. Un resumen independiente de los datos de empleo es una lectura complementaria recomendable.

Cómo detecta y bloquea LinkedIn a los rastreadores

Cualquiera que aprenda a extraer datos de LinkedIn descubre rápidamente que las defensas están apiladas, no se eligen de un menú. Hay tres capas que funcionan en paralelo, y todas alimentan una señal interna: una puntuación de fraude por visitante que decide si tu solicitud se aprueba, se bloquea de forma suave tras un mensaje de inicio de sesión o se descarta por completo.

La primera capa es la barrera de autenticación. Los visitantes anónimos suelen verse obligados a iniciar sesión tras solo tres o cinco visitas a perfiles, lo que significa que cualquier scraper que solicite docenas de perfiles desde la misma identidad queda descartado en la primera ronda. La segunda capa es el seguimiento del comportamiento. LinkedIn supervisa la sincronización de las solicitudes, el flujo de navegación, la actividad del ratón y los patrones de referencia. Un ser humano no carga 100 perfiles por minuto; un rastreador sin restricciones sí lo hará, y esa sola señal es suficiente para marcar la sesión. La tercera capa es la huella digital de la solicitud. LinkedIn inspecciona la calidad de la IP (residencial frente a centro de datos), el hash JA3 de tu protocolo de enlace TLS, los encabezados y las cookies, y los atributos del dispositivo. Enviar un python-requests/2.x agente de usuario predeterminado desde una IP de AWS obtiene una puntuación baja en las tres capas a la vez.

Considera estas capas como complementarias, no alternativas. Limpiar una de ellas mientras se ignoran las demás rara vez modifica tu puntuación de fraude lo suficiente como para que sea relevante. Vale la pena marcar como favorito un manual básico sobre cómo evitar los bloqueos de rastreadores antes de ampliar tu operación.

Elegir cómo extraer datos de LinkedIn: un árbol de decisión de métodos

A la hora de decidir cómo extraer datos de LinkedIn, opta por la herramienta más ligera que te proporcione los datos que necesitas. LinkedIn está construido como una aplicación de página única, por lo que sus datos fluyen a través de tres mecanismos, y cada uno de ellos se corresponde con su propio método de extracción ideal.

  1. HTML renderizado por el servidor. Algunas páginas devuelven datos suficientes en la respuesta HTML inicial como para analizarlos con Requests y BeautifulSoup. Aunque hoy en día es poco habitual en LinkedIn, sigue siendo aplicable a algunas subpáginas de empresas y páginas de entidades.
  2. JSON hidratado en <script> etiquetas. Los perfiles públicos y las páginas de empresa incrustan un <script type="application/ld+json"> bloque que refleja los campos que renderiza la página visible. Analizar esto es más rápido, más barato y mucho menos frágil que perseguir selectores CSS a través del DOM.
  3. XHR / API ocultas. Las experiencias de desplazamiento infinito (feed de ofertas de empleo, lista de ofertas de empresas, búsqueda) llaman a puntos finales internos con parámetros de consulta predecibles. Reproducir esas llamadas omite por completo la renderización.

La regla general: prueba primero JSON-LD para las páginas de perfil y de empresa, reproduce la API oculta para las ofertas de empleo y la búsqueda, y recurre a un navegador sin interfaz solo cuando ambos fallen. La mayoría de los equipos que intentan extraer datos de LinkedIn a gran escala gastan de más en Selenium para tareas que un script de Requests de treinta líneas puede completar.

Método 1: Cómo extraer datos de LinkedIn Jobs a través de la API oculta Jobs-Guest

El punto final de búsqueda de empleos es la superficie de LinkedIn más fácil de extraer: está expuesta intencionadamente a visitantes no autenticados y paginada por un único start . En el momento de escribir este artículo, la ruta es /jobs-guest/jobs/api/seeMoreJobPostings/search, y la respuesta devuelve fichas de empleo en HTML en lugar de JSON. LinkedIn rota los puntos finales internos, así que vuelve a confirmar la ruta en DevTools antes de una ejecución en producción.

Un patrón mínimo en Python, analizado con BeautifulSoup, tiene este aspecto:

import requests
from bs4 import BeautifulSoup

BASE = "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search"
HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Accept-Language": "en-US,en;q=0.9",
}

def fetch_page(keywords, location, start=0):
    params = {"keywords": keywords, "location": location, "start": start}
    r = requests.get(BASE, params=params, headers=HEADERS, timeout=20)
    r.raise_for_status()
    return r.text

def parse_cards(html):
    soup = BeautifulSoup(html, "html.parser")
    for card in soup.select("li"):
        title = card.select_one(".base-search-card__title")
        company = card.select_one(".base-search-card__subtitle")
        loc = card.select_one(".job-search-card__location")
        link = card.select_one("a.base-card__full-link")
        if title and link:
            yield {
                "title": title.get_text(strip=True),
                "company": company.get_text(strip=True) if company else None,
                "location": loc.get_text(strip=True) if loc else None,
                "url": link["href"].split("?")[0],
            }

jobs, start = [], 0
while True:
    html = fetch_page("python developer", "Berlin", start)
    batch = list(parse_cards(html))
    if not batch:
        break
    jobs.extend(batch)
    start += 25

El tamaño de la página es de veinticinco tarjetas. La condición de parada es un conjunto de resultados vacío, no un recuento fijo de páginas, ya que LinkedIn recorta los resultados por ubicación geográfica y actualidad. Canaliza jobs en el módulo csv o un marco de Pandas y tendrás un feed de ofertas de empleo de LinkedIn sin necesidad de abrir un navegador. Un tutorial de BeautifulSoup explica los patrones de selección por si necesitas un repaso.

Método 2: Cómo extraer perfiles y empresas de LinkedIn mediante JSON-LD

La estrategia para obtener más información de las páginas de perfiles y empresas consiste en omitir por completo los selectores CSS y analizar el <script type="application/ld+json"> bloque que LinkedIn inserta durante la renderización del lado del servidor. JSON-LD es estructurado, estable y cambia con mucha menos frecuencia que el DOM visible. Para encontrarlo en cualquier URL pública de LinkedIn, abre DevTools y busca //script[@type='application/ld+json'] en el panel Elementos.

import json
import requests
from bs4 import BeautifulSoup

HEADERS = {
    "User-Agent": "Mozilla/5.0",
    "Accept-Language": "en-US,en;q=0.9",
}

def scrape_ld(url):
    r = requests.get(url, headers=HEADERS, timeout=20)
    r.raise_for_status()
    soup = BeautifulSoup(r.text, "html.parser")
    blob = soup.find("script", {"type": "application/ld+json"})
    if not blob:
        return None
    return json.loads(blob.string)

# Public profile
profile = scrape_ld("https://www.linkedin.com/in/some-public-handle/")
# Public company
company = scrape_ld("https://www.linkedin.com/company/openai/")

En un perfil público, encontrarás campos como name, jobTitle, worksFor, address, y a veces alumniOf. En el caso de una empresa, se espera name, description, url, numberOfEmployeesy un address bloque. Todo lo que LinkedIn oculta tras un inicio de sesión (lista completa de empleados, contactos mutuos, información de contacto) no estará presente en el JSON-LD; eso no es un error de análisis, es la barrera de autenticación.

Recurre al análisis de HTML solo para los campos que JSON-LD no expone, como el carrusel de «páginas similares» en las páginas de empresa, y trata esos selectores como la parte más frágil de tu proceso. Ahí es también donde se invierte la mayor parte del tiempo de mantenimiento, ya que LinkedIn suele reestructurar su marcado frontend cada dos o cuatro semanas.

Método 3: Navegadores sin interfaz gráfica para búsquedas y secciones de carga diferida

Recurre a Selenium o Playwright solo cuando los dos primeros métodos no sean suficientes. Los casos más comunes son los resultados de búsqueda de personas, la pestaña «Empleos en esta empresa» de carga diferida y cualquier página en la que aparezcan datos críticos tras un evento de desplazamiento. Si no has creado uno de estos antes, una introducción a los navegadores sin interfaz gráfica es un requisito previo útil, y el tutorial de Selenium con Python te guía a través de la configuración del controlador si lo necesitas.

El flujo de trabajo mínimo es el siguiente: inicia un controlador Chromium, navega con un agente de usuario realista, espera a que la red se estabilice, desplázate hasta que el bloque relevante se haya cargado y, a continuación, obtén el DOM con un localizador de Selenium o pasa driver.page_source a BeautifulSoup. No inicies sesión en una cuenta real de LinkedIn dentro de Selenium. Esa combinación incumple los Términos de servicio de LinkedIn y es la forma más rápida de que te bloqueen la cuenta de forma permanente.

Los navegadores sin interfaz gráfica no son una solución antibots por sí mismos. Vanilla Puppeteer y Playwright son fáciles de identificar a nivel de JA3 y navigator objeto, por lo que seguirás necesitando los controles de proxy y de ritmo de la siguiente sección. Si una tarea se puede realizar sin navegador, hazla sin navegador.

Lista de verificación anti-bloqueo: proxies, encabezados, JA3 y ritmo

Cuando los equipos que buscan cómo extraer datos de LinkedIn pasan de un script puntual a un rastreo recurrente, el motivo del fallo es casi siempre el sistema anti-bot, no el análisis sintáctico. Sigue esta lista en orden.

  1. Utiliza proxies residenciales, no de centros de datos. LinkedIn mantiene una lista exhaustiva de ASN de centros de datos. Los grupos residenciales rotan direcciones IP reales de proveedores de Internet de consumidores y son mucho más difíciles de detectar. Una guía sobre el uso de proxies con Python Requests es el mejor punto de partida si no has configurado la rotación anteriormente.
  2. Presta atención a tu huella digital JA3. Plain requests tiene una huella digital TLS que no coincide con la de ningún navegador real. Las herramientas que envuelven curl_cffi o reproducen el hash JA3 de un navegador real pasarán esta comprobación; raw requests no lo hará.
  3. Envía un conjunto completo de encabezados. Como mínimo: un User-Agent, Accept, Accept-Language, Accept-Encodingy una plausible Referer. La ausencia Accept-Language es en sí mismo un claro indicio de que se trata de un rastreador.
  4. Tómate tu tiempo. Limita la concurrencia, varía los retrasos entre uno y cinco segundos, y nunca realices ráfagas.
  5. Cambia la identidad, no solo la IP. Combina cada cambio de IP con un agente de usuario y un conjunto de cookies nuevos para que LinkedIn no pueda unir las sesiones.

Si sigues bloqueado tras seguir esta lista, el problema es el volumen, no la configuración. Reduce la velocidad.

El caso más destacado en EE. UU. es hiQ Labs contra LinkedIn, en el que los tribunales dictaminaron, en términos generales, que el scraping de datos de LinkedIn de acceso público no constituye una violación de la Ley de Fraude y Abuso Informático. El litigio se prolongó aproximadamente desde 2017 hasta 2022 y concluyó tras la publicación de los dictámenes del Noveno Circuito; para conocer el estado actual y el alcance exacto de la sentencia, la página de la EFF sobre el caso hiQ contra LinkedIn es una referencia clara y fácil de consultar. Hay dos cosas que esta sentencia no hace: no anula los Términos de servicio de LinkedIn, que siguen prohibiendo el acceso automatizado mientras se está conectado, y no se aplica fuera de la jurisdicción de EE. UU. Si estás realizando scraping a escala comercial, considera esto como información de referencia y consulta a un abogado antes de lanzar tu proyecto. También merece la pena leer una guía general sobre si el web scraping es legal.

Puntos clave

  • Adapta el método al tipo de página, no a tus hábitos. JSON-LD es la mejor opción para páginas de perfil y de empresa, la API de empleos ocultos es la mejor para listados de empleo y búsquedas, y un navegador sin interfaz gráfica es la alternativa, no la opción predeterminada.
  • Tres capas de defensa, una puntuación de fraude. El muro de autenticación, el seguimiento del comportamiento y la huella digital de TLS/encabezados alimentan la misma puntuación interna; limpiar solo uno de ellos rara vez cambia el resultado.
  • Los proxies residenciales más los clientes HTTP compatibles con JA3 son la base. Las IP de centros de datos por sí solas no te permitirán crear un proceso que funcione en LinkedIn.
  • Nunca inicies sesión desde la automatización. Viola los Términos de servicio y provoca el bloqueo permanente de las cuentas, independientemente de lo cuidadosos que sean tus selectores.
  • Prepárate para los fallos. LinkedIn suele reestructurar su interfaz cada dos semanas; diseña selectores y analizadores JSON que puedas intercambiar en un solo archivo.

Preguntas frecuentes

¿Puedo extraer datos de LinkedIn sin iniciar sesión en una cuenta?

Sí, pero solo la superficie pública. Las páginas de perfil público, las páginas de empresa, las ofertas de empleo individuales y el /jobs/search punto final son accesibles sin autenticación. Sales Navigator, el índice de búsqueda de personas, los datos de conexiones mutuas y la lista completa de empleados en la página de una empresa no lo son. Los rastreadores anónimos también reciben un aviso de inicio de sesión tras unas tres a cinco visitas a perfiles, así que planifica la rotación de IP e identidades desde el primer día.

¿Debería usar la API oficial de LinkedIn en lugar de hacer scraping?

Probablemente no para la recopilación de datos general. La API oficial de LinkedIn tiene un alcance muy limitado: está diseñada para integraciones de socios, como solicitar empleos, compartir publicaciones o la automatización de marketing, y no devuelve el tipo de datos de perfiles públicos o de empresas que necesitan la mayoría de los proyectos de scraping. La mayoría de los equipos que evalúan la API oficial acaban haciendo scraping del sitio público para cubrir lo que la API no ofrece.

¿Qué tipo de proxies funcionan mejor para el scraping de LinkedIn, los residenciales o los de centros de datos?

Los residenciales, con rotación. LinkedIn mantiene listas de bloqueo muy estrictas de ASN de centros de datos (AWS, GCP, OVH y similares), por lo que las IP de centros de datos se ven limitadas o reciben una respuesta 999 muy rápidamente. Los pools residenciales se enrutan a través de IP reales de proveedores de Internet de consumidores y parecen tráfico de usuario normal. Para extracciones puntuales de bajo volumen, los proxies móviles también funcionan, pero son excesivos y más caros para la mayoría de los trabajos.

¿Cómo puedo saber si mi rastreador de LinkedIn está a punto de ser bloqueado?

Esté atento a tres señales tempranas. En primer lugar, un aumento en los tiempos de respuesta (LinkedIn suele retrasarse antes de bloquear). En segundo lugar, un aumento en las páginas que devuelven una pantalla de inicio de sesión en lugar de contenido. En tercer lugar, respuestas HTTP 999, que son el código específico de LinkedIn que indica «has sido marcado». Si cualquiera de estas tres señales aumenta durante una hora, pause el rastreo y rote las identidades antes de que la situación se agrave.

¿Con qué frecuencia cambia LinkedIn la estructura de sus páginas y deja inoperativos los rastreadores?

Con frecuencia. Los selectores HTML y CSS del frontend suelen cambiar cada dos o cuatro semanas, los puntos finales de la API interna Voyager rotan aproximadamente cada cuatro u ocho semanas, y las estructuras JSON-LD tienden a permanecer estables durante varios meses. Ancla tus rastreadores en JSON-LD o en API ocultas siempre que sea posible, aísla los selectores CSS inestables en un único módulo y reserva un pequeño margen para tareas de mantenimiento cada mes.

Conclusión

Descubrir cómo extraer datos de LinkedIn a gran escala tiene menos que ver con trucos ingeniosos y más con la disciplina. Elige el método más ligero para cada tipo de página, respeta el muro de autenticación y trata la capa antibots como una prioridad de primer orden en lugar de como una idea de último momento. JSON-LD se encargará de la mayor parte de tu trabajo con perfiles y empresas. El punto final jobs-guest se encargará de la mayor parte de tu trabajo con el mercado laboral. Reserva Selenium para las superficies verdaderamente dinámicas, nunca lo ejecutes estando conectado y dedica tu tiempo de ingeniería a los proxies, el control de ritmo y la higiene de JA3 en lugar de a un script de Selenium más sofisticado.

El mantenimiento es la otra mitad del trabajo. LinkedIn rediseña su interfaz cada pocas semanas, así que diseña analizadores que fallen de forma evidente, registra los cambios estructurales y aísla los selectores para que una corrección sea un cambio en un solo archivo en lugar de una reescritura.

Si prefieres saltarte por completo la capa de proxy, huellas digitales y CAPTCHA y centrarte en los datos en sí, la API Scraper de WebScrapingAPI se encarga del lado de las solicitudes (rotación de IP, JA3, encabezados, reintentos) detrás de un único punto final y devuelve HTML sin procesar que puedes analizar con el mismo código de Requests más BeautifulSoup que ya has escrito anteriormente. La lógica de scraping sigue siendo tuya; el desbloqueo es cosa nuestra.

Acerca del autor
Suciu Dan, Cofundador @ WebScrapingAPI
Suciu DanCofundador

Suciu Dan es cofundador de WebScrapingAPI y escribe guías prácticas dirigidas a desarrolladores sobre el scraping web con Python, el scraping web con Ruby y las infraestructuras de proxy.

Empieza a crear

¿Estás listo para ampliar tu recopilación de datos?

Únete a más de 2000 empresas que utilizan WebScrapingAPI para extraer datos de la web a escala empresarial sin ningún gasto de infraestructura.