Web Scraping para anúncios de emprego - Guia definitivo 2024

Python, Raspagem, Mar-06-20245 minutos de leitura

O Web Scraping para anúncios de emprego é um atalho alternativo para os candidatos a emprego criarem uma base de dados de ofertas de emprego actuais. A Randstad afirma que a procura média de emprego pode durar cinco a seis meses, desde a apresentação de uma candidatura até ao preenchimento de uma vaga. E se tiver uma solução que possa reduzir os seus encargos

O Web Scraping para anúncios de emprego é um atalho alternativo para os candidatos a emprego criarem uma base de dados de ofertas de emprego actuais. A Randstad afirma que a procura média de emprego pode durar cinco a seis meses, desde a apresentação de uma candidatura até ao preenchimento da vaga. E se houvesse uma solução que pudesse reduzir o fardo de navegar por todos os portais de emprego e escolher o que mais lhe convém? 

Este artigo leva-o numa viagem que explica como fazer scraping na Web para anúncios de emprego. Então, está no mercado de trabalho e está a tentar encontrar o melhor emprego. Mas quer jogar de forma mais inteligente e não mais difícil. Por que não construir um "web scraper" para recolher e analisar anúncios de emprego por si. Depois de o configurar, ele fornecer-lhe-á uma grande quantidade de dados num formato bem organizado, para que não tenha de os verificar manualmente uma e outra vez. Vamos começar.

O que é Web Scraping para anúncios de emprego?

O Web scraping para anúncios de emprego é a solução que recolhe automaticamente dados de vários portais de emprego e reduz o tempo necessário para obter dados de cada sítio Web. Uma ferramenta deste tipo que lhe forneça uma base de dados completa de ofertas de emprego simplificará muito a sua tarefa. Tudo o que tem de fazer é filtrar o que lhe convém e prosseguir com o processo de candidatura. 

Então, está no mercado de trabalho e está a tentar encontrar o melhor emprego. Mas quer jogar de forma mais inteligente e não mais difícil. Porque não construir um web scraper para recolher e analisar anúncios de emprego por si? Depois de o configurar, ele fornecer-lhe-á uma grande quantidade de dados num formato bem organizado, para que não tenha de os verificar manualmente uma e outra vez. Vamos lá começar.

[Aviso legal! Muitos sítios Web podem restringir a extração de dados das suas páginas. Os utilizadores podem estar sujeitos a questões legais, dependendo de onde e como tentam extrair as informações. Por isso, é preciso ter muito cuidado ao consultar os sítios que alojam os seus dados. Por exemplo, o Facebook, o Linked In e a Craiglist por vezes têm problemas se os dados forem extraídos das suas páginas. Por isso, se quiser fazer scraping, faça-o por sua conta e risco].

Este será um artigo muito básico, no qual veremos os fundamentos do web scraping, extraindo algumas informações úteis sobre empregos relacionados com "Data Science" do indeed.com. Vamos escrever um programa incrível que atualiza as vagas várias vezes manualmente. Algumas bibliotecas úteis que serão muito úteis na construção deste scraper são "requests" e "BeautifulSoup".

Compreender o URL e a estrutura da página

Primeiro, vamos ver a página de amostra que vamos extrair do indeed

A forma como o URL está estruturado é importante:

  • nota: "q=" inicia a cadeia de caracteres do campo "o quê" da página, separando os termos de pesquisa com "+" (ou seja, procura de empregos "data+scientist")
  • ao especificar o salário, este será analisado por vírgulas no valor do salário, pelo que o início do salário será precedido por %24 e, em seguida, o número antes da primeira vírgula, que será depois interrompido por %2C e continuará com o resto do número (ou seja, %2420%2C000 = $20.000)
  • nota "&l=" inicia a cadeia de caracteres para a cidade de interesse, separando os termos de pesquisa com "+" se a cidade for mais do que uma palavra (ou seja, "Nova+York.")
  • nota "&start=" indica o resultado da pesquisa onde pretende começar (ou seja, começar por ver o 10.º resultado)

Esta estrutura de URL seria de grande ajuda à medida que continuamos a construir o scraper e a recolher dados de várias páginas. 

O Chrome pode examinar a estrutura HTML da página clicando com o botão direito do rato sobre ela e utilizando a opção inspecionar elemento. Aparecerá um menu à direita, que também mostrará as etiquetas dos elementos aninhados e, quando colocar o cursor sobre esses elementos, destacará essa parte do ecrã.  

Para este artigo, suponho que sabe o básico sobre HTML, como tags, divs, etc., mas felizmente não precisa de saber tudo. Só precisa de compreender a estrutura da página e a hierarquia dos diferentes componentes.

Começar a utilizar o raspador

Agora analisámos a estrutura da página. Isso nos ajudará a criar código de acordo com essas informações para extrair os dados de nossa escolha. Vamos começar por importar as nossas bibliotecas. Repare que aqui também estamos a importar "time" (tempo), o que será útil para não sobrecarregar o servidor do site ao extrair informações.

importar pedidos
importar bs4
from bs4 import BeautifulSoup
importar pandas as pd
importar time

Em primeiro lugar, vamos direcionar a página única para retirar cada uma das informações que pretendemos,

URL = "https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10"
#realização de um pedido do URL indicado acima:
page = requests.get(URL)
#especificando o formato desejado de "page" usando o analisador html - isto permite ao python ler os vários componentes da página, em vez de a tratar como uma longa cadeia de caracteres.
soup = BeautifulSoup(page.text, "html.parser")
#imprimir a sopa num formato de árvore mais estruturado que facilita a leitura
print(soup.prettify())

A utilização do prettify torna mais fácil ter uma visão geral da codificação HTML da página e fornece resultados como este,

 Agora, toda a informação sobre a nossa página de interesse está na nossa variável "sopa". Temos de aprofundar o código para iterar através de várias etiquetas e sub-tags para capturar a informação necessária.

Obtenção de elementos básicos de dados

Os cinco pontos-chave para cada anúncio de emprego são,

Título do emprego.Nome da empresa.Localização.Salário.Resumo do emprego.

Se dermos uma vista de olhos à página, existem 15 ofertas de emprego. Por conseguinte, o nosso código também deve gerar 15 itens diferentes. No entanto, se o código fornecer menos do que isso, podemos voltar à página e ver o que não está a ser capturado.

Obter título de emprego

As can be seen, the entirety of each job posting is under <div> tags, with an attribute “class” = “row result.”

Further, we could also see that job titles are under <a> tags, with the attribute “title = (title)”. One can see the value of the tag’s attribute with tag[“attribute”], so I can use it to find each posting’s job title.

Se resumirmos, a função que vamos ver envolve as três etapas seguintes,

Pulling out all the <div> tags with class including “row”.Identifying <a> tags with attribute “data-tn-element”:”jobTitle”For each of these <a> tags, find attribute values “title”

def extract_job_title_from_result(soup): 
  jobs = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    for a in div.find_all(name="a", attrs={"data-tn-element":"jobTitle"}):
      jobs.append(a["title"])
  return(jobs)
extract_job_title_from_result(soup)

Este código produzirá um resultado como este,

Obter o nome da empresa

Getting company names can be a bit tricky because most of them are appearing in <span> tags, with “class”:” company”.  They are also housed in <span> tags with “class”:” result-link-source”.

Utilizaremos instruções if/else para extrair a informação da empresa de cada um destes locais. Para remover os espaços em branco à volta dos nomes das empresas quando estas são extraídas, utilizaremos inputting.strip() no final.

def extract_company_from_result(soup): 
 companies = []
 for div in soup.find_all(name="div", attrs={"class":"row"}):
   company = div.find_all(name="span", attrs={"class":"company"})
   if len(company) &gt; 0:
    for b in company:
     companies.append(b.text.strip())
   else:
    sec_try = div.find_all(name="span", attrs={"class":"result-link-source"})
    for span in sec_try:
      companies.append(span.text.strip())
 return(companies)
 
extract_company_from_result(soup)

Obter localização

Locations are located under the <span> tags. Span tags are sometimes nested within each other, such that the location text may sometimes be within “class”:”location” attributes, or nested in “itemprop”:”addressLocality”. However a simple for loop can examine all span tags for text and retrieve the necessary information.

def extract_location_from_result(soup): 
  locations = []
  spans = soup.findAll('span', attrs={'class': 'location'})
  for span in spans:
    locations.append(span.text)
  return(locations)
extract_location_from_result(soup)

Receber salário

O salário é a parte mais difícil de extrair dos anúncios de emprego. A maioria dos anúncios não publica qualquer informação sobre o salário, enquanto outros que o fazem podem ter vários locais para o obter. Por isso, temos de escrever um código que possa obter vários salários de vários locais e, se não for encontrado nenhum salário, temos de criar um valor de espaço reservado "Nada encontrado" para quaisquer empregos que não contenham o salário. 

Some salaries are under <nobr> tags, while others are under <div> tags, “class”:”sjcl” and are under separate div tags with no attributes. Try/except statement can be helpful while extracting this information. 

def extract_salary_from_result(soup): 
  salaries = []
  for div in soup.find_all(name="div", attrs={"class":"row"}):
    try:
      salaries.append(div.find('nobr').text)
    except:
      try:
        div_two = div.find(name="div", attrs={"class":"sjcl"})
        div_three = div_two.find("div")
        salaries.append(div_three.text.strip())
      except:
        salaries.append("Nothing_found")
  return(salaries)
extract_salary_from_result(soup)

Obter o resumo do trabalho

A tarefa final é obter o resumo da vaga. No entanto, não é possível obter os resumos das vagas para cada vaga em particular porque eles não estão incluídos no HTML de uma determinada página do Indeed. Podemos obter algumas informações sobre cada vaga a partir do que é fornecido. Para o efeito, podemos utilizar o Selenium.

But let’s first try this using python. Summaries are located under <span> tags. Span tags are nested within each other such that the location text is within “class”:” location” tags or nested in “itemprop”:” adressLocality”. However, using a simple for loop can examine all span tags for text to retrieve the necessary information.

Perguntas mais frequentes

Perguntas frequentes:

1. Porque é que é necessário recolher os dados do emprego?
Existem muitos portais de emprego que o podem notificar dos empregos que correspondem ao seu perfil. No entanto, uma solução de recolha de dados de empregos permite-lhe obter uma lista completa de empregos e a respectiva descrição numa base de dados útil. Desta forma, poderá ter uma melhor visão de todas as oportunidades de emprego num só local.
2. Como é que um proxy pode ajudar a obter informações sobre o emprego?
A recolha de dados da Web tem normalmente alguns desafios, como bloqueios de IP, bloqueios geográficos e velocidade limitada. A recolha de trabalhos a partir de portais de emprego também terá esses desafios. Para contornar todos estes problemas, os endereços proxy podem ajudá-lo com endereços IP da localização pretendida e garantir o anonimato
3. Quais são as bibliotecas python necessárias para recolher os detalhes do trabalho?
Requests, BeautifulSoup e Pandas são bibliotecas python bastante comuns para extrair dados relacionados com empregos de sítios Web. A biblioteca Request é a biblioteca python mais comum utilizada para enviar pedidos Web, enquanto a BeautifulSoup é responsável pela análise dos dados e a biblioteca Pandas ajuda nas operações de estrutura de dados.

Artigos relacionados

Como fazer scraping do Twitter usando Python

Como fazer scraping do Instagram usando Python

Como fazer scraping do Reddit usando Python

Conclusão

Neste artigo, vimos o que é a recolha de dados da Web e como pode ser útil no nosso quotidiano, através de um exemplo prático de recolha de dados sobre empregos das páginas Web do Indeed. Tenha em atenção que os resultados obtidos podem ser diferentes destes, uma vez que as páginas são dinâmicas e, por isso, a informação vai mudando ao longo do tempo. 

O Web Scraping é uma técnica incrível se for efectuada corretamente e de acordo com as suas necessidades. Vimos ainda os cinco aspectos importantes de cada anúncio de emprego e como extraí-los. Quando experimentar este código, terá extraído dados de anúncios de emprego e não precisará de procurar os empregos manualmente, o que é fantástico. A mesma técnica também pode ser aplicada a outras páginas Web, mas a sua estrutura pode ser diferente. Por isso, é necessário otimizar o código de acordo com essa estrutura. Mas todas as noções básicas foram abordadas neste artigo, pelo que não haverá qualquer dificuldade em extrair outras páginas também.

Se estiver à procura de serviços proxy, não se esqueça de consultar ProxyScrapeproxies residenciais e premium.