Парсинг 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, после чего смена прокси
Пример безопасной последовательности действий:
- Подключаетесь к резидентному прокси с IP из нужного региона (например, Москва)
- Делаете первый запрос на главную страницу hh.ru, получаете и сохраняете cookies
- Ждёте 5-7 секунд (имитация чтения страницы)
- Делаете запрос на страницу поиска вакансий с нужными фильтрами
- Парсите список вакансий (обычно 20-50 на странице)
- Для каждой вакансии делаете запрос на детальную страницу с задержкой 4-6 секунд
- После 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:
- Используйте мобильные прокси — они дают самый низкий риск блокировки. Один мобильный IP можно использовать для 100-200 просмотров профилей в день.
- Headless-браузер обязателен — используйте Puppeteer или Playwright с настройкой реального fingerprint браузера (разрешение экрана, WebGL, Canvas).
- Медленная скорость парсинга — не более 20-30 профилей в час с одного аккаунта. Добавляйте задержки 10-20 секунд между просмотрами.
- Имитация реального поведения — скроллинг страницы, случайные клики, переходы между разделами профиля.
- Прогрев аккаунтов — новые аккаунты LinkedIn нельзя сразу использовать для парсинга. Нужно 1-2 недели имитировать активность обычного пользователя.
- Ротация аккаунтов — используйте несколько аккаунтов с разными прокси, чтобы распределить нагрузку.
Парсинг 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 секунд |
| 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'
);
// Устанавлива