Последние два года я не выходил на рынок труда. Но в какой-то момент стало интересно, что изменилось и есть ли интересные предложения для подработки.
Думаю, не секрет, что искать работу стало сложнее. Видимо рынок изменился — компаний стало больше, а качественных вакансий меньше. За первую неделю я отправил несколько откликов через HH и не получил ни одного ответа. При этом работодатели продолжали сами писать мне по открытому резюме.
Затем обнаружилась другая проблема: интересные вакансии оказались разбросаны по разным площадкам, а половина находок дублировалась. Через несколько дней я понял, что трачу на этот ритуал около сорока минут каждое утро. В какой-то момент стало очевидно: это уже не поиск работы, а повторяющаяся задача. А повторяющиеся задачи стоит автоматизировать.
За последние годы я прошел больше сотни собеседований в разных компаниях и сменил несколько мест. Поэтому очередной поиск работы воспринимался уже не как стресс, а как небольшая инженерная задача. Решить ее я решил привычным способом — написать инструмент под себя.
Одной площадки больше нет
Несколько лет назад все было довольно просто: открыл hh, выставил фильтры и получил почти полную картину рынка, но сейчас это уже не работает. Часть компаний публикует вакансии только на специализированных площадках. Кто-то ограничивается Telegram-каналами. Крупные работодатели нередко сначала размещают вакансии на собственных карьерных страницах и лишь потом — на агрегаторах. Есть и вакансии, которые вообще не доходят до публичных площадок: по ним рекрутеры сами ищут кандидатов. В результате поиск превращается в обход нескольких источников. И проблема даже не в количестве сайтов, а в том, что между ними много дублей, а интересные вакансии легко пропустить. На этом этапе идея написать небольшой агрегатор уже выглядела проще, чем продолжать каждый день вручную обходить одни и те же источники.
Когда я подключил все источники к своему агрегатору, стало видно это особенно хорошо. Большая часть вакансий действительно приходила с HH, но заметная доля интересных предложений находилась в других местах и в общей выдаче просто терялась.
Рынок сильно фрагментировался (пример выдачи за 7 дней)
|
Источник |
Найдено вакансий |
Уникальных |
|
HH |
445 |
129 |
|
career.habr |
127 |
22 |
|
trudvsem |
11 |
2 |
|
superjob |
3 |
3 (нет удаленки) |
|
GeekJob |
83 |
4 |
|
Telegram |
28 |
14 |
Готовые инструменты есть. Почему я всё равно написал своё
Первая мысль была очевидной: наверняка кто-то уже решил эту проблему.
Агрегаторов вакансий оказалось немало. Некоторые выглядели вполне живыми, но быстро упирались в ограничения бесплатного тарифа. Другие собирали вакансии из небольшого числа источников или заметно уступали по IT-направлению. Были и сервисы, которые регулярно присылали новые подборки, но за несколько месяцев использования я так и не получил ни одного ответа на отправленные отклики. Возможно, дело было не в самих агрегаторах, а в работодателях, но для меня такой инструмент оказался бесполезным.В какой-то момент я понял, что проблема даже не в качестве конкретного сервиса. Мне хотелось полностью контролировать процесс: самому выбирать источники, самому определять правила фильтрации и понимать, почему именно эта вакансия попала в подборку.По сути, требования были довольно простыми: собрать свежие вакансии из нужных источников, убрать дубли, отфильтровать и отправить результат в Telegram.Ну и, конечно, было просто интересно попробовать собрать такой инструмент самому. Заодно проверить, насколько далеко сегодня можно зайти, используя AI не как собеседника, а как помощника в разработке.
Я не разработчик — но есть AI
Python я знаю на базовом уровне. Написать с нуля несколько скрейперов, организовать дедупликацию, хранение состояния и отправку уведомлений в Telegram самостоятельно я, скорее всего, смог бы. Но это заняло бы значительно больше времени.AI сильно изменил этот процесс.Вместо того чтобы писать программу целиком, я разбивал задачу на небольшие части. Сначала один источник. Потом фильтрация. Затем хранение уже просмотренных вакансий. После этого — Telegram-уведомления. Каждый следующий шаг строился поверх предыдущего.
Самое важное наблюдение оказалось неожиданно простым: AI хорошо пишет код, когда точно понимает задачу. Поэтому большую часть времени уходило не на генерацию кода, а на формулировку требований и проверку результата.Например, первые версии некоторых скрейперов вообще не работали — сайты отдавали совсем не ту структуру данных, которую ожидала модель. Приходилось уточнять требования, показывать реальные фрагменты HTML, менять подход. Но после нескольких итераций задача обычно решалась.
В итоге весь код действительно написал AI (claude code). Но архитектура, выбор источников, логика фильтрации и проверка результата оставались полностью на моей стороне.Вся первая рабочая версия инструмента появилась буквально за несколько часов. Для человека, который не занимается разработкой каждый день, это оказалось, пожалуй, достойным результатом.Далее я добавлял еще функционал и в процессе не обошлось без сюрпризов.
Один из самых неприятных оказался вовсе не в коде, а в формате данных. YAML спокойно принял конфиг с двумя одинаковыми ключами из разных блоков sources и молча отбросив первый блок:
sources: superjob: api_key: "..."# ... добавили ниже ...sources: # ← второй ключ с тем же именем hh: client_id: "..."
Приложение запускалось без ошибок, но один из источников перестал работать. На поиск причины ушло значительно больше времени, чем на само исправление.
Еще один факап при настройке: Для чтения Telegram-каналов изначально планировалось использовать Telethon (Python-библиотеку для Telegram MTProto API). А для этого требуется регистрация приложения в TG. Перепробовал разные, личные симки, по разному заполнял форму регистраци, но платформа мне так и не дала зарегистрировать приложение. Пришлось сделал по другому: у каждого публичного канала есть веб-версия (t.me/s/channel), которую Telegram отдаёт без авторизации первые несколько постов (чего хватало). Обычный HTML-парсинг этих страниц закрыл задачу полностью — никаких токенов, никаких телефонных номеров.
Как это работает под капотом
Архитектура простая — намеренно.Я не ставил цель сделать универсальный агрегатор вакансий. Хотелось получить простой инструмент, который можно быстро адаптировать под свои задачи.Поэтому архитектура получилась максимально прямолинейной.
Каждый источник — это отдельный небольшой скрейпер. Если завтра появится новый сайт или Telegram-канал, достаточно добавить еще один модуль, не трогая остальные.Дальше все найденные вакансии проходят через общую фильтрацию. Правило тоже максимально простое: в названии должно присутствовать хотя бы одно ключевое слово и отсутствовать стоп-слова. Я сознательно отказался от сложных алгоритмов и fuzzy matching — на практике обычной фильтрации оказалось вполне достаточно.
Следующая проблема — дубли. Одни и те же вакансии часто встречаются сразу на нескольких площадках, поэтому каждую найденную ссылку приложение сохраняет в SQLite. Если вакансия уже встречалась, повторно она не отправляется. Через 30 дней запись автоматически удаляется, чтобы актуальные вакансии могли снова попасть в подборку. Конфигурация тоже вынесена в YAML. Все, что может понадобиться изменить — ключевые слова, стоп-слова, глубина поиска, список источников — настраивается без изменения кода. Благодаря этому, данный агрегатор можно использовать не только для DevOps, но и практически любому другому it специалисту.
Каждый источник — отдельный модуль → общая фильтрация → дедупликация в SQLite → Telegram
В результате каждое утро в Telegram приходит уже готовая подборка свежих вакансий, сгруппированная по источникам (можно запускать по cron).
После подключения нескольких источников оказалось, что больше всего найденных вакансий приходят с HH, но в остальных источниках часто оказываются наиболее интересные варианты.
Что дальше
Инструмент работает и закрывает текущую задачу. Но нужно идти дальше.
Следующие логичные шаги:
-
Карьерные страницы самих компаний. У крупных IT-работодателей есть раздел «Вакансии» на собственном сайте, и там позиции появляются раньше, чем на любом агрегаторе. Это отдельный пласт источников, который пока не покрыт.
-
Slack и Discord IT-сообщества. Там тоже публикуют вакансии, особенно в нишевых каналах под конкретный стек.
Отдельный вопрос — интерфейс. Когда вакансий немного — Telegram удобен. Когда источников становится больше и поток растёт — читать дайджест в мессенджере неудобно. Нет фильтрации на лету, нет сортировки, нельзя быстро отметить, что уже смотрел. Веб-интерфейс здесь был бы уместнее.
Как итог: Инструмент работает и вместо сорока минут ручного обхода — одно сообщение в Telegram. Большинство вакансий я всё равно нахожу на HH, но примерно каждый пятый интересный вариант приходит из других источников. Раньше я бы это просто пропустил.
Если у вас похожая задача — код открытый, источники легко добавляются. Буду рад, если окажется полезным.
ссылка на оригинал статьи https://habr.com/ru/articles/1055472/