Масовий парсинг резюме з 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 день і запропонуємо оптимальне рішення. Замовте розробку системи під ключ і автоматизуйте підбір персоналу.







