Przewodnik po skrobaniu danych LinkedIn za pomocą Pythona

Komentarze: 0

Skrobanie danych LinkedIn może być niezwykle cenne z kilku powodów:

  • Analiza rynku pracy: analizowanie trendów w ofertach pracy, takich jak najbardziej pożądane umiejętności i branże;
  • Rekrutacja: zbieranie danych na temat ofert pracy w celu informowania o strategiach zatrudniania;
  • Badanie konkurencji: monitorowanie wzorców zatrudniania i strategii konkurencji.

W artykule podkreślone zostaną ważne techniki i strategie, w tym znaczenie unikania wykrywania za pośrednictwem serwerów proxy i nagłówków. Biblioteka requests będzie używana do wykonywania żądań HTTP, podczas gdy lxml będzie wykorzystywany do analizowania zawartości HTML.

Konfiguracja środowiska

Zanim zaczniesz, upewnij się, że masz zainstalowany Python na swoim komputerze.

Zainstaluj wymagane biblioteki za pomocą pip:


pip install requests
pip install lxml

Początek pracy ze skrobaczką

Oto kompleksowy przykład kodu do skrobania ofert pracy LinkedIn za pomocą Pythona:

Import bibliotek

Będziemy potrzebować kilku bibliotek Pythona:

  • requests: Do wykonywania żądań HTTP w celu pobrania stron internetowych.
  • lxml: Do analizowania zawartości HTML.
  • csv: Do zapisywania wyodrębnionych danych do pliku CSV.

import requests
from lxml import html
import csv
import random

Zdefiniuj adres URL wyszukiwania ofert pracy

Zacznij od zdefiniowania adresu URL wyszukiwania ofert pracy LinkedIn, który chcesz zeskrobać.


url = 'https link'

Ciągi agenta użytkownika i serwery proxy

Aby skutecznie skrobać LinkedIn, ważne jest, aby używać prawidłowych nagłówków, zwłaszcza nagłówka User-Agent, aby naśladować żądania z rzeczywistej przeglądarki.


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'
]

Współcześni dostawcy proxy często obsługują rotację wewnętrzną, co oznacza, że automatycznie zmieniają adresy IP. Eliminuje to potrzebę ręcznego wybierania serwerów proxy z listy. Jednak dla celów ilustracyjnych, oto jak1 można obsłużyć rotację proxy w razie potrzeby:


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

Nagłówki dla żądań

Skuteczny scraping LinkedIn opiera się na prawidłowej konfiguracji nagłówków, które naśladują zachowanie prawdziwej przeglądarki. Prawidłowo skonfigurowane nagłówki nie tylko pomagają w omijaniu systemów ochrony przed botami, ale także zmniejszają szanse na zablokowanie działań związanych ze skrobaniem.


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',
}

Inicjalizacja magazynu danych

Aby skutecznie gromadzić i przechowywać informacje o ofertach pracy, należy rozpocząć od zainicjowania magazynu danych. W języku Python zazwyczaj polega to na utworzeniu pustej listy. Lista ta będzie służyć jako kontener do przechowywania danych, do którego można dodawać szczegóły ofert pracy w miarę ich wyodrębniania z treści HTML. Ta metoda zapewnia, że informacje są systematycznie gromadzone i łatwo dostępne do dalszego przetwarzania lub analizy.

job_details = []

Parsowanie zawartości HTML

Po wysłaniu żądania HTTP GET, następnym krokiem jest przeanalizowanie zawartości HTML przy użyciu biblioteki lxml. Pozwoli nam to poruszać się po strukturze HTML i zidentyfikować dane, które chcemy wyodrębnić.


# Ustaw losowy User-Agent i proxy z metodą autoryzacji IP
headers['user-agent'] = random.choice(user_agents)
proxies = {
    'http': IP:PORT,
    'https': IP:PORT
}

# Wyślij żądanie HTTP GET do adresu URL
response = requests.get(url=url, headers=headers, proxies=proxies)
parser = html.fromstring(response.content)

Wyodrębnianie danych zadania

Po przeanalizowaniu zawartości HTML możemy wyodrębnić określone szczegóły oferty pracy, takie jak tytuł, nazwa firmy, lokalizacja i adres URL oferty pracy za pomocą zapytań XPath. Szczegóły te są przechowywane w słowniku i dołączane do listy.


# Wyodrębnianie szczegółów zadania z zawartości HTML
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)

Zapisywanie danych do CSV

Po zebraniu danych zadania zapisz je w pliku CSV.


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)

Kompletny kod

Oto kompletny kod, łączący wszystkie powyższe sekcje:


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

# Określ adres serwera proxy wraz z nazwą użytkownika i hasłem.
proxy_address = ""
proxy_username = ""
proxy_password = ""

# Skonfiguruj opcje Chrome z proxy i uwierzytelnianiem
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# Utwórz instancję WebDriver za pomocą selenium-wire
driver = wiredriver.Chrome(options=chrome_options)

url = 'https link'

# Wykonaj automatyzację Selenium z rozszerzonymi możliwościami selenium-wire
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()

Wyodrębnianie danych z LinkedIn przy użyciu Pythona z bibliotekami requests i lxml oferuje potężny sposób na analizę rynku pracy i rekrutację personelu. Aby zapewnić płynny proces skrobania, wykorzystywane są serwery proxy centrów danych o dużej szybkości, a także serwery proxy dostawców usług internetowych o wyższym współczynniku zaufania, co zmniejsza ryzyko blokowania zautomatyzowanych działań.

Komentarze:

0 komentarze