Архив рубрики ~Лента новостей~

Парсинг HH.ru: от /vacancies до асинхронных очередей и боли с ConversationHandler’ами

Парсинг HH.ru: от /vacancies до асинхронных очередей и боли с ConversationHandler’ами

Привет, Хабр.

Думаю, у каждого, кто искал работу, есть этот «любимый» запрос на hh. Вбиваешь «Python Developer», ставишь фильтр «нет опыта», а тебе вываливается 500 вакансий «Senior Analyst», где в требованиях «базовое знание SQL, Python будет плюсом».

Ручной разбор этой каши убивает время и мотивацию. Мой друг Роман (он IT-рекрутер и карьерный консультант) постоянно рассказывает, как кандидаты выгорают еще до первого собеса именно на этом этапе.

Я решил, что хватит. Пора автоматизировать рутину. Казалось бы, 30-минутная задача: дернул API, отфильтровал, откликнулся. Как же я ошибался. Сегодня расскажу, на какие грабли наступил, пока пилил «Аврору» — свой инструмент для автоматизации этого ада.

Грабли №1: «Умный» поиск — это не text=…

Наивный старт: эндпоинт /vacancies с параметром text=»Python». Сразу нет.

Окей, усложняем. («QA» OR «Тестировщик») NOT («Junior» OR «Стажер»). Уже лучше, но составлять руками — боль.

Решение (частичное): Эндпоинт /resumes/{resume_id}/similar_vacancies. HH сам подбирает похожее. Чище, чем ручной поиск.

Новая проблема: А если резюме «на коленке»? Или человек хочет сменить профиль? similar_vacancies не сработает. Роман подтвердил: таких случаев полно, и простой поиск по резюме их отсекает.

Пришлось городить гибрид:

  1. Сначала similar_vacancies + кастомный query пользователя как доп. фильтр.

  2. Когда там все кончается, бесшовно переключаемся на /vacancies со всеми фильтрами и кастомным запросом.

В коде (hh_api_client.py) это async def search_and_apply_generator, который меняет search_stage с ‘similar’ на ‘general’. Это позволяет Авроре копать глубже, когда «идеальные» совпадения закончились.

Грабли №2: Настройка диалога — это конечный автомат

Самое сложное — заставить пользователя дать нужные данные в Telegram. Просто спросить «какой у вас график?» нельзя. Выбор «Офис/Гибрид» требует города, запрещает «Всю Россию», и так далее. Роман тоже говорил, что кандидаты часто путаются в фильтрах, поэтому интерфейс должен быть пуленепробиваемым.

Это — ад. Это — ConversationHandler из python-telegram-bot во всей красе. Машина состояний, где каждый CallbackQueryHandler решает, куда вести диалог дальше, и ловит ошибки через fallbacks.

На отладку этого ушло больше времени, чем на сам поиск.

Грабли №3: Отклик «замораживает» бота

Окей. Поиск есть, настройки есть. Пользователь жмет «Старт». Бот находит 100 вакансий. И начинает откликаться: API Gemini (LLM) за письмом (5-10 сек) -> API HH (/negotiations) с письмом (1-2 сек) -> Повторить 100 раз.

И все это время бот висит. 5 пользователей — сервис можно выключать.

Решение: PostgreSQL как очередь задач. Никаких asyncio.Queue в памяти.

  1. Команды просто кладут (user_id, vacancy_id, resume_id) в таблицу application_queue со статусом pending.

  2. Фоновый asyncio.Task (application_worker) пытается забрать задачу из БД.

  3. Как сделать, чтобы 5 инстансов бота не схватили одну задачу? FOR UPDATE SKIP LOCKED.

Этот SQL (database.py) — сердце воркера:

SQL

— database.py (функция get_next_pending_job) UPDATE application_queue SET status = ‘processing’ WHERE id = (SELECT id FROM application_queue WHERE status = ‘pending’ ORDER BY created_at LIMIT 1 FOR UPDATE SKIP LOCKED) RETURNING *;

Транзакция атомарно находит, блокирует, а если заблокировано — пропускает и ищет следующую. Потом меняет статус и возвращает. Воркер спокойно идет в Gemini, в HH API, и только потом (в finally) удаляет job или ставит error. Бот в Telegram при этом «летает».

Зачем все это?

Вся эта сложность — не самоцель. Она нужна, чтобы Аврора могла:

  • Находить вакансии точнее, чем стандартный поиск hh.ru (гибридный подход).

  • Не бесить пользователя сложными настройками (машина состояний).

  • Работать стабильно и быстро для сотен юзеров одновременно (асинхронная очередь).

  • Писать релевантные письма, потому что логику для LLM мы строили как раз на инсайтах Романа о том, что реально цепляет рекрутеров (это тема для отдельной статьи!).

То, что начиналось как скрипт на 50 строк, превратилось в сервис, который пытается немного починить сломанный процесс найма.

Прямо сейчас мы собрали первую фокус-группу (QA, DevOps/SRE, Senior Frontend, QA lead), которая тестирует Аврору. Собираем фидбэк, чтобы сделать ее еще лучше к релизу 7 ноября (да, мы планируем дать доступ первым 100 смельчакам).

Что думаете вы, Хабр? Автоматизация откликов — это необходимый инструмент для выживания на рынке, или мы просто выводим гонку вооружений на новый уровень?

Если сталкивались с похожими проблемами при работе с API HH или просто есть мысли на этот счет — буду рад обсудить в комментариях. Или залетайте в наш небольшой Telegram-канал, где мы делимся прогрессом и спорим о будущем поиска работы: https://t.me/AuroraCareer

Спасибо.

Источник: habr.com

Оцените материал:

Поделиться
Понравилась статья? Расскажите другим
ВКонтакте
Читайте также
Новости робототехники Почему искусственный интеллект является безопасностью рабочей площадки Новости робототехники Сегодня ночью украинские БЭКи атаковали район Геленджика, рядом с Новороссийском Архив рубрики ~Обо всем~ Лидеры в области качества предостерегают от оцифровки неэффективных процессов. Архив рубрики ~Обо всем~ Огромный декагон сформировался вокруг южного полюса Сатурна. Атмосферная волна появилась недавно Новости робототехники Датчики давления могут повысить точность захвата роботов. Новости робототехники Компания Poseidon Aerospace привлекла 60 миллионов долларов перед первым испытательным полетом без пилота. Архив рубрики ~Коротко из Telegram~ Телевизоры LG могут следить за тем, что происходит у вас… Архив рубрики ~Коротко из Telegram~ Крошечная open‑source‑модель MiniCPM5-2B обошла конкурентов до 4B параметров ⚡ Канал… Архив рубрики ~Коротко из Telegram~ Бесплатная обработка голоса в аудио Если записываешь голос на встроенный… Архив рубрики ~Обо всем~ Конец универсального диагноза болезни Паркинсона: почему 2026 год станет годом, когда неврология перейдет на высокоточное исследование. Архив рубрики ~Коротко из Telegram~ Дата-центр Stargate в Абилине назвали «местом рождения AGI» Глава Crusoe… Архив рубрики ~Коротко из Telegram~ Небольшой дайджест — коротко о найденных новостях 1️⃣ Российский облачный… Архив рубрики ~Коротко из Telegram~ Офлайн-ИИ на вашем телефоне В новых айфонах и топовых Android-флагманах… Архив рубрики ~Коротко из Telegram~ Почему видео от нейросети выглядит «мёртво» — и как это… Новости робототехники Почему искусственный интеллект является безопасностью рабочей площадки Новости робототехники Сегодня ночью украинские БЭКи атаковали район Геленджика, рядом с Новороссийском Архив рубрики ~Обо всем~ Лидеры в области качества предостерегают от оцифровки неэффективных процессов. Архив рубрики ~Обо всем~ Огромный декагон сформировался вокруг южного полюса Сатурна. Атмосферная волна появилась недавно Новости робототехники Датчики давления могут повысить точность захвата роботов. Новости робототехники Компания Poseidon Aerospace привлекла 60 миллионов долларов перед первым испытательным полетом без пилота. Архив рубрики ~Коротко из Telegram~ Телевизоры LG могут следить за тем, что происходит у вас… Архив рубрики ~Коротко из Telegram~ Крошечная open‑source‑модель MiniCPM5-2B обошла конкурентов до 4B параметров ⚡ Канал… Архив рубрики ~Коротко из Telegram~ Бесплатная обработка голоса в аудио Если записываешь голос на встроенный… Архив рубрики ~Обо всем~ Конец универсального диагноза болезни Паркинсона: почему 2026 год станет годом, когда неврология перейдет на высокоточное исследование. Архив рубрики ~Коротко из Telegram~ Дата-центр Stargate в Абилине назвали «местом рождения AGI» Глава Crusoe… Архив рубрики ~Коротко из Telegram~ Небольшой дайджест — коротко о найденных новостях 1️⃣ Российский облачный… Архив рубрики ~Коротко из Telegram~ Офлайн-ИИ на вашем телефоне В новых айфонах и топовых Android-флагманах… Архив рубрики ~Коротко из Telegram~ Почему видео от нейросети выглядит «мёртво» — и как это…