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.
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
Recorreremos cada paso, desde cargar la página con Playwright hasta extraer los detalles del empleo y guardar los datos en un archivo CSV.
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()
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)
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)
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:
Al hacer scraping de Glassdoor o de cualquier otro sitio web, es esencial seguir prácticas de scraping responsables:
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.
Мы получили вашу заявку!
Ответ будет отправлен на почту в ближайшее время.
С уважением proxy-seller.com!
Comentarios: 0