Ir para o conteúdo

Como raspar o Glassdoor

O Glassdoor é um ótimo recurso para quem procura emprego, funcionários e empregadores. Ele contém uma riqueza de informações sobre empresas e empregos, incluindo salários, avaliações, perguntas de entrevistas, fotos do escritório e muito mais. Todos esses dados tornam o Glassdoor um alvo atraente para web scraping.

Neste guia abrangente, examinaremos várias técnicas e estratégias para extrair diferentes tipos de dados do Glassdoor.

Visão geral da arquitetura do Glassdoor

Antes de nos aprofundarmos nos detalhes do scraping, vamos entender como o site do Glassdoor está estruturado:

  • Renderização do lado do cliente – Glassdoor usa React para renderizar a maior parte de sua UI no lado do cliente, em vez de no lado do servidor. Isso significa que o HTML inicial servido ao navegador é mínimo e a maior parte do conteúdo é carregada e renderizada com Javascript.

  • API GraphQL – Os dados exibidos nas páginas do Glassdoor são obtidos por meio de uma API GraphQL. O site faz solicitações AJAX a esta API para obter dados estruturados que são então renderizados na página.

  • Anti-raspagem Pesada – O Glassdoor emprega várias medidas anti-scraping, como detecção de bot, limitação de taxa e bloqueio de scrapers.

Resumindo, o Glassdoor é um aplicativo React de página única que usa GraphQL para recuperar dados e possui fortes defesas anti-raspagem. Essa arquitetura apresenta alguns desafios únicos para os scrapers que teremos que superar.

Raspando páginas de visão geral da empresa

Cada empresa no Glassdoor tem uma página de visão geral dedicada com informações básicas como sede, setor, receita, etc.

Para obter a página de visão geral de uma empresa, precisamos do ID do Glassdoor, que está incluído no URL da página:

https://www.glassdoor.com/Overview/Working-at-Google-EI_IE9079.16,22.htm 

Aqui EI_IE9079 significa o ID da empresa do Google. Podemos extrair esse ID de qualquer URL da empresa para construir o URL da página de visão geral.

A extração do HTML bruto desta página não nos fornecerá dados estruturados. A chave é extrair os dados GraphQL da página que contém todas as informações em um formato JSON estruturado.

Veja como extrair os dados GraphQL:

import json
import re 

html = # page HTML
match = re.search(r‘window.__ENV__ = (\{.*?\})‘, html)
if match:
    data = json.loads(match.group(1))  

Isso nos fornece os dados GraphQL completos da página. Agora podemos analisar campos como description, headquarters, revenue, Etc.:

overview = data[‘EmployerPage‘][‘Employer‘]

print(overview[‘description‘]) 
print(overview[‘headquarters‘])
print(overview[‘revenue‘])

E é isso! Com apenas algumas linhas de código Python podemos extrair dados estruturados para a visão geral do Glassdoor de qualquer empresa.

Raspar listas de empregos

O Glassdoor permite navegar por listas de empregos abertas publicadas por empresas. Essas listagens contêm título, localização, descrição e muito mais.

Para obter empregos de uma empresa, navegamos para:

https://www.glassdoor.com/Jobs/Google-Jobs-E9079.htm

As listas de empregos são carregadas dinamicamente por meio de chamadas AJAX ao rolar para baixo ou alterar as páginas. Os dados vêm do GraphQL novamente e precisamos analisá-los.

Primeiro, fazemos uma solicitação à página 1 para obter a contagem total de trabalhos que usamos para calcular o número de páginas. Em seguida, raspamos cada página extraindo dados do trabalho:

import math
import json 

def get_jobs(companyId):
    url = f‘https://www.glassdoor.com/Jobs/-Jobs-E{companyId}.htm‘

    # request page 1 to get total job count
    page = requests.get(url) 
    total = extract_job_count(page.text) 
    pages = math.ceil(total / 20)

    jobs = []

    # scrape data from each page
    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))  
        jobs.extend(data[‘jobs‘])

    return jobs

Isso nos permite eliminar sistematicamente todos os empregos de qualquer empresa. A chave é calcular páginas com base na contagem total de trabalhos e paginar por meio de chamadas AJAX.

Avaliações de empresas de raspagem

As avaliações são sem dúvida os dados mais valiosos no Glassdoor. Vamos discutir como obter todas as avaliações de uma empresa.

Semelhante aos empregos, navegamos para a página de avaliações da empresa:

https://www.glassdoor.com/Reviews/Google-Reviews-E9079.htm

Precisamos entender como as avaliações são paginadas. O Glassdoor mostra um número fixo de avaliações por página e precisamos raspar todas as páginas para obter os dados completos.

O número de páginas de revisão pode ser calculado antecipadamente extraindo um numberOfPages campo dos dados do GraphQL. Em seguida, paginamos cada página e coletamos comentários:

import math
import json

def get_reviews(companyId):
    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘ 

    # extract number of pages from initial request
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    pages = data[‘numberOfPages‘]

    reviews = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘) 
        data = json.loads(extract_graphql(page.text))

        # extract reviews
        reviews.extend(data[‘reviews‘]) 

    return reviews

Aqui estamos extraindo o número de páginas de revisão antecipadamente e, em seguida, percorrendo cada página para construir o conjunto completo de revisões.

Essa técnica pode eliminar todas as avaliações de qualquer empresa no Glassdoor!

Raspando Salários

Além das avaliações, os dados salariais também são muito úteis. O Glassdoor tem uma seção de salários dedicada para cada empresa. Vejamos a eliminação de registros salariais.

Começamos com o URL da página de salários:

https://www.glassdoor.com/Salary/Google-Salaries-E9079.htm 

Nossa abordagem geral envolverá novamente:

  1. Calculando o número de páginas da contagem total de salários
  2. Paginando cada página, coletando registros salariais

Aqui está uma implementação:

import math
import json

def get_salaries(companyId):
    url = f‘https://www.glassdoor.com/Salary/-Salaries-E{companyId}.htm‘

    # extract page count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text)) 
    pages = data[‘numPages‘]

    salaries = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract salary records 
        salaries.extend(data[‘salaries‘])

    return salaries

Isso nos permite raspar sistematicamente todos os salários de uma empresa em várias páginas.

Raspando perguntas da entrevista

Os insights das entrevistas são outro excelente recurso de dados no Glassdoor. Vejamos como eliminar todas as perguntas da entrevista postadas para uma empresa.

A página de entrevistas da empresa está localizada em:

https://www.glassdoor.com/Interview/Google-Interview-Questions-E9079.htm

As perguntas da entrevista são carregadas dinamicamente por meio de solicitações AJAX ao rolar para baixo ou alterar as páginas.

Nosso plano de jogo é familiar:

  1. Calcule o número de páginas da contagem total de perguntas
  2. Extraia perguntas de cada página

Aqui está uma implementação:

import math
import json

def get_questions(companyId):
    url = f‘https://www.glassdoor.com/Interview/-Interview-Questions-E{companyId}.htm‘

    # get total question count
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘interviewQuestionCount‘]
    pages = math.ceil(total / 20)

    questions = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract questions
        questions.extend(data[‘interviewQuestions‘])

    return questions

Resumindo, calculamos o total de páginas com base na contagem de perguntas, paginamos por meio de chamadas AJAX e extraímos perguntas – o que nos permite obter todos os insights de entrevistas de uma empresa.

Raspagem de fotos do escritório

Para concluir nossa extração de dados do Glassdoor, vamos também coletar fotos do escritório da empresa que fornecem uma visão visual interessante.

A página de fotos de uma empresa pode ser acessada em:

https://www.glassdoor.com/Photos/Google-Office-Photos-E9079.htm

Nossa estratégia de paginação padrão se aplica – calcular páginas a partir da contagem total de fotos, paginar por meio de chamadas AJAX, extrair fotos:

import math 
import json

def get_photos(companyId):
    url = f‘https://www.glassdoor.com/Photos/-Office-Photos-E{companyId}.htm‘

    # get total photo count 
    page = requests.get(url)
    data = json.loads(extract_graphql(page.text))
    total = data[‘officePhotoCount‘]
    pages = math.ceil(total / 20)

    photos = []

    for page in range(1, pages+1):
        page = requests.get(f‘{url}?p={page}‘)
        data = json.loads(extract_graphql(page.text))

        # extract photos
        photos.extend(data[‘officePhotos‘])

    return photos

E com isso podemos raspar todas as fotos de escritório disponíveis para uma empresa!

Lidando com anti-raspagem

Embora as técnicas discutidas permitam extrair vários pontos de dados do Glassdoor, em escala os scrapers geralmente ficam bloqueados.

O Glassdoor possui uma série de mecanismos anti-raspagem para evitar a extração exaustiva de dados, incluindo:

  • Bloqueio de IP
  • Impressão digital do navegador
  • Sistemas de detecção de bots
  • Limitação de taxa

Aqui estão algumas dicas para evitar bloqueios ao raspar o Glassdoor:

  • Usar Proxies: alterne diferentes proxies residenciais para cada solicitação para que seu raspador apareça como usuários diferentes.

  • Taxa Limite: certifique-se de que haja atrasos entre as solicitações e faça o scrap a uma taxa modesta.

  • Imitar navegador: defina um agente de usuário válido, aceite cabeçalhos e Javascript habilitado para parecer um navegador real.

  • Monitorar blocos: Verifique se o seu IP ou proxies estão sendo bloqueados e troque de datacenter ou provedor de acordo.

  • Use serviços de raspagem: aproveite APIs de scraping como ScraperAPI e Octoparse, que possuem suporte integrado para contornar mecanismos anti-scraping.

Com as precauções corretas, é possível extrair dados do Glassdoor em grande escala sem ser bloqueado.

Raspando Glassdoor com ScraperAPI

ScraperAPI é uma API de scraping paga que lida com todos os desafios anti-scraping e permite extrair dados em escala.

Ele suporta rastreamento de ajax, proxies e integra-se diretamente com bibliotecas populares como Python Requests.

Veja como coletaríamos avaliações de empresas usando ScraperAPI:

import requests
import math
import json

API_KEY = ‘XXX‘ # assign key

def get_reviews(companyId):

    url = f‘https://www.glassdoor.com/Reviews/-Reviews-E{companyId}.htm‘

    # initial request to get page count
    response = requests.get(url, 
        headers={‘apikey‘: API_KEY})

    pages = extract_page_count(response.text)

    reviews = []

    for page in range(1, pages+1):
        response = requests.get(f‘{url}?p={page}‘,
            headers={‘apikey‘: API_KEY})

        data = json.loads(response.text)    
        reviews.extend(data[‘reviews‘])

    return reviews 

Aqui o ScraperAPI lida com proxies, navegadores e outros aspectos que nos permitem focar na extração de dados.

Esta é uma maneira fácil de construir raspadores Glassdoor escalonáveis ​​sem ter que se preocupar com sistemas anti-raspagem.

Ao construir scrapers Glassdoor, é importante garantir que seu trabalho esteja em conformidade legal. Aqui estão alguns aspectos importantes a serem considerados:

  • Termos de Serviço – Estude os ToS do Glassdoor para entender as permissões e restrições ao uso de seus dados. Geralmente é permitido extrair volumes razoáveis ​​periodicamente para fins não comerciais.

  • Dados Pessoais – Evite extrair quaisquer dados pessoais do usuário do Glassdoor, como nomes, IDs de e-mail, etc., o que levanta problemas de privacidade.

  • Copyrights – Avaliações do Glassdoor e outros dados enviados pelos usuários são protegidos por direitos autorais. Não reproduza em massa o conteúdo literal do site.

  • Limites de taxa – Respeite quaisquer limites de taxas impostos pelo Glassdoor e não sobrecarregue seus servidores com um número excessivo de solicitações.

  • Casos de uso – Não utilize dados do Glassdoor para fins antiéticos, como assédio a funcionários, discriminação, etc.

Aderir a esses princípios ajudará a garantir que seu raspador permaneça do lado certo da lei.

Conclusão

Neste guia, exploramos várias estratégias e técnicas para extrair dados da empresa do Glassdoor usando Python, incluindo:

  • Extração de informações gerais, listas de empregos, salários, avaliações, perguntas de entrevistas e fotos analisando dados da API GraphQL
  • Calculando páginas de paginação a partir de contagens totais e raspando sistematicamente todas as páginas
  • Lidando com sistemas anti-raspagem do Glassdoor com proxies e serviços como ScraperAPI
  • Garantir a conformidade legal honrando os ToS, a privacidade, os direitos autorais e os limites de taxas

Os métodos discutidos podem ser adaptados para construir poderosos scrapers Glassdoor que coletam dados úteis em escala, de maneira robusta e ética.

Boa raspagem!

Tags:

Junte-se à conversa

O seu endereço de e-mail não será publicado. Os campos obrigatórios são marcados com *