Cómo extraer datos de Glassdoor con Python

Comentarios: 0

Glassdoor es una de las mejores plataformas que proporciona una amplia gama de información tanto para las personas que buscan empleo como para las que desean contratarlo, incluyendo información salarial, reseñas de empleadores y solicitudes de empleo. En esta guía, recorreremos el proceso de scraping de listados de empleo de Glassdoor usando Python y Playwright. Playwright es esencial aquí porque Glassdoor emplea fuertes medidas anti-bot, que pueden marcar y bloquear las bibliotecas tradicionales de scraping. Con Playwright, podemos simular un navegador real e incluir proxies, ayudándonos a eludir estos sistemas de detección.

Debido a los robustos mecanismos anti-scraping de Glassdoor, las peticiones directas con librerías como requests pueden dar lugar a bloqueos de IP o desafíos CAPTCHA. Playwright nos permite automatizar un navegador, haciendo nuestras interacciones más parecidas a las humanas. Añadiendo proxies y cabeceras de navegador, podemos evitar aún más la detección.

Requisitos

Para empezar, necesitarás instalar Playwright y la librería lxml para el análisis sintáctico de HTML. Puedes instalarlos de la siguiente manera:


pip install playwright lxml
playwright install

Raspando las ofertas de empleo de Glassdoor

Recorreremos cada paso, desde cargar la página con Playwright hasta extraer los detalles del empleo y guardar los datos en un archivo CSV.

Paso 1. Configurar el navegador y hacer peticiones

En primer lugar, configura Playwright con un proxy para conectarse a Glassdoor. Esto ayuda a evitar ser bloqueado y permite al navegador cargar la página como si un usuario real estuviera visitando el sitio.


from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https link', timeout=60000)
        content = await page.content()
        await browser.close()
        return content

# Llamar a la función para recuperar el contenido de la página
html_content = await scrape_job_listings()

Paso 2. Analizar el HTML y extraer los datos

Después de cargar la página, utilice lxml para analizar el contenido HTML y extraer la información relevante del empleo. He aquí cómo analizar el título del trabajo, la ubicación, el salario y otros detalles para cada listado de trabajo:


parser = fromstring(html_content)
job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')

jobs_data = []
for element in job_posting_elements:
    job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
    job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
    salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
    job_link = element.xpath('.//a[@data-test="job-title"]/@href')[0]
    easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
    company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
    
    job_data = {
        'company': company,
        'job_title': job_title,
        'job_location': job_location,
        'job_link': job_link,
        'salary': salary,
        'easy_apply': easy_apply
    }
    jobs_data.append(job_data)

Paso 3. Guardar los datos en un archivo CSV

Una vez que hemos extraído los detalles del trabajo, podemos guardarlos en un archivo CSV para facilitar el análisis de los datos.


import csv

with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
    writer.writeheader()
    writer.writerows(jobs_data)

Código completo


import csv
from playwright.async_api import async_playwright
from lxml.html import fromstring

async def scrape_job_listings():
    # Configurar el navegador Playwright con proxy para evitar la detección
    async with async_playwright() as p:
        browser = await p.chromium.launch(
            headless=False,
            proxy={"server": '', 'username': '', 'password': ''}
        )
        page = await browser.new_page()
        await page.goto('https://www.glassdoor.com/Job/united-states-software-engineer-jobs-SRCH_IL.0,13_IN1_KO14,31.htm', timeout=60000)
        
        # Recuperar el contenido de la página y cerrar el navegador
        content = await page.content()
        await browser.close()
        
        # Analiza el contenido con lxml
        parser = fromstring(content)
        job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')
        
        # Extraer datos de cada oferta de empleo
        jobs_data = []
        for element in job_posting_elements:
            job_title = element.xpath('.//a[@data-test="job-title"]/text()')[0]
            job_location = element.xpath('.//div[@data-test="emp-location"]/text()')[0]
            salary = ' '.join(element.xpath('.//div[@data-test="detailSalary"]/text()')).strip()
            job_link = "https://www.glassdoor.com" + element.xpath('.//a[@data-test="job-title"]/@href')[0]
            easy_apply = bool(element.xpath('.//div[@data-role-variant="featured"]'))
            company = element.xpath('.//span[@class="EmployerProfile_compactEmployerName__LE242"]/text()')[0]
            
            job_data = {
                'company': company,
                'job_title': job_title,
                'job_location': job_location,
                'job_link': job_link,
                'salary': salary,
                'easy_apply': easy_apply
            }
            jobs_data.append(job_data)
    
        # Guardar los datos en un archivo CSV
        with open('glassdoor_job_listings.csv', 'w', newline='', encoding='utf-8') as file:
            writer = csv.DictWriter(file, fieldnames=['company', 'job_title', 'job_location', 'job_link', 'salary', 'easy_apply'])
            writer.writeheader()
            writer.writerows(jobs_data)

# Ejecutar la función de raspado
import asyncio
asyncio.run(scrape_job_listings())

Explicación del código completo:

  1. Configuración del navegador con proxy: El código inicia una sesión de navegador con Playwright, incorporando un proxy para imitar el comportamiento de navegación humano. El ajuste headless=False permite que la ventana del navegador permanezca abierta, lo que puede ayudar aún más a eludir la detección de bots.
  2. Navegación a la página de ofertas de empleo: El script visita la URL de ofertas de empleo de Glassdoor para ofertas de ingeniería de software en Estados Unidos.
  3. Parificación del contenido: Los datos del empleo se extraen utilizando lxml para el análisis sintáctico de HTML. Capturamos el título del trabajo, la ubicación, el salario, el enlace del trabajo, el nombre de la empresa y si es un trabajo de fácil aplicación.
  4. Guardar en CSV: después de extraer todos los datos, el script los guarda en un archivo CSV, glassdoor_job_listings.csv, con columnas para cada atributo.

Respetando los términos de servicio de Glassdoor

Al hacer scraping de Glassdoor o de cualquier otro sitio web, es esencial seguir prácticas de scraping responsables:

  • Respeta los límites de tasa: Evita saturar el servidor implementando retardos entre peticiones.
  • Utilice proxies rotatorios: Minimiza el riesgo de ser baneado rotando proxies e IPs.
  • Cumplir con los términos de servicio: Revise regularmente los términos de servicio del sitio web y evite acciones que los infrinjan.

Cuando sepas cómo scrapear los datos de Glassdoor usando Python y Playwright, mejorarás fácilmente tu capacidad para recopilar listados de empleo. Esta técnica, cuando se combina con el uso de proxies y cabeceras adecuadas, es eficaz para eliminar el riesgo de ser bloqueado por Glassdoor. También debes tener en cuenta las políticas éticas de scraping para evitar colapsar los servidores de Glassdoor. Manteniendo estas medidas, ahora puedes cosechar así como procesar información útil de empleo de Glassdoor para tu propio uso o el de tu empresa.

Comentarios:

0 Comentarios