Последние два года я не выходил на рынок труда. Но в какой-то момент стало интересно, что изменилось и есть ли интересные предложения для подработки.
Думаю, не секрет, что искать работу стало сложнее. Видимо рынок изменился — компаний стало больше, а качественных вакансий меньше. За первую неделю я отправил несколько откликов через 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, но примерно каждый пятый интересный вариант приходит из других источников. Раньше я бы это просто пропустил.
Если у вас похожая задача — код открытый, источники легко добавляются. Буду рад, если окажется полезным.
→ GitHub: https://github.com/Falcongram/job-scraper
