donker proxyscrape logo

Web Scraping For Job Postings – An Ultimate 2024 Guide

Python, Schrapen, jan-04-20235 min gelezen
Web Scraping voor vacatures is een alternatieve snelkoppeling voor werkzoekenden om een database van actuele vacatures aan te leggen. Randstad zegt dat de gemiddelde zoektocht naar een baan vijf tot zes maanden kan duren, vanaf het moment dat er wordt gesolliciteerd tot het moment dat de vacature wordt ingevuld. Wat als je een oplossing hebt die de last kan verlichten van het surfen door alle vacatureportalen en het kiezen van de juiste die bij je past? 

In dit artikel wordt uitgelegd hoe je web scraping kunt gebruiken voor vacatures. Dus, je bent op de arbeidsmarkt en probeert de beste baan te vinden. Maar je wilt het slimmer spelen en niet moeilijker. Waarom bouw je geen webscraper die vacatures voor je verzamelt en parseert. Als je het eenmaal hebt ingesteld, zal het je voorzien van een schat aan gegevens in een mooi opgeruimd formaat, zodat je het niet steeds opnieuw handmatig hoeft te controleren. Laten we aan de slag gaan.

Wat is web scrapen voor vacatures?

Web scraping voor vacatures is de oplossing die automatisch gegevens verzamelt van meerdere vacatureportalen en uw tijd vermindert bij het ophalen van gegevens van elke website. Met zo'n tool die je kan voorzien van een complete database met vacatures wordt je taak veel eenvoudiger. Het enige wat je hoeft te doen is filteren welke bij je passen en doorgaan met het sollicitatieproces. 

Je bent dus op de arbeidsmarkt en probeert de beste baan te vinden. Maar je wilt het slimmer spelen en niet moeilijker. Waarom bouw je geen webscraper die vacatures voor je verzamelt en parseert? Als je het eenmaal hebt ingesteld, zal het je voorzien van een schat aan gegevens in een mooi opgeruimd formaat, zodat je het niet steeds opnieuw handmatig hoeft te controleren. Laten we aan de slag gaan.

[Disclaimer! Veel websites kunnen het scrapen van gegevens van hun pagina's beperken. Gebruikers kunnen worden onderworpen aan juridische problemen, afhankelijk van waar en hoe ze proberen de informatie te extraheren. Men moet dus uiterst voorzichtig zijn als men sites bekijkt die hun gegevens bewaren. Facebook, Linked In en Craiglist maken zich bijvoorbeeld soms zorgen als er gegevens van hun pagina's worden gescrapt. Dus als je wilt scrapen, doe dat dan op eigen risico].

Dit zal een heel eenvoudig artikel zijn waarin we de basisbeginselen van web scraping zullen zien door wat nuttige informatie over vacatures gerelateerd aan "Data Science" uit indeed.com te halen. We zullen een verbazingwekkend programma schrijven dat de vacatures meerdere keren handmatig bijwerkt. Enkele nuttige bibliotheken die erg handig zullen zijn bij het bouwen van deze scraper zijn "requests" en "BeautifulSoup".

De URL en paginastructuur begrijpen

Laten we eerst eens kijken naar de voorbeeldpagina die we er inderdaad uit gaan halen. 

De manier waarop de URL is opgebouwd, is belangrijk:

  • let op "q=" begint de string voor het "wat"-veld op de pagina en scheidt zoektermen met "+" (dus zoeken naar "data+wetenschapper"-vacatures)
  • wanneer salaris wordt opgegeven, wordt het salaris geparseerd door komma's, dus het begin van het salaris wordt voorafgegaan door %24 en dan het getal voor de eerste komma, het wordt dan onderbroken door %2C en gaat verder met de rest van het getal (bijv. %2420%2C000 = $20.000)
  • let op "&l=" begint de tekenreeks voor de gewenste stad en scheidt zoektermen met "+" als de stad uit meer dan één woord bestaat (bijv. "New+York.").
  • let op "&start=" geeft het zoekresultaat aan waar je wilt beginnen (dus begin bij het 10e resultaat)

Deze URL-structuur zou ons enorm helpen bij het verder bouwen van de scraper en het verzamelen van gegevens van meerdere pagina's. 

Chrome kan de HTML-structuur van de pagina onderzoeken door er met de rechtermuisknop op te klikken en de optie element inspecteren te gebruiken. Er verschijnt een menu aan de rechterkant dat ook de geneste element-tags laat zien en als je je cursor op die elementen zet, wordt dat deel van het scherm gemarkeerd.  

Voor dit artikel ga ik ervan uit dat je de basis van HTML kent, zoals tags, divs, enzovoort, maar gelukkig hoef je niet alles te weten. Je hoeft alleen maar de paginastructuur en de hiërarchie van de verschillende onderdelen te begrijpen.

Aan de slag met de Scraper

Nu hebben we de paginastructuur geanalyseerd. Dit zal ons helpen om code te bouwen op basis van die informatie om de gegevens van onze keuze eruit te halen. Laten we beginnen met het importeren van onze bibliotheken. Merk op dat we hier ook "tijd" importeren, wat nuttig zal zijn om de server van de site niet te overweldigen bij het schrapen van informatie.

verzoeken importeren 
importeer bs4
van bs4 importeer BeautifulSoup
importeer pandas als pd
importeer tijd

We richten ons eerst op de enkele pagina om elk stukje informatie dat we willen in te trekken,

URL = "https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10"
#een verzoek uitvoeren van de bovenstaande URL:
page = requests.get(URL)
#het gewenste formaat van "page" specificeren met behulp van de html-parser - hierdoor kan python de verschillende onderdelen van de pagina lezen, in plaats van deze als één lange string te behandelen.
soep = BeautifulSoup(page.text, "html.parser")
#soep afdrukken in een meer gestructureerde boomstructuur die het lezen vergemakkelijkt
print(soup.prettify())

Het gebruik van prettify maakt het eenvoudiger om een overzicht te krijgen van de HTML-codering van een pagina en levert output zoals deze,

 Nu staat alle informatie over onze interessante pagina in onze variabele "soep". We moeten verder graven in de code om de verschillende tags en sub-tags te doorlopen om de vereiste informatie vast te leggen.

Basiselementen van gegevens verkrijgen

Vijf belangrijke punten voor elke vacature zijn,

  1. Functieomschrijving.
  2. Bedrijfsnaam.
  3. Locatie.
  4. Salaris.
  5. Functieoverzicht.

Als we de pagina bekijken, zijn er 15 vacatures. Daarom zou onze code ook 15 verschillende items moeten genereren. Als de code er echter minder genereert, kunnen we teruggaan naar de pagina en zien wat er niet wordt vastgelegd.

Functie krijgen

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.

Samengevat omvat de functie die we gaan zien de volgende drie stappen,

  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)

Deze code geeft de volgende uitvoer,

Bedrijfsnaam krijgen

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

We zullen if/else statements gebruiken om de bedrijfsinformatie van elk van deze plaatsen te halen. Om de witruimtes rond de bedrijfsnamen te verwijderen wanneer ze worden uitgevoerd, gebruiken we inputting.strip() aan het einde.

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)

Locatie krijgen

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)

Salaris krijgen

Salaris is het meest uitdagende deel om uit vacatures te halen. De meeste vacatures publiceren helemaal geen salarisinformatie, terwijl andere vacatures die dat wel doen, op meerdere plaatsen te vinden zijn. We moeten dus een code schrijven die meerdere salarissen van verschillende plaatsen kan ophalen, en als er geen salaris wordt gevonden, moeten we een plaatshouder "Niets gevonden" maken voor alle vacatures die geen salaris bevatten. 

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)

Job samenvatten

De laatste taak is het verkrijgen van de vacature-samenvatting. Het is echter niet mogelijk om de vacature-samenvattingen voor elke specifieke vacature te krijgen omdat deze niet zijn opgenomen in de HTML van een bepaalde Indeed-pagina. We kunnen wel wat informatie over elke vacature krijgen uit wat er wordt aangeboden. Hiervoor kunnen we Selenium gebruiken.

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.

Veelgestelde vragen

1. Waarom is het nodig om jobgegevens te scrapen?

Er zijn genoeg vacatureportalen die je op de hoogte kunnen brengen van de vacatures die bij je profiel passen. Met een job scraping-oplossing krijg je echter een volledige lijst met vacatures en de beschrijving ervan in een handige database. Zo krijg je een beter overzicht van alle vacatures op één plek. 

2. Hoe kan een proxy helpen bij het schrapen van vacaturegegevens? 

Web scraping heeft meestal bepaalde uitdagingen zoals IP-blokkades, geoblokkades en beperkte snelheid. Het scrapen van vacatures van vacatureportalen zal ook met dergelijke uitdagingen te maken hebben. Om al deze problemen te omzeilen, kan proxy adressen je helpen met IP-adressen van de gewenste locatie en anonimiteit garanderen.

3. Wat zijn de python-bibliotheken die nodig zijn om taakgegevens te scrapen?

Requests, BeautifulSoup en Pandas zijn veelgebruikte python-bibliotheken om taakgerelateerde gegevens van websites te scrapen. De Request-bibliotheek is de meest gebruikte python-bibliotheek om webverzoeken te verzenden, terwijl BeautifulSoup verantwoordelijk is voor het parsen van gegevens en de Pandas-bibliotheek helpt met de bewerkingen voor gegevensstructuren. 

Gerelateerde artikelen

Inpakken

In dit artikel hebben we gezien wat web scraping is en hoe het nuttig kan zijn in ons dagelijks leven aan de hand van een praktisch voorbeeld van het schrapen van vacaturegegevens van webpagina's van Indeed. Houd er rekening mee dat de resultaten die u krijgt anders kunnen zijn dan deze, omdat de pagina's dynamisch zijn, dus de informatie verandert met de tijd. 

Web Scraping is een ongelooflijke techniek als het op de juiste manier en volgens je vereisten wordt gedaan. We hebben verder de vijf belangrijke aspecten van elke vacature bekeken en hoe je die eruit kunt halen. Als je deze code zelf uitprobeert, heb je gegevens van vacatures geschraapt en hoef je niet handmatig naar vacatures te zoeken, wat geweldig is. Dezelfde techniek kan ook worden toegepast op andere webpagina's, maar hun structuur kan verschillen. Daarom moet je je code optimaliseren. Maar alle basisprincipes zijn in dit artikel behandeld, dus het zal geen probleem zijn om ook andere pagina's te scrapen.

Als je op zoek bent naar proxy diensten, vergeet dan niet te kijken bij ProxyScrape residentiële en premium proxies.