Python ile LinkedIn verilerini kazıma kılavuzu

Yorumlar: 0

LinkedIn verilerini kazımak çeşitli nedenlerden dolayı inanılmaz derecede değerli olabilir:

  • İş piyasası analizi: en çok talep gören beceriler ve sektörler gibi iş ilanlarındaki eğilimleri analiz edin;
  • İşe alım: işe alım stratejilerini bilgilendirmek için iş ilanları hakkında veri toplayın;
  • Rakip araştırması: rakiplerin işe alım modellerini ve stratejilerini izleyin.

Makale, ilk etapta proxy'ler ve başlıklar aracılığıyla tespit edilmekten kaçınmanın önemi de dahil olmak üzere önemli teknik ve stratejileri vurgulayacaktır. HTTP istekleri yapmak için requests kütüphanesi kullanılırken HTML içeriğini ayrıştırmak için lxml kullanılacaktır.

Ortamı ayarlama

Başlamadan önce, makinenizde Python'un kurulu olduğundan emin olun.

Pip kullanarak gerekli kütüphaneleri yükleyin:


pip install requests
pip install lxml

Kazıyıcı ile çalışmaya başlama

İşte Python kullanarak LinkedIn iş ilanlarını kazımak için kapsamlı bir kod örneği:

Kütüphaneleri içe aktarın

Birkaç Python kütüphanesine ihtiyacımız olacak:

  • istekler: Web sayfalarını almak için HTTP istekleri yapmak için.
  • lxml: HTML içeriğini ayrıştırmak için.
  • csv: Çıkarılan verileri bir CSV dosyasına yazmak için.

import requests
from lxml import html
import csv
import random

İş arama URL'sini tanımlayın

Kazımak istediğiniz LinkedIn iş arama URL'sini tanımlayarak başlayın.


url = 'https link'

Kullanıcı aracısı dizeleri ve proxy'ler

LinkedIn'i etkili bir şekilde kazımak için, gerçek bir tarayıcıdan gelen istekleri taklit etmek üzere doğru başlıkları, özellikle de User-Agent başlığını kullanmak çok önemlidir.


user_agents = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
]

Günümüz proxy sağlayıcıları genellikle dahili rotasyonu destekler, yani IP adreslerini sizin için otomatik olarak döndürürler. Bu, bir listeden proxy'leri manuel olarak seçme ihtiyacını ortadan kaldırır. Ancak, örnek olması açısından, gerekirse proxy rotasyonunu şu şekilde1 gerçekleştirebilirsiniz:


proxies = {
    'http': random.choice(proxies),
    'https': random.choice(proxies)
}

İstekler için başlıklar

Başarılı LinkedIn kazıma, gerçek bir tarayıcının davranışını taklit eden başlıkların doğru şekilde ayarlanmasına bağlıdır. Düzgün yapılandırılmış başlıklar yalnızca anti-bot koruma sistemlerini atlatmaya yardımcı olmakla kalmaz, aynı zamanda kazıma faaliyetlerinizin engellenme olasılığını da azaltır.


headers = {
    'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    'accept-language': 'en-IN,en;q=0.9',
    'dnt': '1',
    'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"Linux"',
    'sec-fetch-dest': 'document',
    'sec-fetch-mode': 'navigate',
    'sec-fetch-site': 'none',
    'sec-fetch-user': '?1',
    'upgrade-insecure-requests': '1',
}

Veri Depolamayı Başlatın

İş ilanı bilgilerini etkili bir şekilde toplamak ve saklamak için, bir veri deposunu başlatarak başlamalısınız. Python'da bu genellikle boş bir liste oluşturmayı içerir. Bu liste, HTML içeriğinden çıkarıldıkça iş ayrıntılarını ekleyebileceğiniz bir depolama kabı görevi görecektir. Bu yöntem, bilgilerin sistematik olarak toplanmasını ve daha sonraki işlemler veya analizler için kolayca erişilebilir olmasını sağlar.

job_details = []

HTML içeriğini ayrıştırma

Bir HTTP GET isteği gönderdikten sonra, bir sonraki adım lxml kütüphanesini kullanarak HTML içeriğini ayrıştırmaktır. Bu, HTML yapısı içinde gezinmemizi ve ayıklamak istediğimiz verileri tanımlamamızı sağlayacaktır.


# IP yetkilendirme yöntemiyle rastgele User-Agent ve proxy ayarlama
headers['user-agent'] = random.choice(user_agents)
proxies = {
    'http': IP:PORT,
    'https': IP:PORT
}

# URL'ye bir HTTP GET isteği gönderin
response = requests.get(url=url, headers=headers, proxies=proxies)
parser = html.fromstring(response.content)

İş verilerini çıkarma

HTML içeriği ayrıştırıldıktan sonra, XPath sorgularını kullanarak unvan, şirket adı, konum ve iş URL'si gibi belirli iş ayrıntılarını çıkarabiliriz. Bu ayrıntılar bir sözlükte saklanır ve bir listeye eklenir.


# HTML içeriğinden iş ayrıntılarını çıkarın
for job in parser.xpath('//ul[@class="jobs-search__results-list"]/li'):
    title = ''.join(job.xpath('.//div/a/span/text()')).strip()
    company = ''.join(job.xpath('.//div/div[2]/h4/a/text()')).strip()
    location = ''.join(job.xpath('.//div/div[2]/div/span/text()')).strip()
    job_url = job.xpath('.//div/a/@href')[0]
    
    job_detail = {
        'title': title,
        'company': company,
        'location': location,
        'job_url': job_url
    }
    job_details.append(job_detail)

Verileri CSV'ye kaydet

İş verilerini topladıktan sonra bir CSV dosyasına kaydedin.


with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['title', 'company', 'location', 'job_url']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for job_detail in job_details:
        writer.writerow(job_detail)

Tamamlanmış kod

İşte yukarıdaki tüm bölümleri birleştiren tam kod:


from selenium.webdriver.chrome.options import Options
from seleniumwire import webdriver as wiredriver
from selenium.webdriver.common.by import By
import csv

# Proxy sunucu adresini kullanıcı adı ve parola ile belirtin
proxy_address = ""
proxy_username = ""
proxy_password = ""

# Proxy ve kimlik doğrulama ile Chrome seçeneklerini ayarlama
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# Selenium-wire ile bir WebDriver örneği oluşturma
driver = wiredriver.Chrome(options=chrome_options)

url = 'https link'

# Selenium otomasyonunuzu selenium-wire'ın gelişmiş özellikleriyle gerçekleştirin
driver.get(url)

job_details = []

all_elements = driver.find_elements(By.XPATH,
                                   '//*[@id="main-content"]/section/ul/li')

for i in all_elements:
   title = i.find_element(By.XPATH,
                          './/div/div/h3').text
   company = i.find_element(By.XPATH, './/div/div[2]/h4/a').text
   location = i.find_element(By.XPATH, './/div/div[2]/div/span').text
   job_url = i.find_element(By.XPATH,
                            './/div/a').get_attribute('href')

   job_detail = {
       'title': title,
       'company': company,
       'location': location,
       'job_url': job_url
   }
   job_details.append(job_detail)

with open('linkedin_jobs.csv', 'w', newline='', encoding='utf-8') as csvfile:
   fieldnames = ['title', 'company', 'location', 'job_url']
   writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
   writer.writeheader()
   for job_detail in job_details:
       writer.writerow(job_detail)

driver.quit()

Python kullanarak requests ve lxml kütüphaneleri ile LinkedIn'den veri ayıklamak, iş piyasasını analiz etmek ve personel almak için güçlü bir yol sunar. Sorunsuz bir kazıma süreci sağlamak için, yüksek hızlara sahip veri merkezi proxy'lerinin yanı sıra otomatik eylemlerin engellenme riskini azaltan daha yüksek güven faktörüne sahip ISP proxy'leri kullanılır.

Yorumlar:

0 yorumlar