Como extrair dados do Glassdoor usando Python

Comentários: 0

O Glassdoor é uma das melhores plataformas que fornece uma ampla gama de informações para pessoas que procuram emprego e querem contratá-las, incluindo informações salariais, avaliações de empregadores e pedidos de emprego. Neste guia, vamos percorrer o processo de raspagem de listagens de empregos do Glassdoor usando Python e Playwright. O Playwright é essencial aqui porque o Glassdoor emprega fortes medidas anti-bot, que podem sinalizar e bloquear bibliotecas de scraping tradicionais. Com o Playwright, podemos simular um navegador real e incluir proxies, ajudando-nos a contornar esses sistemas de deteção.

Devido aos robustos mecanismos anti-raspagem do Glassdoor, solicitações diretas com bibliotecas como requests podem levar a bloqueios de IP ou desafios de CAPTCHA. O Playwright permite-nos automatizar um browser, tornando as nossas interações mais humanas. Ao adicionar proxies e cabeçalhos de navegador, podemos evitar ainda mais a deteção.

Requisitos

Para começar, é necessário instalar o Playwright e a biblioteca lxml para análise de HTML. Você pode instalá-las da seguinte forma:


pip install playwright lxml
playwright install

Recolha de anúncios de emprego no Glassdoor

Vamos percorrer cada etapa, desde o carregamento da página com o Playwright até a extração dos detalhes da vaga e a gravação dos dados em um arquivo CSV.

Passo 1. Configurando o navegador e fazendo solicitações

Primeiro, configure o Playwright com um proxy para se conectar ao Glassdoor. Isso ajuda a evitar o bloqueio e permite que o navegador carregue a página como se um usuário real estivesse visitando o site.


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

# Chamar a função para obter o conteúdo da página
html_content = await scrape_job_listings()

Passo 2. Analisando o HTML e extraindo dados

Depois de carregar a página, use lxml para analisar o conteúdo HTML e extrair informações relevantes da vaga. Veja como analisar o cargo, o local, o salário e outros detalhes de cada anúncio de emprego:


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)

Passo 3. Salvando dados em um arquivo CSV

Depois de extrairmos os detalhes da tarefa, podemos salvá-los em um arquivo CSV para facilitar a análise de dados.


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 o browser Playwright com proxy para evitar a deteção
    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 o conteúdo da página e fechar o browser
        content = await page.content()
        await browser.close()
        
        # Analisar o conteúdo com lxml
        parser = fromstring(content)
        job_posting_elements = parser.xpath('//li[@data-test="jobListing"]')
        
        # Extrair dados para cada anúncio de emprego
        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 os dados num ficheiro 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)

# Executar a função de raspagem
import asyncio
asyncio.run(scrape_job_listings())

Explicação do código completo:

  1. Configuração do navegador com proxy: O código inicia uma sessão do navegador com o Playwright, incorporando um proxy para imitar o comportamento de navegação humana. A configuração headless=False permite que a janela do navegador permaneça aberta, o que pode ajudar ainda mais a contornar a deteção de bots.
  2. Navegando para a página de listagens de empregos: O script visita o URL de listagens de empregos do Glassdoor para empregos de engenharia de software nos Estados Unidos.
  3. Parar o conteúdo: Os dados do trabalho são extraídos usando lxml para análise de HTML. Capturamos o título do trabalho, a localização, o salário, o link do trabalho, o nome da empresa e se é um trabalho de fácil aplicação.
  4. Salvando em CSV: Depois de extrair todos os dados, o script os salva em um arquivo CSV, glassdoor_job_listings.csv, com colunas para cada atributo.

Respeitando os termos de serviço do Glassdoor

Ao fazer scraping do Glassdoor ou de qualquer outro site, é essencial seguir práticas de scraping responsáveis:

  • Respeitar os limites de taxa: Evite sobrecarregar o servidor implementando atrasos entre as solicitações.
  • Use Proxies Rotativos: Minimize o risco de ser banido, fazendo a rotação de proxies e IPs.
  • Cumprir os Termos de Serviço: Reveja regularmente os termos de serviço do site e evite ações que os violem.

Quando você souber como raspar os dados do Glassdoor usando Python e Playwright, você aumentará facilmente sua capacidade de coletar listas de empregos. Essa técnica, quando combinada com o uso de proxies e cabeçalhos apropriados, é eficaz para eliminar o risco de ser bloqueado pelo Glassdoor. Também é necessário ter em atenção as políticas éticas de scraping para evitar o bloqueio dos servidores do Glassdoor. Ao manter essas medidas, agora você pode colher e processar informações úteis sobre emprego da Glassdoor para seu próprio uso ou o de sua empresa.

Comentários:

0 Comentários