Назад к блогу

Прокси для парсинга вакансий с hh.ru, Superjob и LinkedIn: полное руководство

Подробное руководство по настройке прокси для парсинга job boards: выбор типа прокси, обход защиты hh.ru и Superjob, настройка ротации IP и обработка капчи.

📅12 марта 2026 г.

Парсинг job boards — это один из самых востребованных сценариев сбора данных для HR-аналитики, мониторинга рынка труда и автоматизации рекрутинга. Но сайты вакансий активно защищаются от автоматического сбора данных: блокируют IP после 50-100 запросов, показывают капчу и банят подозрительные аккаунты. В этой статье разберём, как правильно настроить прокси для стабильного парсинга hh.ru, Superjob, LinkedIn и других площадок без блокировок.

Почему job boards блокируют парсинг и как работает защита

Сайты вакансий теряют деньги на парсинге: данные продаются конкурентам, создаются агрегаторы без лицензии, работодатели обходят платные размещения. Поэтому все крупные площадки внедрили многоуровневую защиту от автоматического сбора данных.

Основные методы защиты job boards:

  • Rate limiting по IP — hh.ru блокирует IP после 80-120 запросов в час, Superjob — после 50-70 запросов. Блокировка может длиться от 1 часа до суток.
  • Fingerprinting браузера — сайты анализируют User-Agent, заголовки HTTP, разрешение экрана, установленные шрифты. Если данные не соответствуют реальному браузеру — запрос блокируется.
  • JavaScript-проверки — многие сайты используют Cloudflare или собственные скрипты для проверки, что запрос идёт от настоящего браузера, а не бота.
  • Honeypot-ловушки — скрытые ссылки и поля, которые видит только парсер. Если бот переходит по ним — IP попадает в чёрный список.
  • Капча при подозрительной активности — появляется после серии быстрых запросов или при использовании дата-центровых IP.

Без прокси вы сможете спарсить максимум 100-200 вакансий, после чего ваш IP попадёт в бан. Для масштабного сбора данных (тысячи вакансий ежедневно) прокси становятся обязательным инструментом.

Важно: Парсинг должен соответствовать условиям использования сайта. Многие job boards предоставляют официальные API для легального доступа к данным. Например, hh.ru имеет бесплатный API с лимитом запросов, который подходит для большинства задач.

Какой тип прокси выбрать для парсинга вакансий

Выбор типа прокси зависит от масштаба парсинга, бюджета и требований к скорости. Разберём три основных варианта с конкретными сценариями использования.

Тип прокси Скорость Риск бана Когда использовать
Дата-центровые Высокая (50-200 мс) Высокий Тестирование парсера, сбор публичных данных без авторизации
Резидентные Средняя (200-800 мс) Низкий Масштабный парсинг hh.ru, Superjob с ротацией IP
Мобильные Средняя (300-1000 мс) Очень низкий Парсинг с авторизацией, обход жёсткой защиты LinkedIn

Дата-центровые прокси для парсинга

Это самый быстрый и дешёвый вариант, но с ограничениями. Дата-центровые IP легко распознаются сайтами, поэтому они подходят только для простых задач: парсинг списков вакансий без авторизации, сбор публичных данных, тестирование парсера перед запуском на резидентных прокси.

Когда дата-центровые прокси работают:

  • Парсинг небольшого объёма данных (до 500 вакансий в день)
  • Сбор данных с сайтов без жёсткой защиты (небольшие региональные job boards)
  • Использование официальных API с ротацией IP для обхода rate limits
  • Парсинг RSS-лент и XML-файлов вакансий

Для hh.ru и Superjob дата-центровые прокси будут работать нестабильно: вы получите капчу после 20-30 запросов, а многие IP уже находятся в чёрных списках этих сайтов.

Резидентные прокси — оптимальный выбор для job boards

Резидентные прокси используют IP-адреса реальных домашних пользователей, поэтому сайты воспринимают их как обычных посетителей. Это оптимальный баланс цены и качества для парсинга вакансий.

Преимущества для парсинга job boards:

  • Низкий риск блокировки — hh.ru и Superjob не могут отличить резидентный IP от реального пользователя
  • Большой пул IP-адресов — можно настроить ротацию на каждый запрос или раз в 5-10 минут
  • Географическая привязка — можно парсить вакансии из конкретного города, используя IP этого региона
  • Стабильность — один резидентный IP может обработать 200-500 запросов без блокировки

Для масштабного парсинга (более 1000 вакансий в день) резидентные прокси с ротацией IP — это стандартное решение. Вы настраиваете смену IP каждые 5-10 минут, добавляете случайные задержки между запросами (3-7 секунд) и получаете стабильный сбор данных без блокировок.

Мобильные прокси для LinkedIn и парсинга с авторизацией

Мобильные прокси используют IP мобильных операторов. Их главное преимущество — один IP используется сотнями реальных пользователей одновременно, поэтому сайты не могут заблокировать такой адрес без риска заблокировать тысячи обычных посетителей.

Когда нужны мобильные прокси:

  • Парсинг LinkedIn — эта платформа имеет самую жёсткую защиту от ботов и агрессивно блокирует дата-центровые и даже резидентные IP
  • Работа с авторизацией — если вам нужно парсить закрытые вакансии или данные профилей, мобильные IP снижают риск бана аккаунта
  • Парсинг зарубежных job boards — Indeed, Glassdoor, Monster используют продвинутые системы защиты, где мобильные IP работают надёжнее
  • Обход жёстких блокировок — если ваши резидентные прокси начали получать капчу, переход на мобильные решит проблему

Минус мобильных прокси — высокая цена и меньшая скорость. Но для критичных задач, где блокировка недопустима, это лучший выбор.

Особенности парсинга hh.ru: защита и способы обхода

hh.ru — крупнейший российский сайт вакансий с самой продвинутой защитой от парсинга среди отечественных job boards. Сайт использует комбинацию rate limiting, fingerprinting и поведенческого анализа для выявления ботов.

Как работает защита hh.ru

1. Лимиты по IP-адресу: После 80-120 запросов в час с одного IP сайт начинает показывать капчу или возвращает HTTP 429 (Too Many Requests). Блокировка длится от 1 до 6 часов в зависимости от агрессивности парсинга.

2. Проверка User-Agent и заголовков: hh.ru анализирует заголовки HTTP-запросов. Если User-Agent не соответствует реальному браузеру или отсутствуют стандартные заголовки (Accept-Language, Accept-Encoding), запрос блокируется.

3. JavaScript-проверки: Некоторые страницы hh.ru требуют выполнения JavaScript для загрузки данных. Простой HTTP-парсер без headless-браузера не сможет получить полный контент.

4. Honeypot-ссылки: На страницах есть скрытые элементы, которые видит только парсер. Если ваш скрипт переходит по этим ссылкам — IP попадает в чёрный список на 24 часа.

Стратегия обхода защиты hh.ru с прокси

Для стабильного парсинга hh.ru без блокировок используйте следующую конфигурацию:

Оптимальная настройка для парсинга hh.ru:

  • Тип прокси: Резидентные с ротацией IP каждые 5-10 минут
  • Задержка между запросами: 4-8 секунд (случайное значение)
  • User-Agent: Ротация реальных User-Agent современных браузеров (Chrome, Firefox, Safari последних версий)
  • Заголовки: Полный набор стандартных заголовков браузера (Accept, Accept-Language, Accept-Encoding, Referer)
  • Cookies: Сохранение и передача cookies между запросами в рамках одной сессии
  • Лимит запросов: Не более 60-80 запросов на один IP, после чего смена прокси

Пример безопасной последовательности действий:

  1. Подключаетесь к резидентному прокси с IP из нужного региона (например, Москва)
  2. Делаете первый запрос на главную страницу hh.ru, получаете и сохраняете cookies
  3. Ждёте 5-7 секунд (имитация чтения страницы)
  4. Делаете запрос на страницу поиска вакансий с нужными фильтрами
  5. Парсите список вакансий (обычно 20-50 на странице)
  6. Для каждой вакансии делаете запрос на детальную страницу с задержкой 4-6 секунд
  7. После 60-70 запросов меняете прокси и повторяете цикл

При такой стратегии вы можете парсить 1000-2000 вакансий в день с одного потока без единой блокировки. Если нужен больший объём — запускайте несколько параллельных потоков с разными прокси.

Совет: hh.ru предоставляет бесплатный API для доступа к вакансиям. Для большинства задач (анализ рынка труда, мониторинг зарплат) API будет более стабильным решением, чем парсинг HTML. Прокси можно использовать для ротации IP при работе с API, чтобы обойти rate limits.

Парсинг Superjob, LinkedIn и зарубежных площадок

Superjob: особенности защиты

Superjob имеет менее жёсткую защиту по сравнению с hh.ru, но всё равно активно борется с парсингом. Основные отличия:

  • Более низкий rate limit: Блокировка наступает после 50-70 запросов в час (против 80-120 у hh.ru)
  • Менее строгая проверка заголовков: Можно использовать упрощённый набор заголовков
  • Отсутствие JavaScript-защиты: Большинство данных доступны через простой HTTP-запрос без headless-браузера
  • Региональная блокировка: Некоторые вакансии доступны только с IP определённого региона

Для Superjob достаточно резидентных прокси с ротацией каждые 10-15 минут и задержкой между запросами 3-5 секунд. Это позволит стабильно парсить 500-1000 вакансий в день.

LinkedIn: самая жёсткая защита

LinkedIn — это отдельная история. Платформа использует продвинутые алгоритмы машинного обучения для выявления ботов и имеет одну из самых агрессивных систем защиты среди всех социальных сетей и job boards.

Особенности защиты LinkedIn:

  • Обязательная авторизация: Большинство данных доступны только авторизованным пользователям
  • Поведенческий анализ: LinkedIn анализирует паттерны действий: скорость скроллинга, движения мыши, время на странице
  • Блокировка аккаунтов: При подозрительной активности блокируется не только IP, но и сам аккаунт
  • Ограничения на просмотры профилей: Бесплатные аккаунты могут просматривать ограниченное количество профилей в месяц
  • Обязательное выполнение JavaScript: Без headless-браузера парсинг невозможен

Стратегия парсинга LinkedIn:

  1. Используйте мобильные прокси — они дают самый низкий риск блокировки. Один мобильный IP можно использовать для 100-200 просмотров профилей в день.
  2. Headless-браузер обязателен — используйте Puppeteer или Playwright с настройкой реального fingerprint браузера (разрешение экрана, WebGL, Canvas).
  3. Медленная скорость парсинга — не более 20-30 профилей в час с одного аккаунта. Добавляйте задержки 10-20 секунд между просмотрами.
  4. Имитация реального поведения — скроллинг страницы, случайные клики, переходы между разделами профиля.
  5. Прогрев аккаунтов — новые аккаунты LinkedIn нельзя сразу использовать для парсинга. Нужно 1-2 недели имитировать активность обычного пользователя.
  6. Ротация аккаунтов — используйте несколько аккаунтов с разными прокси, чтобы распределить нагрузку.

Парсинг LinkedIn — это самая сложная задача среди всех job boards. Если вам нужны данные с этой платформы, рассмотрите использование официального Sales Navigator API или сторонних сервисов, которые предоставляют данные легально.

Зарубежные job boards: Indeed, Glassdoor, Monster

Зарубежные площадки обычно имеют более жёсткую защиту, чем российские сайты (кроме hh.ru). Основные особенности:

  • Indeed — использует Cloudflare с JavaScript-проверками. Нужен headless-браузер и резидентные/мобильные прокси из страны, вакансии которой вы парсите.
  • Glassdoor — требует авторизацию для просмотра большинства данных. Активно блокирует дата-центровые IP. Используйте резидентные прокси и медленную скорость парсинга (задержка 8-12 секунд).
  • Monster — имеет API для партнёров, но для парсинга HTML нужны резидентные прокси с географической привязкой к нужной стране.

Для всех зарубежных платформ критически важна географическая привязка прокси. Если вы парсите вакансии в США, используйте американские резидентные IP. Запросы с IP из других стран могут вызвать подозрение и привести к блокировке.

Настройка ротации IP и задержек между запросами

Правильная настройка ротации прокси — это ключ к стабильному парсингу без блокировок. Разберём две основные стратегии: ротация на каждый запрос и ротация по времени.

Ротация на каждый запрос (Rotating Proxies)

При этом подходе каждый HTTP-запрос идёт с нового IP-адреса. Это максимально безопасный метод, но он имеет ограничения:

Преимущества:

  • Невозможно отследить активность одного IP
  • Можно делать больше запросов в единицу времени
  • Не нужно отслеживать лимиты на каждый IP

Недостатки:

  • Невозможно сохранить сессию (cookies теряются при смене IP)
  • Не подходит для парсинга с авторизацией
  • Некоторые сайты блокируют запросы, если IP меняется слишком часто

Ротация на каждый запрос подходит для парсинга публичных страниц hh.ru и Superjob без авторизации. Настраивается через параметр прокси-провайдера (обычно это специальный endpoint с автоматической ротацией).

Ротация по времени (Sticky Sessions)

При этом подходе один IP используется в течение определённого времени (5-30 минут), после чего происходит автоматическая смена. Это оптимальный вариант для большинства задач парсинга job boards.

Рекомендуемые интервалы ротации:

Сайт Интервал ротации Макс. запросов на IP Задержка между запросами
hh.ru 5-10 минут 60-80 4-8 секунд
Superjob 10-15 минут 50-70 3-5 секунд
LinkedIn 30-60 минут 20-40 10-20 секунд
Indeed 10-20 минут 40-60 5-10 секунд
Glassdoor 15-30 минут 30-50 8-12 секунд

Настройка случайных задержек

Фиксированная задержка между запросами (например, ровно 5 секунд) выглядит подозрительно для систем защиты. Реальный пользователь не может действовать с такой точностью. Всегда используйте случайные задержки в диапазоне.

Примеры реализации случайных задержек:

// Python
import time
import random

# Задержка от 4 до 8 секунд
delay = random.uniform(4, 8)
time.sleep(delay)

# Более сложная логика: иногда делаем длинную паузу
if random.random() < 0.1:  # 10% вероятность
    time.sleep(random.uniform(15, 30))  # Имитация отвлечения пользователя
else:
    time.sleep(random.uniform(4, 8))
// JavaScript / Node.js
const sleep = (min, max) => {
  const delay = Math.random() * (max - min) + min;
  return new Promise(resolve => setTimeout(resolve, delay * 1000));
};

// Использование
await sleep(4, 8);  // Задержка 4-8 секунд

// С вероятностью длинной паузы
if (Math.random() < 0.1) {
  await sleep(15, 30);  // 10% вероятность длинной паузы
} else {
  await sleep(4, 8);
}

Добавление случайных длинных пауз (15-30 секунд) с вероятностью 5-10% делает поведение парсера ещё более похожим на реального пользователя, который может отвлечься на телефонный звонок или другую задачу.

Обработка капчи и других блокировок

Даже при правильной настройке прокси и задержек вы можете столкнуться с капчей или другими видами блокировок. Разберём, как правильно реагировать на эти ситуации.

Типы блокировок job boards

1. HTTP 429 Too Many Requests — самый частый тип блокировки. Сайт явно сообщает, что вы превысили лимит запросов. Обычно в заголовке ответа есть Retry-After, который указывает, через сколько секунд можно повторить запрос.

Как обрабатывать: Немедленно сменить прокси и добавить текущий IP в чёрный список на время, указанное в Retry-After (обычно 1-6 часов). Если Retry-After отсутствует, добавьте IP в чёрный список на 2 часа.

2. HTTP 403 Forbidden — IP заблокирован на уровне сервера. Это более серьёзная блокировка, которая может длиться от нескольких часов до суток.

Как обрабатывать: Сменить прокси и добавить IP в долгосрочный чёрный список (24 часа). Проанализировать логи: возможно, вы слишком агрессивно парсите или используете дата-центровые IP там, где нужны резидентные.

3. Капча (CAPTCHA) — сайт показывает проверку "я не робот". Это означает, что ваше поведение показалось подозрительным, но IP ещё не заблокирован полностью.

Как обрабатывать: Есть три варианта:

  • Смена прокси — самый простой способ. Текущий IP добавляется в чёрный список на 6-12 часов.
  • Автоматическое решение капчи — использование сервисов типа 2Captcha, Anti-Captcha, CapSolver. Они стоят $1-3 за 1000 решений.
  • Ручное решение — если парсинг некритичен по времени, можно отправлять капчу на ручное решение оператору.

4. Cloudflare Challenge — JavaScript-проверка, которая требует выполнения кода в браузере. Обычная HTTP-библиотека не пройдёт эту проверку.

Как обрабатывать: Использовать headless-браузер (Puppeteer, Playwright, Selenium) с настройкой реального fingerprint. Библиотеки типа puppeteer-extra-plugin-stealth помогают обойти детекцию headless-режима.

Интеграция сервисов решения капчи

Если вы решили автоматически решать капчу, вот пример интеграции с популярным сервисом 2Captcha:

// Python с использованием библиотеки 2captcha-python
from twocaptcha import TwoCaptcha
import requests

solver = TwoCaptcha('YOUR_API_KEY')

try:
    # Решение reCAPTCHA v2
    result = solver.recaptcha(
        sitekey='6Le-wvkSAAAAAPBMRTvw0Q4Muexq9bi0DJwx_mJ-',
        url='https://hh.ru/search/vacancy',
        proxy={
            'type': 'HTTPS',
            'uri': 'login:password@ip:port'
        }
    )
    
    # Получаем токен решения
    captcha_token = result['code']
    
    # Отправляем запрос с токеном
    response = requests.post(
        'https://hh.ru/search/vacancy',
        data={
            'g-recaptcha-response': captcha_token,
            # другие параметры формы
        },
        proxies={
            'http': 'http://login:password@ip:port',
            'https': 'http://login:password@ip:port'
        }
    )
    
except Exception as e:
    print(f'Ошибка решения капчи: {e}')

Решение одной капчи занимает 10-30 секунд и стоит около $0.001-0.003. Для масштабного парсинга это может быть дорого, поэтому лучше настроить парсинг так, чтобы капча появлялась как можно реже.

Система мониторинга и алертов

Для стабильной работы парсера важно настроить мониторинг блокировок и автоматические алерты:

Что отслеживать:

  • Процент успешных запросов — если падает ниже 90%, нужно проверить прокси и настройки
  • Количество капч в час — если больше 5-10, вы парсите слишком агрессивно
  • Средняя скорость ответа прокси — если резко выросла, возможно, прокси перегружены
  • Количество 429/403 ошибок — индикатор качества прокси и правильности настроек
  • Список заблокированных IP — если один и тот же IP блокируется постоянно, исключите его из пула

Настройте отправку уведомлений (Telegram, email, Slack), если процент успешных запросов падает ниже порогового значения. Это позволит быстро реагировать на проблемы и не терять время парсинга.

Настройка прокси в популярных инструментах парсинга

Разберём, как настроить прокси в самых популярных инструментах для парсинга job boards: Python (requests, Scrapy), Node.js (axios, Puppeteer) и готовых решениях.

Python: requests и Scrapy

Python — самый популярный язык для парсинга благодаря библиотекам requests, BeautifulSoup и Scrapy.

Пример с библиотекой requests:

import requests
import random
import time

# Список прокси (получите от провайдера)
PROXIES = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# Список User-Agent для ротации
USER_AGENTS = [
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36',
    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36'
]

def parse_vacancy(url):
    proxy = random.choice(PROXIES)
    user_agent = random.choice(USER_AGENTS)
    
    headers = {
        'User-Agent': user_agent,
        'Accept': 'text/html,application/xhtml+xml',
        'Accept-Language': 'ru-RU,ru;q=0.9,en;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Connection': 'keep-alive'
    }
    
    proxies = {
        'http': proxy,
        'https': proxy
    }
    
    try:
        response = requests.get(
            url,
            headers=headers,
            proxies=proxies,
            timeout=30
        )
        
        if response.status_code == 200:
            return response.text
        elif response.status_code == 429:
            print(f'Rate limit для {proxy}, меняем прокси')
            # Удаляем прокси из списка временно
            return None
        else:
            print(f'Ошибка {response.status_code}')
            return None
            
    except Exception as e:
        print(f'Ошибка запроса: {e}')
        return None

# Использование
for i in range(100):
    html = parse_vacancy('https://hh.ru/vacancy/123456')
    if html:
        # Обработка данных
        pass
    
    # Случайная задержка
    time.sleep(random.uniform(4, 8))

Пример настройки Scrapy:

# settings.py

# Включаем поддержку прокси
DOWNLOADER_MIDDLEWARES = {
    'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 110,
    'scrapy_rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
    'scrapy_rotating_proxies.middlewares.BanDetectionMiddleware': 620,
}

# Список прокси
ROTATING_PROXY_LIST = [
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080',
    'http://user:[email protected]:8080'
]

# Автоматическое определение бана
ROTATING_PROXY_BAN_POLICY = 'scrapy_rotating_proxies.policy.BanDetectionPolicy'

# Задержка между запросами
DOWNLOAD_DELAY = 5
RANDOMIZE_DOWNLOAD_DELAY = True  # Случайная задержка ±50%

# Ротация User-Agent
DOWNLOADER_MIDDLEWARES.update({
    'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': None,
    'scrapy_user_agents.middlewares.RandomUserAgentMiddleware': 400,
})

# Максимум одновременных запросов
CONCURRENT_REQUESTS = 4
CONCURRENT_REQUESTS_PER_DOMAIN = 1

Node.js: Puppeteer с прокси

Для парсинга сайтов с JavaScript (LinkedIn, Indeed) нужен headless-браузер. Puppeteer — самое популярное решение для Node.js.

const puppeteer = require('puppeteer-extra');
const StealthPlugin = require('puppeteer-extra-plugin-stealth');

// Плагин для обхода детекции headless-браузера
puppeteer.use(StealthPlugin());

async function parseWithProxy() {
  const proxy = 'http://user:[email protected]:8080';
  
  const browser = await puppeteer.launch({
    headless: true,
    args: [
      `--proxy-server=${proxy}`,
      '--no-sandbox',
      '--disable-setuid-sandbox',
      '--disable-dev-shm-usage',
      '--disable-blink-features=AutomationControlled'
    ]
  });
  
  const page = await browser.newPage();
  
  // Устанавливаем реальный User-Agent
  await page.setUserAgent(
    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
  );
  
  // Устанавлива