top of page
  • Geovana Sousa

[TUTORIAL] Relatório de Vagas com Web Scraping - Parte I

Na atualidade, a internet torna fácil o acesso a informações de diversos tipos, por exemplo, se eu estou precisando comprar uma nova televisão, acessamos vários sites até achar uma televisão que atenda nossas expectativas, e depois o que fazemos? Entramos em outros marketplaces para comparar os preços daquela televisão. E é aí que perdemos muitas oportunidades, você provavelmente analisa 3 ou 4 sites, por talvez 3 vezes antes de realizar uma compra? E se eu dissesse que existe uma forma de fazer essas pesquisas de forma mais aprofundada em diversos sites, por vários dias automaticamente?


É exatamente isto que iremos aprender no post de hoje, vamos entender na prática o que é a técnica de Web Scraping. Veja abaixo o conteúdo que será abordado ao longo do texto:




O que é Web Scraping?


Web Scraping pode ser definido como a construção de um agente que organiza informações retiradas da web de forma automática. Mas o que isso significa? Bom, ao construir um script para extrair informações da web, você está simulando as ações que faria se estivesse entrando naquele site. Utilizando o exemplo da compra da televisão acima, você escolhe qual modelo precisa e em seguida entraria em diversos sites para analisar as diferenças entre eles. Então, olharia informações como valor, frete, tempo de entrega e compararia com os outros. Com o web Scraping, você criaria um script para pesquisar o modelo da televisão, depois entraria em cada site e extrairia essas informações para uma planilha, por exemplo, depois seguiria para todos os outros marketplaces. Com o agente, você pode obter informações de diversos sites em alguns minutos, enquanto se estivesse fazendo isso pessoalmente, demoraria bem mais e estaria desperdiçando um tempo em que poderia estar realizando outras atividades.


E, além das atividades voltadas para pesquisas pessoais, web Scraping também é muito utilizado na área de Data Science, onde precisamos de atualizações constantes de informações vindas de meios externos. Como por exemplo, acompanhar as informações de certas ações da bolsa, ou analisar as reviews de filmes para um sistema de recomendação.

Mas agora que você entende o que é e o porquê utilizar essa técnica, deve estar se perguntando, como posso construir um agente de Scraping? E isso é o que vamos aprender nas próximas sessões.



Apresentando nosso Case


Imagine que você tenha um amigo que está desempregado e procurando vagas em diversas plataformas, mas nunca parece achar as vagas que vão de cordo com seu perfil. Então, você decide que vai ajudá-lo criando um script em python para encontrar algumas vagas.

Para dar início você pergunta qual o tipo de vaga que está procurando, e ele lhe responde com as seguintes especificações:

  • Vagas de Assistente Administrativo ou Financeiro, que não exija ensino superior.

Para fazer isso, você acredita que poderia usar o Indeed para encontrar as vagas, e ainda achar algumas que ele consiga se candidatar diretamente pela plataforma, sem precisar de um redirecionamento.



O que é o Indeed?


A plataforma Indeed.com é um motor de buscas de empregos criado nos Estados Unidos em 2004. Atualmente, está presente em mais de 50 países e em mais de 28 idiomas.

Este recurso se tornou muito conhecido pela grande disponibilidade de vagas e por permitir o cadastro gratuito para criar candidaturas. Entretanto, seus serviços não são apenas esses de divulgar milhares de vagas, mas também oferecem recursos sobre as tendências do mercado de trabalho e da indústria, busca de salário, índice de competição por vagas e recomendações de empresas.


Agora que já sabemos com o que estamos lidando, vamos à criação do nosso script.





Criação do Relatório de Vagas


Existem diversas ferramentas que podem ser utilizadas para realizar o web Scraping, como, BeautifulSoup, Scrapy e Selenium. Nesse momento, vamos utilizar o Selenium, que é um WebDriver mais completo e que auxilia em buscas avançadas na web.


Para acessar o código completo, siga para o nosso repositório no GitHub ou baixe o arquivo .py abaixo, que pode ser aberto com o PyCharm ou editor de sua preferência.


Parte 1
.rar
Fazer download de RAR • 2KB


Trabalhando com o Selenium


Para iniciar, vamos instalar o Selenium com o pip install.

$ pip install selenium

Agora vamos importar os pacotes necessários para extrair as vagas no website.

import os  # Módulo que permite a interação com o Sistema Operacional
from datetime import date  # Importando o Módulo para trabalhar com Datas
from time import sleep  # Permite adicionar tempos de espera no código
from selenium import webdriver  # Implementações Web do Selenium
from selenium.webdriver.common.keys import Keys # Envio de Inputs para Web
import csv  # Módulo para manipular arquivos CSV

Após importar os módulos e pacotes necessários, já podemos começar a construir nosso script. Para isso, primeiro vamos criar um diretório para o projeto, aqui utilizamos Indeed.

Em seguida, usamos o método writer do módulo CSV para criar um arquivo onde vamos guardar as informações de cada vaga.


Obs.: Após a primeira utilização do código, o writer irá sobrescrever as informações, garantindo que não teremos repetições de vagas.


os.chdir("*SEU DIRETÓRIO*\\Indeed")  # Muda o diretório Atual

# ------------------------------------------------------------------------
# Abre o Arquivo CSV Criado para
writer = csv.writer(open('vagas_ids.csv', 'w', encoding='utf-8', newline=''))
header = ['ID', 'TITULO', 'LINK']
writer.writerow(header)

Para que seja possível utilizar o Selenium, precisamos de um framework que permite executar os testes dentro da web, chamado de webdriver. Você pode utilizar ele para diversos browsers, o que recomendamos é o Chrome, que pode ser baixado neste link. Atente-se para fazer o download da versão correspondete a sua versão atual do Google Chrome.


Após estar o webdriver, mova o arquivo .exe para o diretório onde se encontra a instalação do python, no caso abaixo, na pasta de instalação do Anaconda.

Criamos a variável driver que será o objeto de interação do webdriver, que nos permite usar os recursos da web.


options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome("C:\\Users\\geova\\anaconda3\\chromedriver.exe", options=options)

Obs.: O options utilizado acima é para garantir que não vamos obter erros na inicialização do driver.



Para começar, precisamos entender como analisar a estrutura de um site. Utilizando o Google Chrome, vá até o site do Indeed.com e sobre o campo O quê, clique com o botão direito do mouse, e em Inspecionar (Ctrl+Shift+I). A tela abaixo será aberta, e poderemos visualizar todo o código que forma este website. Você não precisa saber o que significa todos os elementos que aparecem, mas algumas partes são importantes para entender o que vamos fazer, mas relaxa que todas vão ser explicadas quando necessário.



Agora que sabemos como encontrar os elementos que utilizaremos e com os frameworks necessários prontos, vamos criar uma função extrair_vagas que será responsável por interagir com o website.


def extrair_vagas(palavra_chave):
    # Pesquisar cargos
    driver.get('https://br.indeed.com/') 
    cargo_input = driver.find_element_by_name('q') 
    cargo_input.clear() 
    cargo_input.send_keys(palavra_chave)
    cargo_input.send_keys(Keys.RETURN)
    ... 

Obs.: Os três pontos ao final apenas sinaliza que o próximo bloco de código também faz parte da função.


Vamos entender o que está acontecendo nesta primeira parte da função.


O método get faz a requisição da url do site. Em seguida, o find_element_by_name vai procurar o campo O quê, pelo seu nome, no caso o nome que é definido no código HTML que vimos na inspeção. Ao armazenar o elemento na variável cargo_input vamos usá-la para fazer nossa pesquisa. Com o método clear, limpamos o campo e o send_keys(palavra-chave) vai enviar o texto de pesquisa (obs.: ainda não definimos ass palavras que serão pesquisadas). Por fim, o send_keys(Keys.RETURN) faz a requisição da tecla Enter.



...
# Ir para Busca Avançada
driver.find_element_by_xpath('//a[text()="Busca Avançada de Vagas"]').click()

# Selecionar Tipos de Vaga - Efetivo/CLT driver.find_element_by_xpath('//select[@id="jt"]//option[@value="fulltime"]').click()

# Ir para o final da página
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

# Selecionar a opção "Omitir agências de emprego"
driver.find_element_by_xpath('//input[@id="norecruiters"]').click()

# Definir o Local
local = driver.find_element_by_xpath('//input[@id="where"]')
local.clear()
local.send_keys('São Paulo, SP')

# Selecionar a opção - Data: Últimos 3 Dias
driver.find_element_by_xpath('//select[@id="fromage"]//option[@value="3"]').click()

# Mostrar 50 vagas e classificar por data
driver.find_element_by_xpath('//select[@id="limit"]//option[@value="50"]').click()
driver.find_element_by_xpath('//select[@id="sort"]//option[@value="date"]').click()

# Aceitar Cookies
sleep(2)
try:
    driver.find_element_by_xpath('//button[@id="onetrust-accept-btn-handler"]').click()
except:
    pass
...

Nesta segunda parte da nossa função, temos alguns métodos diferentes, entre eles o find_element_by_xpath que é dos mais poderos recursos do Selenium. Com ele, podemos procurar elementos pela implementação de um XML, permitindo localizar diversos tipos de recursos dentro do código. Na primeira orrência, usamos '//a[text()="Busca Avançada de Vagas"]' para encontrar a opção de Busca Avançada no site, a partir do valor de texto encontrado dentro do elemento a (marcação de hipertexto). Um pouco mais abaixo, temos uma forma mais complexa deste método. Ao definir find_element_by_xpath('//select[@id="limit"]//option[@value="50"]'), estamos dizendo que queremos selecionar o elemento dentro de um dropdown de id = limit, com valor númerico igual a 50.


Dentro do código, temos também o método click(), que clica sobre o elemento procurado. E para que o python faça uma pausa e aguarde o carregamento completo dos recursos, utilizamos o sleep(2) que irá esperar 2 segundos.

Após a espera, tentamos encontrar o elemento para aceitar os cookies do site caso apareça a requisição.


Pop-up e Solicitação de utilização de cookies

...
# Selecionar o Botão de Pesquisa
driver.find_element_by_xpath('//button[@id="fj"]').click()
sleep(3)

# Fechar Popup Window
try:
    driver.find_element_by_xpath('//div[@id="popover-x"]').click()
except:
    pass

# Criar lista de vagas da página
lista_vagas = (driver.find_elements_by_xpath('//div[@id="mosaic-provider-jobcards"]/a'))
lista_ids = [vaga.get_attribute('id') for vaga in lista_vagas]
lista_ids = list(set(lista_ids))
lista_vagas = [vaga.get_attribute('href') for vaga in lista_vagas]
...

Para extrair as vagas da página de resultados, vamos criar uma lista, lista_vagas, selecionando todos os cards dentro do mosaico "mosaic-provider-jobcards" com as vagas publicadas.


Em Azul: Mosaico de vagas

Em seguida, utilizamos esta lista para extrair apenas os ids das vagas e usar o recurso set() para garantir qua não teremos repetições entre as iterações. Depois, redefinimos a lista_vagas para apenas mater os links (href) de cada vaga.


Com as listas de vagas e ids em mãos, podemos construir nosso arquivo CSV.

...
# Salvar vagas no CSV
for vaga in lista_vagas:
    driver.get(vaga)  
    button = driver.find_elements_by_xpath('//button[@id="indeedApplyButton"]')
    titulo = driver.find_element_by_css_selector('h1').text
    id_vaga = lista_ids[lista_vagas.index(vaga)]
    if id_vaga is None:
        pass
    else:
        if len(button) > 0:
            if check_titulo(vaga):
                if check_superior(vaga):
                    pass
                else:
                    titulo = titulo
                    link = vaga
                    id_v = id_vaga

                    writer = csv.writer(open('vagas_ids.csv', 'a', encoding='utf-8', newline=''))
                    writer.writerow([id_v, titulo, link])
            else:
                pass
        else:
            pass

Esta última parte da função é um pouco mais complexa. Começamos indo para cada endereço de web das vagas, verificando se a candidatura pode ser feita direto pela plataforma, e para isso usamos a análise do botão de cadastro que possui o id = 'indeedApplyButton'. Em seguida, extraímos o título da vaga utilizando o elemento h1 (marcação de título 1) e o método text para apenas pegar o texto.

Após esta estração, encontramos o id da vaga que estamos analisando, pesquisando seu index na lista. Caso o id esteja vazio (fizemos a exclusão de valores duplicados), a vaga não será levada para o arquivo. Por outro lado, passa por uma outra análise para ver se o botão de cadastro é maior do que 1 (significa que encontramos um botão na página com o id para aplicação direta), se o título está entre as especificações que serão definidas abaixo, e se é exigido ensino superior.

Ao final dos testes, definimos as variáveis com os valores que precisamos de cada vaga e vamos escreve-los como uma linha no nosso CSV, usando o método writer do módulo csv (atente-se que utilizamos o method='a' que é para adicionar linhas ao final sem sobrescrever os valores anteriores).



# Definindo as Opções de Títulos
title_options = ["Financeiro", "financeiro", "Administrativo", "administrativo"]
exclusor = ["Superior", "superior", "cursando", "Cursando", "formado",
            "Formado", "Estágio", "Estagiário", "Bilíngue", "estágio",
            "estagiário", "PCD"]


def check_titulo(vaga):
    if any(titulo in vaga for titulo in title_options):
        result = True
    else:
        result = False
    return result


def check_superior(vaga):
    if any(titulo in vaga for titulo in exclusor):
        result = True
    else:
        result = False
    return result

Aqui, temos a definição das funções utilizadas para selecionar as vagas. A função check_titulo verifica se o título da vaga contém as opções definidas na lista title_options que seguem a necessidade do nosso case. Enquanto a check_superior confere se as palavras na lista exclusor estão entre todos os textos presentes na página da vaga.



Com a finalização desta primeira parte, você deve ter um arquivo csv parecido com a imagem abaixo:





Com isso, finalizamos aqui a primeria parte deste Tutorial. Se quiser se aprofundar mais nos módulos utilizados até aqui, acesse as documentações:

Caso queira acessar o código da Parte I completa, acesse o nosso repositório.




 

Espero que tenham gostado do conteúdo. Se desejam aprender mais sobre Data Science, Machine Learning, Inteligência Artificial e outros assuntos relacionados, me sigam no LinkedIn e no Instagram para não perderem as próximas atualizações. 😉

Posts Relacionados

Ver tudo

Comments


bottom of page