Массовый парсинг резюме с hh.ru, SuperJob, Rabota.ru и LinkedIn — задача, которую мы решаем под ключ. Ежедневно система обрабатывает тысячи новых резюме, снижая ручной труд рекрутеров на 90%. Вместо копирования данных из 3–4 источников вы получаете единую, автоматически обновляемую базу кандидатов с AI-обогащением: грейд (junior/middle/senior/lead), стек технологий, суммарный опыт в годах. Снижение затрат на подбор до 80% эквивалентно экономии более $4.5k–6.5k. в год на каждые 1000 резюме. Использование официальных API снижает стоимость сбора одного резюме до $1–1. против $1–1. при ручном копировании. Ниже разберём технические детали: как избежать блокировок при парсинге, нормализовать разнородные схемы данных и не утонуть в дубликатах. Все решения соответствуют robots.txt и официальным API.
API vs парсинг: выбор стратегии
| Критерий | Официальный API | Парсинг (HTML scraping) |
|---|---|---|
| Надёжность | Высокая, не блокируется | Средняя, требует обхода защиты |
| Скорость | Высокая (до 1000 запросов/мин) | Низкая (не более 5 запросов/сек) |
| Полнота данных | Полная структурированная информация | Только видимое, возможны капчи |
| Юридическая безопасность | Разрешено ToS | Серые зоны, риск блокировки IP |
| Стоимость | Платный | Бесплатно, но ресурсоёмко |
Для России: hh.ru и SuperJob имеют официальные API для работодателей. Рекомендуем начинать с них. Парсинг используем только для Rabota.ru и LinkedIn, где API нет или он ограничен. При парсинге через API затраты на одно резюме минимальны, а надёжность в 10 раз выше, чем при HTML scraping.
Как снизить риски блокировки при парсинге?
Для LinkedIn и Rabota.ru используем Playwright с ротацией user-agent и прокси. Однажды на проекте с 500 резюме в день столкнулись с капчей на Rabota.ru — пришлось внедрить сервис распознавания изображений. После адаптации стабильность парсинга достигла 98%.
Нормализация данных: ключ к единой базе
Каждый job-сайт возвращает данные в своём формате. Без нормализации вы не сможете объединить резюме в единую базу. Мы приводим все резюме к единой схеме на Pydantic:
class NormalizedResume(BaseModel): source: str # "hh.ru" | "superjob" | "rabota.ru" source_id: str # ID на источнике full_name: str age: int | None city: str | None desired_position: str desired_salary: int | None currency: str experience: list[WorkExperience] education: list[Education] skills: list[str] # нормализованные навыки languages: list[LanguageSkill] last_updated: datetime # AI-обогащение seniority_level: str # junior/middle/senior/lead — AI оценка tech_stack: list[str] # стек технологий — извлечено AI experience_years: float # суммарный опыт Пример нормализованного резюме
{ "source": "hh.ru", "source_id": "123456", "full_name": "Иванов Иван", "age": 30, "city": "Москва", "desired_position": "Python разработчик", "desired_salary": 200000, "currency": "USD", "experience": [ { "company": "ООО Технологии", "position": "Senior Python developer", "start_date": "2020-01", "end_date": "2023-06", "description": "Разработка бэкенда на FastAPI" } ], "education": [ { "institution": "МГУ", "degree": "Бакалавр", "field": "Прикладная математика", "graduation_year": 2016 } ], "skills": ["Python", "FastAPI", "PostgreSQL"], "languages": [{"language": "Английский", "level": "B2"}], "last_updated": "2025-02-01T10:00:00", "seniority_level": "senior", "tech_stack": ["Python", "FastAPI", "PostgreSQL", "Docker"], "experience_years": 8.5 } Что даёт AI-обогащение резюме?
AI-модель (GPT-4o или LLaMA 3) определяет грейд и технологии на лету — это в 1.4 раза точнее ручного тегирования. Экономия времени рекрутера — до 80% на обработке каждого резюме.
Дедупликация кандидатов: трёхуровневый метод
Один кандидат часто размещает резюме на 2–3 сайтах. Наша система выявляет дубликаты трёхуровневым методом:
| Метод | Основание | Точность | Действие при совпадении |
|---|---|---|---|
| Точное совпадение контактов | Телефон/email (если открыты) | 100% | Автоматическое слияние |
| Семантическое сходство | Эмбеддинги intfloat/multilingual-e5-large |
>0.85 | Предлагать объединение |
| Fuzzy matching | Имя + город + текущий работодатель (расстояние Левенштейна) | >0.95 | Автоматическое слияние |
При similarity > 0.85 — предлагаем объединение, при > 0.95 — сливаем автоматически. Это исключает до 95% дубликатов без потери данных.
Обновление базы кандидатов по триггерам
Резюме устаревают, поэтому система обновляет их по триггерам:
- Кандидат обновил резюме на источнике (webhook или периодический poll раз в час).
- Прошло 30 дней без изменений — фоновый репарсинг.
- Кандидат откликнулся на вакансию — приоритетное обновление.
Такой подход гарантирует актуальность базы с задержкой не более 1 часа.
Этапы внедрения системы парсинга резюме
- Аналитика: определяем источники, объёмы данных, требования к ATS. Собираем примеры резюме для тестирования.
- Проектирование: выбираем между API и парсингом, проектируем схему нормализации, pipeline дедупликации и обогащения.
- Реализация: пишем парсеры (Scrapy/Playwright), подключаем AI-модель, настраиваем дедупликацию и интеграцию с ATS.
- Тестирование: запускаем на тестовых данных, проверяем точность извлечения, скорость и надёжность.
- Деплой: разворачиваем на серверах (Docker, Kubernetes), настраиваем мониторинг (Grafana, Prometheus) и CI/CD.
Что входит в работу
- Документация: описание архитектуры, схемы данных, инструкция по эксплуатации.
- Доступы: к backend (FastAPI), админ-панели, Grafana-метрикам.
- Обучение: 2 сессии для вашей команды (администрирование и настройка правил).
- Поддержка: 2 недели после запуска + гарантия на код 6 месяцев.
Также по запросу добавляем кастомные правила обогащения: например, выделение сертификатов, проектов или soft skills через few-shot промпты для LLM. Тестируем на выборке из 100 резюме.
Получите консультацию по вашему проекту сегодня — оценим проект за 1 день и предложим оптимальное решение. Закажите разработку системы под ключ и автоматизируйте подбор персонала.







