Збір даних з LinkedIn з використанням Python

Коментарі: 0

Скрапінг даних з LinkedIn є особливо корисним для:

  • Аналізу ринку праці: вивчення поточних трендів в оголошеннях про вакансії, включно із затребуваними навичками та галузями;
  • Стратегій найму: збору інформації про вакансії для формування ефективних стратегій залучення талантів;
  • Дослідження конкурентів: моніторингу стратегій і набору персоналу конкурентами для виявлення ключових патернів у галузі.

У посібнику буде розглянуто ключові методи і стратегії, зокрема використання проксі та заголовків для мінімізації ризику виявлення. Для надсилання HTTP-запитів буде застосовано бібліотеку requests, а для парсингу HTML-контенту - lxml.

Підготовка робочого простору

Перед початком переконайтеся, що на вашому комп'ютері встановлено Python.

Встановіть необхідні бібліотеки за допомогою pip:


pip install requests
pip install lxml

Початок роботи зі скрапером

Ось докладний приклад коду для скрапінгу вакансій LinkedIn з використанням Python.

Імпорт бібліотек

Нам знадобиться кілька бібліотек Python:

  • requests: для надсилання HTTP-запитів та отримання веб-сторінок;
  • lxml: для парсингу HTML-контенту;
  • csv: для запису витягнутих даних у CSV-файл.

import requests
from lxml import html
import csv
import random

Встановлення цільового URL для пошуку вакансій

Для початку процесу скрапінгу необхідно визначити URL пошуку вакансій на LinkedIn, який буде використовуватися для вилучення даних.


url = 'HTTPS ссылка'

Застосування рядків User-Agent і використання проксі

Щоб успішно скрапити LinkedIn, критично важливо використовувати автентичні заголовки User-Agent для імітації запитів реальних браузерів. Це допомагає приховати автоматизований характер дій і мінімізувати ризики блокування.


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

Багато сучасних проксі-сервісів пропонують функцію автоматичної ротації IP-адрес, що дає змогу уникнути необхідності ручної зміни проксі. Це значно спрощує процес і підвищує ефективність скрапінгу. У разі необхідності ручного налаштування, ось приклад того, як можна організувати ротацію проксі:


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

Налаштування заголовків для запитів

Ключовий аспект в успішному скрапінгу LinkedIn полягає в налаштуванні заголовків, які допомагають імітувати поведінку справжнього браузера. Коректно налаштовані заголовки не тільки сприяють обходу систем захисту від ботів, а й знижують імовірність блокування активності скрапінгу.


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

Створення структури для збору даних

Для систематичного збору та зберігання інформації про вакансії необхідно створити сховище даних. Це можна виконати, створивши порожній список у Python, який буде використовуватися для подальшого збереження всіх зібраних даних про роботу. Цей підхід дає змогу зручно додавати зібрану інформацію в міру її вилучення з HTML-контенту.


job_details = []

Парсинг HTML-вмісту

Здійснивши надсилання HTTP GET-запиту, наступний етап включає парсинг отриманого HTML-контенту. Використання бібліотеки lxml для цього завдання забезпечує можливість ефективної навігації по документу HTML.


# Встановлення випадкового User-Agent і проксі з авторизацією за IP
headers['user-agent'] = random.choice(user_agents)
proxies = {
    'http': IP:PORT,
    'https': IP:PORT
}

# Надсилання HTTP GET-запиту на URL
response = requests.get(url=url, headers=headers, proxies=proxies)
parser = html.fromstring(response.content)

Витяг даних про вакансії

Після парсингу HTML-вмісту можна витягти конкретні деталі вакансій, як-от назву посади, назву компанії, місце розташування та URL вакансії, використовуючи запити XPath. Ці деталі зберігаються в словнику і додаються до списку.


# Витяг деталей вакансій з 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)

Збереження даних у CSV-файл

Після збору даних про вакансії збережіть їх у 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)

Фінальний код

Ось повний код, який об'єднує всі вищезгадані розділи:


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

# Вкажіть адресу проксі-сервера і дані авторизації
proxy_address = ""
proxy_username = ""
proxy_password = ""

# Налаштуйте параметри Chrome з проксі та аутентифікацією
chrome_options = Options()
chrome_options.add_argument(f'--proxy-server={proxy_address}')
chrome_options.add_argument(f'--proxy-auth={proxy_username}:{proxy_password}')

# Створіть екземпляр WebDriver із selenium-wire
driver = wiredriver.Chrome(options=chrome_options)

url = 'https ссылка'

# Виконайте автоматизацію Selenium з розширеними можливостями 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()

Витяг даних з LinkedIn через Python, використовуючи бібліотеки requests і lxml, забезпечує потужний спосіб аналізу ринку праці та найму персоналу. Для безперебійного процесу скрапінгу використовуються датацентр проксі з високою швидкістю, а також ISP проксі з вищим траст-фактором, завдяки якому знижується ризик блокувань автоматизованих дій.

Коментарії:

0 Коментаріїв