dark proxyscrape logo

Web Scraping For Job Postings – An Ultimate 2024 Guide

Python, Scraping, Janvier 04 à 20235 minutes de lecture
La recherche d'offres d'emploi sur le web est un autre moyen pour les demandeurs d'emploi de créer une base de données d'offres d'emploi actuelles. Selon Randstad, la recherche d'emploi moyenne peut durer de cinq à six mois, entre le moment où une candidature est déposée et celui où le poste est pourvu. Et si vous disposiez d'une solution qui vous soulagerait du fardeau de naviguer sur tous les portails d'emploi et de choisir celui qui vous convient le mieux ? 

Cet article vous fera voyager en vous expliquant comment faire du web scraping pour les offres d'emploi. Vous êtes sur le marché du travail et vous essayez de trouver le meilleur emploi. Mais vous voulez jouer plus intelligemment et non pas plus durement. Pourquoi ne pas construire un scraper web qui collecterait et analyserait les offres d'emploi pour vous. Une fois que vous l'aurez configuré, il vous fournira des données riches dans un format bien ordonné, de sorte que vous n'aurez pas à les vérifier manuellement encore et encore. Commençons.

Qu'est-ce que la recherche d'offres d'emploi sur le web ?

Le web scraping pour les offres d'emploi est une solution qui permet de collecter automatiquement des données à partir de plusieurs portails d'emploi et de réduire le temps nécessaire à la collecte des données sur chaque site web. Disposer d'un tel outil qui peut vous fournir une base de données complète des offres d'emploi vous simplifiera la tâche à bien des égards. Il ne vous reste plus qu'à filtrer les offres qui vous conviennent et à poursuivre le processus de candidature. 

Vous êtes sur le marché du travail et vous essayez de trouver le meilleur emploi. Mais vous voulez jouer plus intelligemment et non pas plus durement. Pourquoi ne pas créer un scraper web qui collecterait et analyserait les offres d'emploi pour vous ? Une fois que vous l'aurez configuré, il vous fournira des données riches dans un format bien ordonné, de sorte que vous n'aurez pas à les vérifier manuellement encore et encore. Commençons.

[Avertissement ! De nombreux sites web peuvent restreindre l'extraction de données de leurs pages. Les utilisateurs peuvent être confrontés à des problèmes juridiques en fonction de l'endroit et de la manière dont ils tentent d'extraire les informations. Il convient donc d'être extrêmement prudent lorsque l'on consulte des sites qui hébergent leurs données. Par exemple, Facebook, Linked In et Craiglist sont parfois mécontents si des données sont extraites de leurs pages. Donc, si vous voulez faire du scraping, faites-le à vos risques et périls].

Il s'agit d'un article très basique dans lequel nous verrons les bases du web scraping en extrayant quelques informations utiles concernant les emplois liés à la "Data Science" sur indeed.com. Nous écrirons un programme étonnant qui met à jour les offres d'emploi plusieurs fois manuellement. Quelques bibliothèques utiles qui seront très pratiques lors de la construction de ce scraper sont "requests" et "BeautifulSoup".

Comprendre l'URL et la structure de la page

Tout d'abord, jetons un coup d'œil à la page d'exemple que nous allons extraire d'En effet

La façon dont l'URL est structurée est importante :

  • note "q=" commence la chaîne du champ "what" de la page, en séparant les termes de recherche par "+" (par exemple, recherche d'emplois "data+scientist").
  • lors de la spécification du salaire, il analyse les virgules dans le chiffre du salaire, de sorte que le début du salaire est précédé de %24, puis du nombre avant la première virgule, il est ensuite interrompu par %2C et continue avec le reste du nombre (par exemple, %2420%2C000 = 20 000 $).
  • la note "&l=" commence la chaîne pour la ville concernée, en séparant les termes de recherche par "+" si la ville est composée de plusieurs mots (par exemple, "New+York").
  • note "&start=" note le résultat de recherche où vous voulez commencer (par exemple, commencez par regarder le 10ème résultat)

Cette structure d'URL nous sera d'une aide précieuse lorsque nous continuerons à construire le scraper et à collecter des données à partir de plusieurs pages. 

Chrome peut examiner la structure HTML de la page en faisant un clic droit sur celle-ci et en utilisant l'option inspecter l'élément. Un menu apparaît à droite, qui affiche également les balises des éléments imbriqués. Lorsque vous placez votre curseur sur ces éléments, cette partie de l'écran est mise en surbrillance.  

Pour cet article, je suppose que vous connaissez les bases du HTML comme les balises, les divs, etc. mais heureusement vous n'avez pas besoin de tout savoir. Il vous suffit de comprendre la structure de la page et la hiérarchie des différents composants.

Pour commencer à utiliser le grattoir

Nous avons maintenant analysé la structure de la page. Cela nous aidera à construire du code en fonction de ces informations pour extraire les données de notre choix. Commençons par importer nos bibliothèques. Notez qu'ici nous importons également "time", ce qui nous aidera à ne pas surcharger le serveur du site lors de l'extraction d'informations.

importer des demandes
import bs4
from bs4 import BeautifulSoup
import pandas as pd
import time

Nous allons d'abord cibler la page unique pour en retirer chaque élément d'information que nous voulons,

URL = "https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10"
#réaliser une requête sur l'URL indiqué ci-dessus :
page = requests.get(URL)
#spécifier le format désiré de "page" en utilisant l'analyseur html - cela permet à python de lire les différents composants de la page, plutôt que de la traiter comme une longue chaîne de caractères.
soup = BeautifulSoup(page.text, "html.parser")
#impression de la soupe dans un format arborescent plus structuré qui facilite la lecture
print(soup.prettify())

L'utilisation de Prettify permet d'avoir une vue d'ensemble du codage HTML de la page et fournit un résultat comme celui-ci,

 Désormais, toutes les informations relatives à la page qui nous intéresse se trouvent dans notre variable "soup". Nous devons creuser davantage dans le code pour itérer à travers les différentes balises et sous-balises afin de capturer les informations requises.

Obtenir les éléments de base des données

Les cinq points clés de chaque offre d'emploi sont les suivants

  1. Titre du poste.
  2. Nom de l'entreprise.
  3. Localisation.
  4. Salaire.
  5. Résumé du poste.

Si nous jetons un coup d'œil à la page, nous constatons qu'il y a 15 offres d'emploi. Par conséquent, notre code devrait également générer 15 éléments différents. Toutefois, si le code en fournit moins, nous pouvons nous référer à la page et voir ce qui n'a pas été capturé.

Obtenir le titre de l'emploi

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.

En résumé, la fonction que nous allons voir comporte les trois étapes suivantes,

  1. Pulling out all the <div> tags with class including “row”.
  2. Identifying <a> tags with attribute “data-tn-element”:”jobTitle”
  3. 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)

Ce code produira un résultat comme celui-ci,

Obtenir le nom de l'entreprise

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”.

Nous utiliserons des instructions if/else pour extraire les informations sur les entreprises de chacun de ces endroits. Afin de supprimer les espaces blancs autour des noms d'entreprises lors de leur sortie, nous utiliserons inputting.strip() à la fin.

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)

Se localiser

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)

Obtenir un salaire

Le salaire est l'élément le plus difficile à extraire des offres d'emploi. La plupart des offres d'emploi ne publient pas du tout d'informations sur le salaire, tandis que celles qui le font peuvent le trouver à plusieurs endroits. Nous devons donc écrire un code capable d'extraire plusieurs salaires à plusieurs endroits et, si aucun salaire n'est trouvé, nous devons créer une valeur "Rien trouvé" pour les offres d'emploi qui ne contiennent pas de salaire. 

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)

Obtenir un résumé d'emploi

La dernière tâche consiste à obtenir le résumé du poste. Cependant, il n'est pas possible d'obtenir les résumés de chaque poste particulier car ils ne sont pas inclus dans le code HTML d'une page Indeed donnée. Nous pouvons obtenir des informations sur chaque poste à partir de ce qui est fourni. Nous pouvons utiliser Selenium à cette fin.

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.

Questions fréquemment posées

1. Pourquoi est-il nécessaire de rechercher les détails d'un emploi ?

Il existe suffisamment de portails d'emploi qui peuvent vous informer des offres correspondant à votre profil. Néanmoins, une solution de scraping d'offres d'emploi vous permettra d'obtenir une liste complète d'offres d'emploi et leur description sous la forme d'une base de données pratique. Cela vous permettra d'avoir une meilleure vue de toutes les opportunités d'emploi en un seul endroit. 

2. Comment un proxy peut-il aider à récupérer les détails d'un emploi ? 

Le web scraping pose généralement certains problèmes, tels que les blocages d'adresses IP, les blocages géographiques et la vitesse limitée. Le scraping d'offres d'emploi à partir de portails d'emploi pose également ce type de problèmes. Pour contourner tous ces problèmes, les adresses proxy peuvent vous aider à obtenir les adresses IP de l'emplacement requis et à garantir l'anonymat.

3. Quelles sont les bibliothèques python nécessaires pour récupérer les détails d'une offre d'emploi ?

Requests, BeautifulSoup et Pandas sont des bibliothèques Python assez courantes pour récupérer des données relatives à l'emploi sur les sites web. La bibliothèque Request est la bibliothèque Python la plus couramment utilisée pour envoyer des requêtes web, tandis que BeautifulSoup est responsable de l'analyse des données et que la bibliothèque Pandas aide à réaliser les opérations de structure de données. 

Artices connexes

Conclusion

Dans cet article, nous avons vu ce qu'est le web scraping et comment il peut être utile dans notre vie quotidienne en prenant un exemple pratique de scraping de données d'emploi à partir des pages web d'Indeed. Veuillez noter que les résultats que vous obtiendrez peuvent être différents de ceux-ci, car les pages sont dynamiques et les informations changent avec le temps. 

Le Web Scraping est une technique incroyable si elle est réalisée correctement et en fonction de vos besoins. Nous avons vu plus loin les cinq aspects importants de chaque offre d'emploi et comment les extraire. Si vous essayez ce code par vous-même, vous aurez récupéré les données des offres d'emploi, et vous n'aurez pas besoin de rechercher les offres manuellement, ce qui est incroyable. La même technique peut être appliquée à d'autres pages web, mais leur structure peut être différente. Il faut donc optimiser le code en conséquence. Mais toutes les bases sont couvertes dans cet article, il n'y aura donc aucune difficulté à scraper d'autres pages également.

Si vous recherchez des services de procuration, n'oubliez pas de consulter les sites suivants ProxyScrape résidentiel et premium proxys.