Cбор данных с 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 комментариев