karanlık proxyscrape logo

Web Scraping For Job Postings – An Ultimate 2024 Guide

Python, Kazıma, Ocak-04-20235 dakika okuma
İş ilanları için Web Kazıma, iş arayanların mevcut iş ilanlarından bir veritabanı oluşturmaları için alternatif bir kısayoldur. Randstad, ortalama bir iş arama sürecinin, başvurunun yapıldığı andan pozisyonun doldurulduğu ana kadar beş ila altı ay sürebileceğini söylüyor. Peki ya tüm iş portalları arasında gezinme ve size uygun olanı seçme yükünüzü azaltabilecek bir çözümünüz olsaydı? 

Bu makale sizi iş ilanları için web kazıma işleminin nasıl yapılacağını açıklayan bir yolculuğa çıkaracak. Yani, iş piyasasındasınız ve en iyi işi bulmaya çalışıyorsunuz. Ama daha akıllıca oynamak istiyorsunuz, daha sert değil. Neden sizin için iş ilanlarını toplayacak ve ayrıştıracak bir web kazıyıcı oluşturmuyorsunuz? Bir kez ayarladığınızda, size güzel ve düzenli bir formatta veri zenginlikleri sağlayacaktır, böylece tekrar tekrar manuel olarak kontrol etmek zorunda kalmazsınız. Hadi başlayalım.

İş İlanları İçin Web Kazıma Nedir?

İş ilanları için web kazıma, birden fazla iş portalından otomatik olarak veri toplayan ve her bir web sitesinden veri alma sürenizi azaltan bir çözümdür. Size iş ilanlarının eksiksiz bir veritabanını sağlayabilecek böyle bir araca sahip olmak, görevinizi birkaç kat kolaylaştıracaktır. Tek yapmanız gereken size uygun olanları filtrelemek ve başvuru sürecine devam etmektir. 

Yani, iş piyasasındasınız ve en iyi işi bulmaya çalışıyorsunuz. Ama daha zor değil, daha akıllıca oynamak istiyorsunuz. Neden sizin için iş ilanlarını toplayacak ve ayrıştıracak bir web kazıyıcı oluşturmuyorsunuz? Bir kez ayarladığınızda, size güzel ve düzenli bir formatta veri zenginlikleri sağlayacaktır, böylece tekrar tekrar manuel olarak kontrol etmek zorunda kalmazsınız. Hadi başlayalım.

[Yasal Uyarı! Birçok web sitesi, sayfalarından veri alınmasını kısıtlayabilir. Kullanıcılar, bilgileri nereden ve nasıl almaya çalıştıklarına bağlı olarak yasal sorunlara maruz kalabilirler. Bu nedenle, verilerini barındıran sitelere bakarken son derece dikkatli olmak gerekir. Örneğin, Facebook, Linked In ve Craiglist bazen sayfalarından veri alınmasına karşı çıkmaktadır. Yani eğer kazımak istiyorsanız, riski kendinize ait olmak üzere kazıyın].

Bu, indeed.com'dan "Veri Bilimi" ile ilgili işlerle ilgili bazı yararlı bilgileri çıkararak web kazımanın temellerini göreceğimiz çok basit bir makale olacak. İşleri birden çok kez manuel olarak güncelleyen harika bir program yazacağız. Bu kazıyıcıyı oluştururken çok kullanışlı olacak bazı yararlı kütüphaneler "requests" ve "BeautifulSoup "tur.

URL ve Sayfa Yapısını Anlama

Öncelikle, gerçekten çıkaracağımız örnek sayfaya bir göz atalım. 

URL'nin yapılandırılma şekli önemlidir:

  • not "q=", sayfadaki "ne" alanı için dizeyi başlatır ve arama terimlerini "+" ile ayırır (örneğin, "veri+bilim adamı" işlerini aramak)
  • Maaş belirtilirken, maaş rakamındaki virgüllerle ayrıştırılır, bu nedenle maaşın başlangıcından önce %24 ve ardından ilk virgülden önceki sayı gelir, daha sonra %2C ile kesilir ve sayının geri kalanıyla devam eder (yani, %2420%2C000 = $20,000)
  • "&l=" notu ilgilenilen şehir için dizeyi başlatır, şehir birden fazla kelimeden oluşuyorsa arama terimlerini "+" ile ayırır (örneğin, "New+York.")
  • "&start=" notu, başlamak istediğiniz arama sonucunu belirtir (örneğin, 10. sonuca bakarak başlayın)

Bu URL yapısı, kazıyıcıyı oluşturmaya ve birden fazla sayfadan veri toplamaya devam ederken çok yardımcı olacaktır. 

Chrome, sayfaya sağ tıklayıp inspect element seçeneğini kullanarak sayfanın HTML yapısını inceleyebilir. Sağ tarafta bir menü belirecek ve iç içe geçmiş öğe etiketlerini de gösterecek ve imlecinizi bu öğelerin üzerine getirdiğinizde ekranın o bölümünü vurgulayacaktır.  

Bu makale için HTML hakkında etiketler, divler vb. gibi temel bilgileri bildiğinizi varsayıyorum, ancak neyse ki her şeyi bilmenize gerek yok. Sadece sayfa yapısını ve farklı bileşenlerin hiyerarşisini anlamanız gerekiyor.

Kazıyıcı ile Başlarken

Şimdi sayfa yapısını analiz ettik. Bu, seçtiğimiz verileri çekmek için bu bilgilere göre kod oluşturmamıza yardımcı olacaktır. İlk olarak kütüphanelerimizi içe aktararak başlayalım. Burada "zaman "ı da içe aktardığımıza dikkat edin; bu, bilgileri kazırken sitenin sunucusunu bunaltmamak için yardımcı olacaktır.

i̇thalat talepleri̇
bs4'üiçe aktar 
from bs4 import BeautifulSoup
import pandas as pd
İçe aktar ma süresi

İstediğimiz her bir bilgiyi geri çekmek için önce tek bir sayfayı hedefleyeceğiz,

URL = "https://www.indeed.com/jobs?q=data+scientist+%2420%2C000&l=New+York&start=10"
#yukarıda belirtilen URL için bir istek gerçekleştiriliyor:
sayfa = requests.get(URL)
#html ayrıştırıcısını kullanarak istenen "sayfa" biçimini belirtmek - bu, python'un sayfayı uzun bir dize olarak ele almak yerine sayfanın çeşitli bileşenlerini okumasına olanak tanır.
soup = BeautifulSoup(page.text, "html.parser")
#çorbayı daha kolay okunmasını sağlayan daha yapılandırılmış bir ağaç biçiminde yazdırma
print(soup.prettify())

Prettify kullanmak, sayfanın HTML kodlamasına genel bir bakış elde etmeyi kolaylaştırır ve bunun gibi bir çıktı sağlar,

 Artık ilgilendiğimiz sayfadaki tüm bilgiler "soup" değişkenimizde bulunmaktadır. Gerekli bilgileri yakalamak için çeşitli etiketler ve alt etiketler arasında yineleme yapmak üzere kodu daha fazla incelememiz gerekiyor.

Verilerin Temel Unsurlarını Elde Etme

Her iş ilanı için beş temel nokta vardır,

  1. İş unvanı.
  2. Şirket adı.
  3. Konum.
  4. Maaş.
  5. İş Özeti.

Sayfaya baktığımızda 15 adet iş ilanı olduğunu görüyoruz. Bu nedenle kodumuz da 15 farklı öğe üretmelidir. Ancak, kod bundan daha azını sağlarsa, sayfaya geri dönebilir ve neyin yakalanmadığını görebiliriz.

İş Ünvanı Alma

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.

Özetleyecek olursak, göreceğimiz işlev aşağıdaki üç adımı içermektedir,

  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)

Bu kod aşağıdaki gibi bir çıktı verecektir,

Şirket Adı Alma

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

Bu yerlerin her birinden şirket bilgilerini çıkarmak için if/else deyimlerini kullanacağız. Çıktı alınırken şirket adlarının etrafındaki beyaz boşlukları kaldırmak için, sonunda inputting.strip() kullanacağız.

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)

Konum Alma

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)

Maaş Alma

Maaş, iş ilanlarından çıkarılması en zor kısımdır. Çoğu ilan maaş bilgisini hiç yayınlamazken, yayınlayanlarda ise bunu almak için birden fazla yer olabilir. Bu nedenle, birden fazla yerden birden fazla maaş alabilen bir kod yazmamız ve maaş bulunamazsa, maaş içermeyen tüm işler için bir yer tutucu "Hiçbir Şey Bulunamadı" değeri oluşturmamız gerekir. 

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)

İş Özeti Alma

Son iş, iş özetini almaktır. Ancak, her bir pozisyon için iş özetlerini almak mümkün değildir, çünkü bunlar belirli bir Indeed sayfasından HTML'ye dahil edilmemiştir. Sağlananlardan her iş hakkında bazı bilgiler alabiliriz. Bunun için Selenium'u kullanabiliriz.

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.

Sıkça Sorulan Sorular

1. Why is it necessary to scrape job details?
Profilinizle eşleşen işleri size bildirebilecek yeterli sayıda iş portalı vardır. Yine de, bir iş kazıma çözümüne sahip olmak size işlerin tam bir listesini ve açıklamasını kullanışlı bir veritabanı olarak sağlayacaktır. Bu, tüm iş fırsatlarını tek bir yerde daha iyi görmenizi sağlayacaktır.
2. How can a proxy help in scraping job details?
Web kazıma genellikle IP blokları, coğrafi bloklar ve sınırlı hız gibi belirli zorluklara sahip olacaktır. İş portallarından iş kazımak da bu tür zorluklara sahip olacaktır. Tüm bu sorunları aşmak için, proxy adresleri gerekli konumun IP adresleri konusunda size yardımcı olabilir ve anonimlik sağlayabilir
3. What are the python libraries required to scrape job details?
Requests, BeautifulSoup, and Pandas are quite common python libraries to scrape job-related data from websites. Request library is the most common python library used to send web requests, while BeautifulSoup is responsible for parsing data, and Pandas library will help with the data structure operations.
İlgili Makaleler

Toparlıyoruz

Bu makalede, web kazımanın ne olduğunu ve Indeed'in web sayfalarından iş verilerini kazımanın pratik bir örneğini alarak günlük hayatımızda nasıl yardımcı olabileceğini gördük. Sayfalar dinamik olduğu için elde ettiğiniz sonuçların bunlardan farklı olabileceğini lütfen unutmayın, bu nedenle bilgiler zamanla değişmeye devam eder. 

Web Kazıma, doğru şekilde ve gereksinimlerinize göre yapılırsa inanılmaz bir tekniktir. Her iş ilanının önemli beş yönünü ve bunların nasıl çıkarılacağını daha önce gördük. Bu kodu kendi başınıza denediğinizde, iş ilanlarının verilerini kazıyacaksınız ve işleri manuel olarak aramanıza gerek kalmayacak, ki bu harika bir şey. Aynı teknik diğer web sayfalarına da uygulanabilir, ancak yapıları farklı olabilir. Bu nedenle kişinin kodunu buna göre optimize etmesi gerekir. Ancak tüm temel bilgiler bu makalede ele alınmıştır, bu nedenle diğer sayfaları da kazımakta herhangi bir zorluk yaşanmayacaktır.

Proxy hizmetleri arıyorsanız, şu adrese bakmayı unutmayın ProxyScrape konut ve prim vekilleri.