Guía para el scraping de datos de LinkedIn con Python

Comentarios: 0

El scraping de datos de LinkedIn puede ser increíblemente valioso por varias razones:

  • Análisis del mercado de trabajo: analizar las tendencias en los anuncios de empleo, como las habilidades y los sectores más demandados;
  • Reclutamiento: recopilar datos sobre las ofertas de empleo para informar las estrategias de contratación;
  • Investigación de la competencia: supervisar los patrones de contratación y las estrategias de los competidores.

El artículo hará hincapié en técnicas y estrategias importantes, incluida la importancia de evitar la detección a través de proxies y cabeceras en primer lugar. Se utilizará la librería requests para realizar peticiones HTTP mientras que lxml se empleará para parsear contenido HTML.

Cómo configurar el entorno

Antes de empezar, asegúrate de que tienes Python instalado en tu máquina.

Instala las librerías necesarias usando pip:


pip install requests
pip install lxml

Cómo empezar con el rascador

Aquí tienes un completo ejemplo de código para scrapear listados de empleo de LinkedIn usando Python:

Importar librerías

Necesitaremos varias librerías de Python:

  • requests: Para hacer peticiones HTTP para recuperar páginas web.
  • lxml: Para analizar contenido HTML.
  • csv: Para escribir los datos extraídos en un archivo CSV.

import requests
from lxml import html
import csv
import random

Define la URL de búsqueda de empleo

Empieza por definir la URL de búsqueda de empleo de LinkedIn que quieres scrapear.


url = 'https link'

Cadenas de agente de usuario y proxies

Para scrapear LinkedIn de forma efectiva, es crucial utilizar las cabeceras correctas, especialmente la cabecera User-Agent, para imitar las peticiones de un navegador real.


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

Los proveedores de proxy modernos suelen soportar la rotación interna, lo que significa que rotan automáticamente las direcciones IP por ti. Esto elimina la necesidad de seleccionar manualmente proxies de una lista. Sin embargo, para fines ilustrativos, aquí está cómo1 usted manejaría la rotación de proxy si fuera necesario:


proxies = {
    'http': random.choice(proxies),
    'https': random.choice(proxies)
}

Cabeceras para las solicitudes

El éxito del scraping en LinkedIn depende de la correcta configuración de las cabeceras que emulan el comportamiento de un navegador real. Los encabezados correctamente configurados no sólo ayudan a eludir los sistemas de protección anti-bot, sino que también disminuyen las posibilidades de que tus actividades de scraping sean bloqueadas.


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

Inicializar el almacenamiento de datos

Para recopilar y almacenar eficazmente la información de las ofertas de empleo, debes empezar por inicializar un almacén de datos. En Python, esto suele implicar la creación de una lista vacía. Esta lista servirá como un contenedor de almacenamiento donde puedes añadir detalles del trabajo a medida que se extraen del contenido HTML. Este método garantiza que la información se recopile sistemáticamente y sea fácilmente accesible para su posterior procesamiento o análisis.

job_details = []

Parificación del contenido HTML

Después de enviar una petición HTTP GET, el siguiente paso es analizar el contenido HTML utilizando la librería lxml. Esto nos permitirá navegar por la estructura HTML e identificar los datos que queremos extraer.


# Establecer User-Agent aleatorio y proxy con método de autorización IP
headers['user-agent'] = random.choice(user_agents)
proxies = {
    'http': IP:PORT,
    'https': IP:PORT
}

# Enviar una solicitud HTTP GET a la URL
response = requests.get(url=url, headers=headers, proxies=proxies)
parser = html.fromstring(response.content)

Extracción de datos de trabajo

Una vez analizado el contenido HTML, podemos extraer detalles específicos del trabajo como el título, el nombre de la empresa, la ubicación y la URL del trabajo mediante consultas XPath. Estos detalles se almacenan en un diccionario y se anexan a una lista.


# Extraer los detalles del trabajo del contenido HTML
for job in parser.xpath('//ul[@class="jobs-search__results-list"]/li'):
    title = ''.join(job.xpath('.//div/a/span/text()')).strip()
    company = ''.join(job.xpath('.//div/div[2]/h4/a/text()')).strip()
    location = ''.join(job.xpath('.//div/div[2]/div/span/text()')).strip()
    job_url = job.xpath('.//div/a/@href')[0]
    
    job_detail = {
        'title': title,
        'company': company,
        'location': location,
        'job_url': job_url
    }
    job_details.append(job_detail)

Guardar datos en CSV

Después de recopilar los datos del trabajo, guárdelos en un archivo CSV.


with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['title', 'company', 'location', 'job_url']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for job_detail in job_details:
        writer.writerow(job_detail)

Código completo

Aquí tienes el código completo, combinando todos los apartados anteriores:


from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.by import By
import csv

# Especifique la dirección del servidor proxy con el nombre de usuario y la contraseña
proxy_address = ""
proxy_username = ""
proxy_password = ""

# Configurar las opciones de Chrome con el proxy y la autenticación
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# Crear una instancia WebDriver con selenium-wire
driver = wiredriver.Chrome(options=chrome_options)

url = 'https link'

# Realice su automatización Selenium con las capacidades mejoradas de selenium-wire
driver.get(url)

job_details = []

all_elements = driver.find_elements(By.XPATH,
                                   '//*[@id="main-content"]/section/ul/li')

for i in all_elements:
   title = i.find_element(By.XPATH,
                          './/div/div/h3').text
   company = i.find_element(By.XPATH, './/div/div[2]/h4/a').text
   location = i.find_element(By.XPATH, './/div/div[2]/div/span').text
   job_url = i.find_element(By.XPATH,
                            './/div/a').get_attribute('href')

   job_detail = {
       'title': title,
       'company': company,
       'location': location,
       'job_url': job_url
   }
   job_details.append(job_detail)

with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
   fieldnames = ['title', 'company', 'location', 'job_url']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for job_detail in job_details:
       writer.writerow(job_detail)

driver.quit()

Extraer datos de LinkedIn utilizando Python con las librerías requests y lxml ofrece una potente forma de analizar el mercado laboral y reclutar personal. Para garantizar un proceso de raspado sin problemas, se utilizan proxies de centros de datos con altas velocidades, así como proxies de ISP con un factor de confianza más alto, lo que reduce el riesgo de bloqueos en las acciones automatizadas.

Comentarios:

0 Comentarios