Cómo hacer un raspado de datos en LinkedIn: guía de 2024

Desde encontrar nuevos talentos y analizar las trayectorias profesionales hasta identificar las empresas en las que invertir, elaborar un estudio competitivo sobre nuevos mercados y llevar a cabo una gestión de las relaciones con los clientes (CRM) da lugar a un enriquecimiento. Los puntos de datos de LinkedIn son fundamentales para que las empresas tengan un enfoque más concreto y muy útiles para hacer negocios.
19 min read
How to scrape LinkedIn
  1. Raspado de datos de LinkedIn en Python
  2. Qué hay que tener en cuenta para el raspado de datos en LinkedIn

La forma más simple de raspado web implica automatizar el proceso de recopilación de la información que está disponible en la web y que, después, se puede almacenar, analizar o utilizar para los procesos de toma de decisiones.

Puede que te estés preguntando, ¿por qué LinkedIn? LinkedIn, como plataforma de redes profesionales, es un tesoro lleno de datos. En LinkedIn hay una gran cantidad de información sobre profesionales, empresas y oportunidades laborales. Por ejemplo, los encargados de las contrataciones pueden usar esta plataforma para encontrar posibles candidatos, los equipos de ventas pueden identificar posibles clientes y los investigadores pueden utilizarla para analizar el mercado laboral. Las posibilidades son infinitas.

En este tutorial, aprenderás a extraer datos de LinkedIn utilizando Beautiful Soup. Cuando aprendas el proceso paso a paso, también conocerás la solución de Bright Data que hace que el raspado de datos en LinkedIn sea mucho más rápido.

Raspado de datos de LinkedIn en Python

En este tutorial, vas a utilizar Python para crear un «raspador web» con herramientas gratuitas como Beautiful Soup y Requests. ¡Vamos a empezar!

Aviso: este tutorial tiene fines educativos y de demostración de las capacidades técnicas. Ten en cuenta que, según las condiciones de uso de LinkedIn, está terminantemente prohibido extraer datos de LinkedIn. Cualquier uso inapropiado de esta información para extraer datos de LinkedIn puede dar lugar a la suspensión permanente de tu cuenta de LinkedIn o tener otras repercusiones legales. El uso queda bajo tu propio riesgo y discreción.

Antes de empezar, comprueba que tienes la versión 3.7.9 o superior de Python instalada en tu equipo.

Después de instalar Python, el siguiente paso es configurar las bibliotecas necesarias para hacer el raspado web. Aquí utilizarás Requests para hacer peticiones HTTP, Beautiful Soup (BS4) para analizar contenido en HTML y Playwright para la interacción con el navegador y la automatización de las tareas. Abre tu intérprete de comandos («shell») o terminal y ejecuta los siguientes comandos:

   pip3 install beautifulsoup4
   pip3 install requests
   pip3 install playwright

Estructura y objetos de datos de LinkedIn

Antes de empezar con el raspado de datos en LinkedIn, en la siguiente sección vamos a hablar de la estructura del sitio web y vamos a identificar los objetos de datos que vas a extraer. Teniendo en cuenta el objetivo de este tutorial, te centrarás en buscar ofertas de empleo, perfiles de usuario, artículos y datos de empresas:

  • Las ofertas de empleo incluyen información como el puesto, la empresa, la ubicación y la descripción del trabajo.
  • La información del curso puede aportar información sobre el título, el instructor, la duración y la descripción del curso.
  • Los datos de empresas pueden incluir el nombre de la empresa, el sector, el tamaño, la ubicación y la descripción.
  • Los artículos están escritos por profesionales y tratan temas como el desarrollo profesional y los conocimientos del sector.

Por ejemplo, si quieres entender mejor la estructura HTML de la página de Empleos de LinkedIn, sigue estos pasos:

  1. Ve al sitio web de LinkedIn e inicia sesión en tu cuenta.
  2. Haz clic en el icono Empleos de la barra de navegación superior. Escribe cualquier puesto de trabajo (por ejemplo, «desarrollador front-end») y pulsa Intro.
  3. Haz clic con el botón derecho en algún trabajo de la lista y pulsa Inspeccionar para abrir las herramientas de desarrollo del navegador.
  4. Analiza la estructura HTML para identificar las etiquetas y los atributos que contienen los datos que quieres extraer.
raspado de datos en LinkedIn

Raspado de datos del listado de empleos

Empieza extrayendo datos de las ofertas de empleo de LinkedIn. Tendrás que utilizar Requests para obtener el contenido HTML de la página web y Beautiful Soup para analizar y extraer la información relevante.

Crea un archivo nuevo, nómbralo scraper_linkedIn_jobs.py e incluye el siguiente código:

import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/jobs/search?keywords=Frontend%20Developer&location=United%20States&pageNum=0'
response = requests.get(url)
if response.status_code == 200:
   soup = BeautifulSoup(response.text, 'html.parser')
   job_listings = soup.find_all('div', {'class':'job-search-card'})
   for job in job_listings:
       title = job.find('h3', {'class': 'base-search-card__title'}).text.strip()
       company = job.find('a', {'class': 'hidden-nested-link'}).text.strip()
       location = job.find('span', {'class': 'job-search-card__location'}).text.strip()
       anchor_tag = job.find('a', class_='base-card__full-link')
       href_link = anchor_tag['href']
       print(f"Title: {title}\nCompany: {company}\nLocation: {location}\nJob Link: {href_link}\n")
else:
   print("Failed to fetch job listings.")

Con este código, obtendrás ofertas de empleo de una página de búsqueda de LinkedIn para puestos de desarrollador «front-end» en Estados Unidos.

Aviso: en la URL fijada, puedes personalizar la búsqueda de empleo según tus preferencias utilizando los parámetros de la URL. Por ejemplo, puedes cambiar location=United%20States al país que prefieras para encontrar ofertas de empleo en esa ubicación específica. También puedes modificar keywords=frontend%20Developer por cualquier otro puesto de trabajo que te interese y así podrás buscar trabajos según las distintas palabras clave. Además, puedes ajustar «pageNum=0» para moverte por varias páginas de resultados de búsqueda y encontrar más oportunidades laborales. Estos parámetros te ofrecen la posibilidad de modificar la búsqueda de empleo según tus criterios y tus preferencias.

Ejecuta el código desde tu intérprete de comandos («shell») o terminal usando el siguiente comando:

python3 scraper_linkedIn_jobs.py

Deberías obtener una lista de empleos con el título, la empresa, la ubicación y un enlace a la oferta de empleo. Los resultados deberían aparecer así:

…output omitted…
Title: Frontend Engineer
Company: Klarity
Location: San Francisco, CA
Job Link: https://www.linkedin.com/jobs/view/desenvolvedor-front-end-at-pasquali-solution-3671519424?refId=JN%2FeM862Wu7qnbJd96Eoww%3D%3D&trackingId=kTSLczKp1q4aurZ5rSzRPQ%3D%3D&position=1&pageNum=0&trk=public_jobs_jserp-result_search-card

Title: Front-End Developer (Remote)
Company: Prevail Legal
Location: United States
Job Link: https://www.linkedin.com/jobs/view/desenvolvedor-front-end-at-pasquali-solution-3671519424?refId=JN%2FeM862Wu7qnbJd96Eoww%3D%3D&trackingId=kTSLczKp1q4aurZ5rSzRPQ%3D%3D&position=1&pageNum=0&trk=public_jobs_jserp-result_search-card
…output omitted…

Raspado de datos de LinkedIn Learning

Además, hacer un raspado de datos de las ofertas de empleo, también puedes extraer datos de los cursos de la página de LinkedIn Learning. 

Crea un archivo nuevo, nómbralo scraper_linkedIn_courses.py e incluye el siguiente código:

import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/learning/search?trk=content-hub-home-page_guest_nav_menu_learning'
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    course_listings = soup.find_all('li', {'class':'results-list__item'})
    for course in course_listings:
        title = course.find('h3', {'class': 'base-search-card__title'}).text.strip()
        created_by = course.find('h4', {'class': 'base-search-card__subtitle'}).text.strip()
        duration = course.find('div', {'class': 'search-entity-media__duration'}).text.strip()
        # Find the anchor tag containing the link
        anchor_tag = course.find('a', class_='base-card__full-link')
        # Extract the 'href' attribute value
        if anchor_tag:
            href_link = anchor_tag['href']
        else:
            print("Anchor tag not found.")
        print(f"Title: {title}\nCreated By: {created_by}\nDuration: {duration}\nCourse Link: {href_link}\n")
else:
    print("Failed to fetch course listings.")

En este caso, estás usando Requests para acceder a la página de LinkedIn Learning y Beautiful Soup para analizarla. Estás buscando elementos li del tipo results-list__item, que contiene el listado de cursos. Para cada curso, puedes extraer y obtener el título, el creador, la duración y el enlace. Si la petición inicial falla, se emite un mensaje de error.

Ejecuta el código desde tu intérprete de comandos («shell») o terminal usando el siguiente comando:

python3 scraper_linkedIn_courses.py

Deberías obtener una lista de los cursos con el título, el autor y un enlace al curso. Los resultados se mostrarán así:

…output omitted…
Title: Define general intelligence
Created By: From: Introduction to Artificial Intelligence
Duration: 3m
Course Link: https://www.linkedin.com/learning/introduction-to-artificial-intelligence/define-general-intelligence?trk=learning-serp_learning-search-card_search-card

Title: Shortcut menus and the Mini toolbar
Created By: From: Excel Essential Training (Microsoft 365)
Duration: 4m
Course Link: https://www.linkedin.com/learning/excel-essential-training-microsoft-365-17231101/shortcut-menus-and-the-mini-toolbar?trk=learning-serp_learning-search-card_search-card

Title: Learning Excel: Data Analysis
Created By: By: Curt Frye
Duration: 3h 16m
Course Link: https://www.linkedin.com/learning/learning-excel-data-analysis-18868618?trk=learning-serp_learning-search-card_search-card

…output omitted…

Raspado de datos de artículos de LinkedIn

También puedes extraer datos de artículos de la página Artículos de LinkedIn.

Para ello, crea un archivo nuevo, nómbralo scraper_linkedIn_articles.py e incluye el siguiente código:

import requests
from bs4 import BeautifulSoup
url = 'https://www.linkedin.com/pulse/topics/home/?trk=guest_homepage-basic_guest_nav_menu_articles'
response = requests.get(url)
if response.status_code == 200:
    soup = BeautifulSoup(response.text, 'html.parser')
    article_listings = soup.find_all('div', {'class':'content-hub-entities'})
    for article in article_listings:
        title = article.find('h2', {'class': 'break-words'}).text.strip()
        description = article.find('p', {'class': 'content-description'}).text.strip()
        # Find the anchor tag containing the link
        anchor_tag = article.find('a', class_='min-w-0')
        # Extract the 'href' attribute value
        if anchor_tag:
            href_link = anchor_tag['href']
        else:
            print("Anchor tag not found.")
        print(f"Title: {title}\nDescription: {description}\nArticle Link: {href_link}\n")
else:
    print("Failed to fetch article listings.")

Con este código, estás usando Requests para buscar una página de LinkedIn y Beautiful Soup para analizarla. Estás buscando elementos div del tipo content-hub-entities, que contienen las listas de artículos. Para cada artículo, puedes extraer y obtener el título, la descripción y el enlace. Si la petición inicial falla, se emite un mensaje de error.

Ejecuta el código desde tu intérprete de comandos («shell») o terminal usando el siguiente comando:

python3 scraper_linkedIn_articles.py

Obtendrás un listado de artículos con el título, la descripción y un enlace al artículo. Los resultados deberían aparecer así:

…output omitted…
Title: What are some of the emerging leadership trends and theories that you should be aware of?
Description: Learn about the six emerging leadership styles and frameworks that can help you develop your leadership skills and potential in a changing and complex world.
Article Link: https://www.linkedin.com/advice/1/what-some-emerging-leadership-trends-theories

Title: What are the most effective strategies for handling a leadership transition?
Description: Learn six strategies to manage a leadership transition smoothly and successfully, from assessing the situation to planning for the future.
Article Link: https://www.linkedin.com/advice/0/what-most-effective-strategies-handling

Title: How do you combine quality assurance training with other learning initiatives?
Description: Learn some strategies and tips for integrating quality assurance training with other learning objectives and methods in your organization.
Article Link: https://www.linkedin.com/advice/0/how-do-you-combine-quality-assurance-training

…output omitted…

Todo el código de este tutorial está disponible en este archivo de GitHub.

Qué hay que tener en cuenta para el raspado de datos en LinkedIn

LinkedIn, como muchos otros sitios web, utiliza varias técnicas para evitar que se extraigan sus datos de forma automática. Saber cómo funcionan estas técnicas puede ayudarte a navegar por estos sitios y a garantizar que puedas extraer los datos que necesites de forma adecuada:

  • Número de páginas: LinkedIn muestra los resultados de la búsqueda por páginas. Comprueba que tu secuencia de comandos para el raspado de datos controla la paginación para obtener todos los datos relevantes.
  • Anuncios: LinkedIn enseña anuncios en varias secciones. Comprueba que tu secuencia de comandos para el raspado de datos se centra en datos reales para evitar que extraiga el contenido de los anuncios.
  • Límite de frecuencia: LinkedIn controla el número de solicitudes que proceden de una dirección IP durante un período de tiempo determinado. Si el número de peticiones supera un límite concreto, LinkedIn puede bloquear la dirección IP de forma temporal o permanente.
  • CAPTCHA: LinkedIn puede poner un CAPTCHA complejo si detecta actividad inapropiada en una dirección IP. Los CAPTCHA están diseñados para que un humano pueda resolverlos sin problemas, pero que, a su vez, sean difíciles para un «bot» para así evitar un raspado de datos automático.
  • Requisito para iniciar sesión: solo se puede acceder a algunos datos de LinkedIn cuando se inicia sesión (es decir, perfiles de usuario y páginas de empresa). Esto significa que, para cualquier intento de extraer estos datos, haría falta iniciar sesión de forma automática y LinkedIn puede detectar esta actividad y bloquearla.
  • Contenido dinámico: LinkedIn utiliza JavaScript para cargar algunos contenidos dinámicos. Esto puede dificultar el raspado de datos porque existe la posibilidad de que los datos no estén en el HTML cuando la página se carga al principio.
  • robots.txt: el archivo robots.txt de LinkedIn indica a qué partes del sitio pueden acceder los rastreadores web. Aunque no es una técnica de prevención como tal, si ignoras las directrices de este archivo, puede que te bloqueen la IP.

Recuerda que, aunque técnicamente es posible eludir estos métodos, si lo haces, estarías infringiendo las condiciones del servicio de LinkedIn y podrían bloquear tu cuenta. Asegúrate siempre de que tus actividades de raspado de datos sean legales y éticas.

Una opción mejor: usar Bright Data para extraer datos de LinkedIn

Aunque el raspado web manual funciona para extraer datos a pequeña escala, cuando se hace para un tamaño mayor resulta una labor lenta y poco productiva. Bright Data ofrece una alternativa más simple y eficiente que te permite acceder sin problemas a una gran cantidad de datos de LinkedIn.

Bright Data ofrece dos productos principales para el raspado web:

  • Navegador de raspado: el navegador de raspado es una solución para navegadores que te permite interactuar con sitios web como si fueras un usuario normal. Gestiona la representación de JavaScript, las peticiones AJAX y otras dificultades, por lo que es ideal para extraer datos de sitios web dinámicos como LinkedIn.
  • Conjuntos de datos de LinkedIn: el conjunto de datos de LinkedIn es un grupo de datos recopilados previamente y estructurados que contiene datos de LinkedIn, incluidas las ofertas de trabajo, los perfiles de usuario y la información de la empresa. Puedes acceder a los datos y descargarlos directamente desde la plataforma Bright Data.

Configura tu cuenta de Bright Data

Para acceder al conjunto de datos de LinkedIn en la plataforma Bright Data, sigue estos pasos:

Crea una cuenta en el sitio web de Bright Data haciendo clic en Iniciar prueba gratuita y siguiendo las indicaciones.

Después de iniciar sesión, haz clic en el icono de la tarjeta de crédito que aparece en el panel de navegación de la izquierda para ir a la página Facturación.  A continuación, añade un método de pago para activar tu cuenta:

método de pago

Después, haz clic en el icono del pin para abrir la página Infraestructura de proxies y raspado.  Selecciona Navegador de raspado > Empezar:

Infraestructura de proxies y raspado

Ponle un nombre a tu solución y haz clic en el botón Añadir: 

Botón Añadir 

Selecciona Parámetros de acceso y apunta tu nombre de usuario, el «host» y la contraseña porque los vas a necesitar para el siguiente paso:

Parámetros de acceso 

Cuando termines todos estos pasos, puedes pasar a la siguiente sección.

Raspado de datos de la empresa LinkedIn utilizando el navegador de raspado

Para extraer los datos de la página de una empresa en LinkedIn, crea un archivo nuevo, nómbralo scraper_linkedIn_bdata_company.py e incluye el siguiente código:

import asyncio
from playwright.async_api import async_playwright
from bs4 import BeautifulSoup

username='YOUR_BRIGHTDATA_USERNAME'
password='YOUR_BRIGHTDATA_PASSWORD'
auth=f'{username}:{password}'
host = 'YOUR_BRIGHTDATA_HOST'
browser_url = f'wss://{auth}@{host}'

async def main():
   async with async_playwright() as pw:
       print('connecting')
       browser = await pw.chromium.connect_over_cdp(browser_url)
       print('connected')
       page = await browser.new_page()
       print('goto')
       await page.goto('https://www.linkedin.com/company/spacex/', timeout=120000)
       print('done, evaluating')
      
       # Get the entire HTML content
       html_content = await page.evaluate('()=>document.documentElement.outerHTML')
      
       # Parse the HTML with Beautiful Soup
       soup = BeautifulSoup(html_content, 'html.parser')

       # Extract the 'About us' description
       description_element = soup.select_one('.core-section-container[data-test-id="about-us"] p[data-test-id="about-us__description"]')
       description = description_element.text if description_element else None
       print('Description:')
       print(description)

       # Extract the 'Company size'
       company_size_element = soup.select_one('div[data-test-id="about-us__size"] dd')
       company_size = company_size_element.text.strip() if company_size_element else None
       print('Company size:')
       print(company_size)

       await browser.close()

# Run the async function
asyncio.run(main())

Con este código, estás utilizando Playwright para la automatización del navegador. Conéctate al navegador Chromium a través de un proxy, ve a la página de la empresa de SpaceX y extrae la descripción de Quiénes somos y el tamaño de la empresa.

Para obtener el contenido HTML, utiliza el método de evaluación de Playwright y, después, analízalo con Beautiful Soup para encontrar los elementos específicos y copiar la información extraída. Aprovecha las funciones asincrónicas de Playwright definiendo una función asíncrona llamada main ()e inicia la ejecución de la secuencia de comandos con asyncio.run (main ()).

Aviso: asegúrate de sustituir YOUR_BRIGHTDATA_USERNAMEYOUR_BRIGHTDATA_PASSWORDYOUR_BRIGHTDATA_HOST por las credenciales de inicio de sesión correctas y específicas de tu cuenta de Bright Data. Este paso es fundamental para autenticar tu cuenta y acceder a ella correctamente.

Abre tu intérprete de comandos («shell») o terminal y ejecuta tu código con el siguiente comando:

python3 scraper_linkedIn_bdata_company.py

Deberías obtener un resultado similar a lo que se muestra a continuación:

…output omitted…
Description:
SpaceX designs, manufactures and launches the world's most advanced rockets and spacecraft. The company was founded in 2002 by Elon Musk to revolutionize space transportation, with the ultimate goal of making life multiplanetary. 

SpaceX has gained worldwide attention for a series of historic milestones. It is the only private company ever to return a spacecraft from low-Earth orbit, which it first accomplished in December 2010. The company made history again in May 2012 when its Dragon spacecraft attached to the International Space Station, exchanged cargo payloads, and returned safely to Earth — a technically challenging feat previously accomplished only by governments. Since then Dragon has delivered cargo to and from the space station multiple times, providing regular cargo resupply missions for NASA.

For more information, visit www.spacex.com.
Company size:
1,001-5,000 employees

Puedes encontrar dificultades con el enfoque inicial que has utilizado para el raspado de datos de LinkedIn, como ventanas emergentes y reCAPTCHA, así que existe la posibilidad de que se bloqueen los códigos. Sin embargo, si utilizas el navegador de raspado de Bright Data, podrás olvidarte de estos problemas y extraer datos sin interrupciones.

Conjunto de datos de LinkedIn de Bright Data

Una alternativa a la extracción manual de datos de LinkedIn consiste en comprar conjuntos de datos de LinkedIn que te permitirán acceder a datos personales útiles, incluyendo perfiles de usuario e información adicional. Al usar los conjuntos de datos de LinkedIn de Bright Data, te olvidas de tener que hacer un raspado web a mano, ahorras tiempo y consigues datos estructurados y listos para analizar.

Para saber qué conjuntos de datos están disponibles, ve a tu panel de control de Bright Data, haz clic en Conjuntos de datos y raspado web IDE en la barra de navegación de la izquierda y selecciona Conjuntos de datos de perfiles de personas de LinkedIn (datos web públicos):

Conjuntos de datos de perfiles de personas de LinkedIn (datos web públicos):

Ahora puedes aplicar filtros para afinar tu selección más todavía y obtener datos concretos que cumplan con tus propios criterios. Después, haz clic en «Opciones de compra» para ver cuánto te costará.

El precio se basa en la cantidad de registros que elijas y esto te permite personalizar la compra según tus necesidades y tu presupuesto. Si te decides por comprar estos conjuntos de datos, puedes simplificar considerablemente tu flujo de trabajo y evitar tener que recopilar datos y extraerlos de forma manual:

extracción y recopilación de datos

Conclusión

En este artículo, has aprendido a extraer datos de forma manual de LinkedIn con Python y has conocido Bright Data, una solución que simplifica y acelera el proceso de extracción de datos. Independientemente de si estás recopilando datos para un estudio de mercado, para encontrar nuevos talentos o para analizar a la competencia, estas herramientas y técnicas pueden ayudarte a obtener los datos que necesitas.

Recuerda que, aunque el raspado manual puede ser una herramienta potente, Bright Data ofrece una alternativa más simple y eficiente. Con su navegador de raspado y su conjunto de datos de LinkedIn codificados previamente, Bright Data te ayuda a ahorrar tiempo y esfuerzo, lo cual te permite centrarte en lo verdaderamente importante: utilizar los datos para tomar decisiones fundamentadas. Habla con los expertos en datos de Bright Data para encontrar la solución que mejor se adapte a ti.