Вы тратите 30 минут каждый день на ручной поиск на cv.lv, ss.com, cvmarket.lv, NVA и других сайтах. Хватит. Я написал
Telegram-бота — vakances_bot.py — который автоматически проверяет все 6 основных латвийских сайтов вакансий, сопоставляет новые вакансии в Риге с вашим резюме и каждое утро присылает в Telegram только нужные вакансии.
В этой статье я разберу код, как он работает и почему бот для поиска работы — это то же самое, что делает рекрутер, но за €60, а не за 20% от зарплаты.
Это разбор реальной работающей системы, без маркетинга. Python-бот собирает вакансии в Латвии по расписанию, хранит в PostgreSQL и даёт простой Telegram-интерфейс. Одно нажатие — «откликнулся», «в избранное» или «собеседование». Ищете работу в Риге прямо сейчас? Смотрите /vakances. Строите для компании? Код внутри.
⚡ Вы получаете:
- Время: С 30 минут в день на 4 минуты — автоматически, каждое утро
- Инструмент: Telegram-бот (vakances_bot.py), который собирает вакансии с 6 сайтов Латвии
- Setup: Загрузите резюме, 60 секунд настройки, первые результаты за 5 минут
- Стоимость: €5–15/месяц хостинг или €60 индивидуальная версия для компании
- Сайты: cv.lv, ss.com, cvmarket.lv, liepajniekiem.lv, портал NVA, prakse.lv
Прежде чем перейти к коду, одно честное замечание. Этот бот — реальный проект, и цифры в статье (количество вакансий по категориям, зарплаты, распределение по городам) меняются каждый день: компании публикуют и закрывают объявления. Примерные цифры нужны здесь, чтобы показать общую картину латвийского рынка труда.
Что вы узнаете из этой статьи:
- Почему ручной поиск работы в Риге сам по себе превращается в работу на полставки
- Как vakances_bot.py собирает вакансии с 6 латвийских сайтов и держит базу в чистоте
- Как работает оценка соответствия резюме и вакансии — прозрачное совпадение ключевых слов, без чёрного ящика
- Все команды Telegram: от /upload_cv до /vakances и /export
- Что обзор рынка /vakances говорит о профессиях в Латвии
- Полный технологический стек, чтобы собрать свою версию с нуля
Почему стоит выбрать Telegram-бота для поиска работы?
- Один чат покрывает cv.lv, ss.com, cvmarket, NVA и prakse.lv — без прыжков по вкладкам
- Каждая вакансия оценивается по вашему резюме: вы видите совпадения, а не шум
- 6 списков статусов вместо таблиц: избранное, к отправке, отклики, собеседования…
- Фильтры по городу, зарплате и удалённой работе под вашу жизнь
- Работает на телефоне, в кармане, каждое утро в 9:00
Проблема: поиск работы в Риге превращается в работу на полставки
Давайте честно посмотрим, как выглядит поиск работы в Риге в 2026 году. В понедельник утром вы открываете ss.com, сразу переходите в свою категорию, пролистываете свежие объявления — возможно, одно цепляет взгляд, и вы откликаетесь. Затем открываете другой портал, просматриваете его и отправляете ещё пару резюме. На этом день можно закончить. Во вторник открываете третий сайт, потом четвёртый, а может, возвращаетесь к уже просмотренным. Через пару часов вы отправили ещё 3–10 резюме и пролистали больше сотни вакансий — и вы устали.
В среду приходят три отказа и три «мы вам перезвоним». Вы снова открываете порталы — и новые вакансии выглядят старыми, а старые — новыми. Вы точно знаете, что тратите время на страницы, которые уже видели. И всё же время от времени попадается предложение, которое вы каким-то образом пропустили. Весь этот хаос живёт у вас в голове.
А теперь неприятная арифметика. На шести основных порталах — cv.lv, ss.com, cvmarket.lv, государственном портале NVA, liepajniekiem.lv и prakse.lv — прямо сейчас открыто более 15 000 вакансий (15 548 на 18 августа 2026 года). Тщательный ручной обход всех шести занимает от 30 до 45 минут в день. За месяц это 10–15 часов чистой фильтрации: чтение, сравнение, попытки вспомнить, каким компаниям вы уже писали, и повторное чтение одной и той же вакансии, переопубликованной на другом сайте. Это уже не поиск работы. Это канцелярщина.
И самое обидное: лучшие вакансии — те, где зарплата действительно соответствует вашему опыту, — чаще всего вы и упускаете, потому что их опубликовали во вторник в 14:00, пока вы были на работе, а к вечеру среды там уже 40 откликов.
Альтернатива, которую я хочу показать: Telegram-бот для поиска работы, который делает всю проверку за вас. Он просыпается раньше вас, обходит все шесть сайтов, забирает каждую новую вакансию, оценивает её относительно вашего резюме и оставляет в чате аккуратную сводку. Вы просматриваете совпадения и пропускаете неинтересное — навсегда, чтобы больше никогда его не видеть. Всё интересное, отправленное и отклонённое автоматически отслеживается среди этих 15 000+ вакансий. Поиск, фильтры, режим «только категория», списки исключений — всё это в паре нажатий, а не в нескольких часах переключения вкладок.
Что такое vakances_bot.py? Знакомьтесь: Telegram-бот для поиска работы
vakances_bot.py — это Python-бот для Telegram, отдельный процесс от
административного бота, собирающего данные, но с той же базой PostgreSQL. Проще говоря,
это сторона соискателя системы по сбору вакансий. Сбор данных (шесть скрейперов
под каждый сайт плюс пайплайн) наполняет базу вакансиями, а бот vakances превращает эти
сырые данные в персонального ассистента по поиску работы прямо в Telegram.
Вот что делает бот, одним дыханием:
- Собирает 6 сайтов по расписанию — cv.lv, ss.com, cvmarket.lv, liepajniekiem.lv, cvvp.nva.gov.lv (государственный портал NVA) и prakse.lv (стажировки).
- Читает ваше резюме — PDF или DOCX. Извлекает текст, определяет категорию профессии и ключевые навыки.
- Сопоставляет каждую новую вакансию с вашим резюме — прозрачная оценка от 0 до 100 на основе совпадения ключевых слов и категории. Вы видите причину, а не загадочный процент.
- Ведёт ваш поиск — избранное, к отправке, отклики, собеседования, отказы: восемь списков, одно нажатие на каждый.
- Показывает рынок — /vakances выдаёт все активные вакансии, сгруппированные по профессиям с количеством, — сразу видно, где реально есть спрос.
- Фильтрует как рекрутер — город, минимальная зарплата, только удалённая работа, исключённые ключевые слова, минимальный балл совпадения.
Если вы работодатель или стартап — та же архитектура предлагается как услуга разработка индивидуального Telegram-бота от €60: сбор данных, сопоставление, уведомления — всё, что нужно вашему процессу.
Как это работает: от загрузки резюме до ежедневного списка совпадений
Шаг 1: загрузите резюме один раз
Отправьте /upload_cv и прикрепите резюме в формате PDF или DOCX. Бот скачает файл,
извлечёт текст с помощью pdfplumber (PDF) или python-docx (Word)
и сохранит ваш профиль в базе. Если PDF окажется сканом без текстового слоя, бот прямо скажет
об этом и предложит текстовый экспорт — без тихих ошибок.
Шаг 2: автоматическая разметка
Как только текст извлечён, бот размечает резюме двумя вещами: категорией
(ваша профессия, например «Programmēšana» или «Finanses un grāmatvedība») и списком
ключевых слов (ваши навыки, например Python, Django, PostgreSQL). Та же
задача каждые 30 минут в фоне обрабатывает новые вакансии, так что каждая запись в базе
тоже получает категорию и ключевые слова. Для сопоставления нужно, чтобы были размечены
обе стороны. А если теги кажутся неточными, их можно поправить за пару команд:
/cv_list → Edit.
Шаг 3: мгновенное сопоставление + ежедневный повтор
В момент разметки бот оценивает резюме по всем ещё не просмотренным вакансиям и сообщает, сколько совпадений нашлось. Затем каждое утро в 09:00 по рижскому времени планировщик повторно прогоняет сопоставление по всему новому, а в 09:30 отправляет подборку всем, у кого включены уведомления:
📬 Ежедневная подборка:
«Ежедневная подборка: у вас 7 новых подходящих вакансий! Используйте /review, чтобы просмотреть их.»
Шаг 4: пайплайн следит за честностью базы
Сбор данных — это не просто «скачать страницу». Каждый запуск сравнивает то, что сайт
показывает сейчас, с тем, что уже есть в базе. Исчезнувшие с сайта вакансии помечаются
удалёнными; вернувшиеся — восстанавливаются. Каждый запуск записывает результаты по каждому
сайту в таблицу scrape_results, которую и показывает /status — так
сразу видно, успевает ли бот за каждым из шести порталов.
6 сайтов вакансий, которые проверяет бот — и почему важен каждый
Рынок труда Латвии размазан по нескольким порталам, и у каждого свой характер. Именно поэтому скрейпер по-настоящему полезен: вы получаете всё в одном месте, без дубликатов — база ключует вакансии по уникальной ссылке.
| Сайт | Что это | Активных вакансий | Доля |
|---|---|---|---|
| ss.com | Крупная доска объявлений с большим разделом «Darbi» | 6,412 | 41% |
| cvvp.nva.gov.lv | Публичный портал вакансий Государственного агентства занятости (NVA) | 4,442 | 29% |
| cv.lv | Крупнейший латвийский портал вакансий — здесь публикуется почти каждый работодатель | 2,228 | 14% |
| cvmarket.lv | Небольшой портал, ориентированный на конкретные отрасли | 2,017 | 13% |
| liepajniekiem.lv | Региональный сайт, самый сильный в Курземе и Лиепае | 274 | 2% |
| prakse.lv | Стажировки и студенческие позиции | 175 | 1% |
Пара наблюдений из реального экспорта. На один ss.com приходится 41% рынка,
и там полно объявлений, которые никогда не попадают на cv.lv, — поэтому скрейпить только
«главный» портал значит терять почти половину вакансий. Государственный портал NVA
(cvvp.nva.gov.lv) — второй по величине источник, 29%: он читается через собственный
JSON API сайта, и именно там живут объявления зарегистрированных и государственных работодателей.
cv.lv и cvmarket.lv вместе добавляют ещё 27%. На региональные и студенческие сайты приходится
лишь около 3% — но для человека в Лиепае или для студента эти 3% и есть весь смысл.
Скрейперы намеренно вежливые: случайные задержки 2–5 секунд между запросами, настоящий User-Agent браузера и жёсткий лимит страниц. NVA и prakse.lv собираются через их собственные публичные JSON-эндпоинты — те же запросы, что делает их сайт, — это быстрее и надёжнее, чем разбирать HTML.
Полный справочник команд: ваш пульт управления поиском работы
Вот полная карта команд бота vakances. Ежедневно все они не нужны — большинство живёт
в /review, /vakances и find, — но знание полного
набора превращает бота из игрушки в систему.
| Команда | Что делает |
|---|---|
| /start | Приветственное меню с главным сценарием: резюме, просмотр, vakances, поиск, недавние |
| /upload_cv | Загрузить резюме PDF/DOCX — оно сразу размечается и сопоставляется |
| /cv_list | Список ваших резюме: активировать, деактивировать, редактировать теги, скачать, удалить |
| /review | Выбрать категорию и просматривать совпадения по одной вакансии |
| find <запрос> | Поиск вакансий по названию на всех сайтах (например, find Python, find Rimi) |
| /recent | Последние 50 вакансий, опубликованных за последние 24 часа |
| /vakances | Все активные вакансии, сгруппированные по профессиям с количеством, — обзор рынка |
| /status | Статус сбора по сайтам: количество по порталам, итоги, время следующего сопоставления |
| /stats | Ваш личный процесс: избранное, к отправке, отклики, собеседования, отказы |
| /saved | Все сохранённые вакансии из всех списков |
| /pending | Ещё не просмотренные совпадения, сначала лучшие по баллу |
| /wishlist, /to_send, /applied, /to_interview, /rejected, /skipped | Доступ к каждому списку статусов в одно нажатие |
| /location | Задать один или несколько городов: /location Rīga, Liepāja, Jelgava |
| /locations | Топ-40 локаций с количеством вакансий — где работа есть на самом деле |
| /settings | Сортировка, уведомления, минимальный балл, показ просмотренных, только удалёнка, зарплата |
| /export | Скачать отслеживаемые вакансии в Excel, сгруппированные по резюме |
| /xls | Скачать всю базу вакансий и компаний в Excel |
| /log, /logs | Скачать сегодняшние или последние логи бота — удобно для отладки |
| /help | Полная инструкция по командам, всегда в одном сообщении |
И одна скрытая возможность: любое сообщение, начинающееся с show N (например,
show 25), открывает вакансии категории под этим номером из списка
/vakances. Бот подсказывает это после каждого обзора рынка — это самый быстрый
путь от вопроса «сколько вакансий?» к «покажите сами вакансии».
Как работает сопоставление: прозрачная оценка без чёрного ящика
Поговорим о сердце бота — и заодно развеем один миф. Многие «интеллектуальные подборы вакансий» продают загадочный алгоритм. Этот бот устроен наоборот: оценка — это короткая читаемая функция на Python, которую можно скопировать в notebook и проверить вручную.
Оценка вакансии состоит из двух частей:
- Совпадение ключевых слов (до 80 баллов) — сколько ключевых слов вакансии встречается в ключевых словах вашего резюме. Используется пересечение в стиле Jaccard: пересечение ÷ ключевые слова вакансии.
- Бонус за категорию (20 баллов) — если категория вашего резюме точно совпадает с категорией вакансии (без учёта регистра), вы получаете все 20.
- Запасной поиск по названию — если по ключевым словам ничего не нашлось, бот всё равно цепляет вакансии, в названии которых есть ваши ключевые слова (например, «Python» в «Python Developer»).
Разберём три реальных примера, чтобы оценка перестала быть абстракцией:
| Вакансия | Ключевые слова вакансии | Совпадение | Категория? | Балл |
|---|---|---|---|---|
| Backend Developer (Python) | python, django, postgresql, git | 3/4 → 75 | ✅ +20 | 95 |
| Full-stack JS Developer | javascript, react, node.js | 0/3 → 0 | ❌ +0 | 0 (игнорируется) |
| Python Data Analyst | python, sql, excel | 1/3 → 33 | ❌ +0 | 33 |
| Django Developer (поиск по названию) | ещё не размечено | название содержит «django» | — | 30 (запасной) |
Почему оценка именно такая, а не замысловатее? Три причины. Она быстрая — сопоставление сотен вакансий занимает секунды на чистом Python, без внешних вызовов. Она объяснимая — у каждого балла видимая причина, которую можно прочитать и проверить. И она управляемая — свой минимальный порог задаётся в /settings (30, 50, 70 или 90), так что режим «только сильные совпадения» включается одним нажатием.
/vakances: рынок труда Латвии одним взглядом (по профессиям)
Теперь самое интересное. /vakances превращает всю базу в отчёт о рынке: каждая
активная вакансия в Латвии, сгруппированная по профессиям и отсортированная по спросу.
Бот ведёт словарь из 41 категории профессий — от Pārdošana (продажи)
и Ražošana (производство) до Programmēšana (программирование), Medicīna, Loģistika
и Noliktavas (склады) — и каждая вакансия получает один или несколько таких тегов.
Вот как выглядит типичный вывод — реальные цифры из экспорта от 18 августа 2026 года, 15 548 вакансий. SQL под таблицей позволит получить актуальные данные в любой день:
| ID | Категория (профессия) | Вакансий | Доля рынка |
|---|---|---|---|
| 04 | Vadība un menedžments (управление) | 2,430 | 15.6% |
| 01 | Pārdošana (продажи) | 2,168 | 13.9% |
| 41 | Другое (без категории / смешанное) | 2,023 | 13.0% |
| 05 | Būvniecība (строительство) | 1,723 | 11.1% |
| 02 | Ražošana (производство) | 1,651 | 10.6% |
| 03 | Auto un serviss (авто и сервис) | 1,258 | 8.1% |
| 37 | Speciālisti (специалисты) | 1,003 | 6.5% |
| 11 | Virtuve un ēdināšana (кухня и общепит) | 903 | 5.8% |
| 07 | Māksla un dizains (искусство и дизайн) | 815 | 5.2% |
| 08 | Noliktavas (склады) | 778 | 5.0% |
| 22 | Izglītība (образование) | 718 | 4.6% |
| 26 | IT atbalsts un tīkli (IT-поддержка и сети) | 689 | 4.4% |
| — | + ещё 29 (Santehnika un remonts 490, Medmāsas un farmācija 117, Programmēšana 157, Mediji 62, Juridiskie 74, Tūrisms un valodas 31…) | остальное | остальное |
Примечание: одна вакансия может нести несколько категорий (например, «проектный менеджер в строительстве»), поэтому проценты в сумме дают больше 100% — они показывают, как часто профессия встречается во всей базе, а не строгое деление рынка.
Что это даёт на практике? Две вещи. Первая — где много вакансий: управление (2 430), продажи (2 168), строительство (1 723) и производство (1 651) доминируют на рынке. Если вы работаете в одной из этих сфер, предложений сейчас много. Вторая — где конкуренция ниже: ниша вроде Programmēšana (157 размеченных вакансий) или Medmāsas un farmācija (117) тонкая по сравнению с 2 430-сильной стопкой менеджмента — иногда самый дружелюбный рынок тот, где объявлений меньше, а не больше. А дальше, когда в распарсенной базе накопится достаточно данных, может появиться и /trends: какие профессии растут, где есть спрос, а какие потихоньку умирают.
Введите
show 25в чате, чтобы сразу открыть категорию программирования — бот превращает любой ID категории из /vakances в обозреваемый список вакансий.
/locations: где находятся вакансии (и почему «Riga» = «Rīga»)
/vakances показывает, какие профессии нужны рынку;
/locations — где они находятся. Бот группирует каждую активную вакансию
по локации и ранжирует места по количеству вакансий — 589 уникальных локаций
имели открытые вакансии в августовском снимке 2026 года. По умолчанию показывается топ-40;
/locations 100 выводит полную карту рынка.
| # | Локация | Вакансий | Доля |
|---|---|---|---|
| 1 | Rīga | 4,382 | 28.2% |
| 2 | Rīga, centrs | 932 | 6.0% |
| 3 | Liepāja | 498 | 3.2% |
| 4 | Rīga / Hibrīddarbs | 481 | 3.1% |
| 5 | Jelgava | 286 | 1.8% |
| 6 | Rīgas rajons, Mārupes pag. | 245 | 1.6% |
| 7 | Rīga, Pļavnieki | 224 | 1.4% |
| 8 | Mārupe | 214 | 1.4% |
| 9 | Daugavpils | 203 | 1.3% |
| 10 | Jelgava un raj., Jelgava | 182 | 1.2% |
| 11 | Rīga, Ziepniekkalns | 177 | 1.1% |
| 12 | Rīga, Purvciems | 163 | 1.0% |
| — | + ещё 577 локаций (Rēzekne 105, Sigulda 99, Bauska 103, Ventspils 87, Olaine 83…) | остальное | остальное |
География жёстко сконцентрирована: сложите все записи про Ригу из топ-40 — сам город, центр, каждый район, гибридные объявления — и получится 8 662 из 15 548 вакансий, почти половина всего рынка в одном городе, ещё до того как присоединится рижское кольцо (Mārupes pag. 245, Ķekavas pag. 95, Ādažu nov. 94). Второй город, Лиепая, насчитывает 498 (591 вместе с районом), дальше Елгава — 286, Даугавпилс — 203. Практический вывод для тех, кто ищет работу в Риге: фильтр по городу — не приятный бонус, а разница между 28.2% рынка и 100% шума.
Удалённая, гибридная и частичная занятость: честные цифры
В Латвии шутят, что теперь любая работа гибридная, — данные говорят обратное. В августовском снимке 2026 года только 587 из 15 548 объявлений (3.8%) упоминают удалёнку в любой форме, и 581 из них приходит с одного cv.lv. Частичная занятость встречается ещё реже. Вот полная картина из экспорта:
| Тип | Латышский термин | Вакансий | Доля |
|---|---|---|---|
| Гибрид | Hibrīddarbs | 547 | 3.5% |
| Полностью удалённая | Attālināti / Darbs no mājām | 40 | 0.3% |
| Частичная занятость | Nepilna slodze / Pusslodze / Part-time | 51 | 0.3% |
Полностью удалённая работа — редкая птица: всего 40 объявлений (35 «Attālināti» плюс 5 «Darbs no mājām») на всю страну. Если удалёнка для вас обязательное условие, шорт-лист будет коротким — лучше узнать это на первой неделе, чем после месяца скроллинга. Частичная занятость (nepilna slodze, pusslodze) сосредоточена именно там, где и ожидаешь: розничные сети (Douglas, Jysk, New Yorker, Maxima), Lido и прилавки рижских магазинов. Из 51 вакансии с частичной занятостью 23 находятся на ss.com, 18 на cvmarket.lv и только 9 на cv.lv — ещё один аргумент собирать не только «крупные» порталы. Переключатель удалённой работы в /settings учитывает все синонимы — Hibrīddarbs, Attālināti, Darbs no mājām, remote, hybrid — поэтому фильтр действительно находит всё.
«Riga» и «Rīga» — одно и то же место
Сырые данные шести скрейперов хаотичны вполне по-человечески. ss.com и cv.lv пишут адреса
(«Meistaru iela 10, Rīga»), некоторые сайты добавляют страну («Rīga, Latvija» или
«Rīga, Latvia»), а вы как пользователь в половине случаев наберёте Riga
на английской клавиатуре без макрона. Слой локаций в боте обрабатывает всё это:
- Уличные адреса сливаются в свой город — «Meistaru iela 10, Rīga», «Hipokrāta iela 2, Rīga» и «Bruņinieku iela 5 k-2, Rīga» учитываются как Rīga, а не как три фантомные локации.
- Суффиксы стран отбрасываются — «Rīga, Latvija» и «Rīga, Latvia» — это одна и та же Rīga.
-
Диакритика не важна —
Riga,Rīga,LiepajaиLiepājaсчитаются одинаковыми везде — и в группировке /locations, и в ваших фильтрах /location.
До этой нормализации в базе было 2 451 строка локаций, не совпадавших ни с чем
из канонического списка. После неё 589 канонических локаций покрывают весь рынок, и снаружи
остаются лишь несколько деревенских адресов-чудачеств. Тот же механизм работает и в фильтрах:
задав /location Riga, вы молча получаете все варианты написания Rīga — около
9 500 вакансий в августовском снимке.
Задайте свои города один раз:
/location Riga, Liepaja, Jelgava— макроны не нужны — и каждый список, подборка и просмотр в боте будут их учитывать.
Процесс просмотра: 8 кнопок, 6 списков, ни одной таблицы
Ежедневный цикл — это /review. Бот группирует непросмотренные совпадения
по категориям, вы выбираете одну, и дальше вакансии идут по одной карточке. На каждой
карточке — название должности, компания, зарплата, локация, балл совпадения с расшифровкой
и шесть кнопок действий:
🔘 Сетка из 6 кнопок действий:
- ⭐ Избранное — «оставлю, вернусь к ней»
- ⏭ Пропустить — «не моё» (потом можно найти в /skipped)
- 📤 К отправке — «резюме готово, отправлю сегодня»
- ☑ Откликнулся — «отправил»
- 🎤 Собеседование — «они хотят встретиться»
- ❌ Отказ — «они отказали»
Плюс строка prev/next для листания и авто-переход: нажимаете статус — следующая карточка загружается мгновенно. Одна сессия, сорок вакансий, шесть минут.
Каждый статус превращается в список, который можно открыть в любой момент:
/wishlist, /to_send, /applied, /to_interview,
/rejected, /skipped. А поскольку каждое действие пишется в таблицу
user_actions, на вечный вопрос любого соискателя — «где я в этом процессе?» —
отвечает /stats одним сообщением.
Настройки: город, зарплата, удалёнка, ключевые слова — настройте бота под себя
Бот для поиска работы, которому всё равно, где вы живёте и сколько зарабатываете, — это
витрина, а не фильтр. Поэтому у vakances есть полноценная система настроек, доступная через
/settings и /location:
| Настройка | Что делает | Пример |
|---|---|---|
| 📍 Предпочтительные локации | Показывать только вакансии в выбранных городах (можно несколько) | /location Rīga, Liepāja, Jelgava |
| 💰 Минимальная зарплата | Скрывать всё ниже вашей суммы в евро | 1500 |
| 🏠 Только удалёнка | Только объявления, где упоминаются Hibrīddarbs, Attālināti, Darbs no mājām, remote или hybrid | Вкл / Выкл |
| 🎯 Минимальный балл совпадения | Порог для совпадений: 30, 50, 70 или 90 | 70 = только сильные совпадения |
| 🔎 Слова для поиска | Ключевые слова, которые вам важны (используются в find/поиске) | Python, Django, Backend |
| 🚫 Исключённые слова | Никогда не показывать это — например, Junior, Internship | Junior, Internship |
| 👁 Показывать просмотренные | Скрывать уже просмотренные вакансии, чтобы списки оставались свежими | Скрыть |
| 📂 Сортировка по умолчанию | Сначала новые или сначала лучшие совпадения | Лучшие совпадения |
| 🔔 Уведомления | Ежедневная подборка новых совпадений в 09:30 | Вкл |
Обратите внимание на приём с исключёнными словами — это самая недооценённая
функция. Если вы разработчик уровня middle, добавление Junior, Internship, Prakse
в исключения одним действием убирает самый раздражающий шум и из сопоставления, и из поиска.
Технологический стек (для технарей): как устроен vakances_bot.py
Если вы разработчик и думаете «хочу такое для своей компании» или просто «хочу собрать своё» — вот что внутри. Всё перечисленное ниже — открытый исходный код и бесплатно.
| Слой | Технология | Почему |
|---|---|---|
| Язык | Python 3 | Экосистема для скрейпинга и Telegram почти идеальна |
| Интерфейс Telegram | python-telegram-bot | Чистый async API для команд, inline-клавиатур и колбэков |
| Планировщик | APScheduler (AsyncIOScheduler) | Разметка каждые 30 минут, сопоставление в 09:00, подборка в 09:30, часовой пояс Риги |
| База данных | PostgreSQL + psycopg2 | Одна общая база для админ-бота и бота vakances |
| Сбор данных | requests + BeautifulSoup | Разбор HTML с вежливыми задержками 2–5 секунд; JSON API для NVA и prakse.lv |
| Разбор резюме | pdfplumber + python-docx | Извлечение текста из PDF и DOCX |
| Экспорт | openpyxl | XLSX-экспорт отслеживаемых вакансий и всей базы |
| Часовой пояс | pytz Europe/Riga | Все расписания и метки времени живут в рижском времени |
Чтобы бот работал 24/7, я запускаю его как сервис — так он переживает перезагрузки и сбои:
[Unit]
Description=Vakances Telegram Job Bot
After=network.target postgresql.service
[Service]
WorkingDirectory=/root/bot-folder
ExecStart=/root/bot-folder/venv/bin/python vakances_bot.py
Restart=always
[Install]
WantedBy=multi-user.target
Содержание действительно недорогое: VPS за €5–15 в месяц (серверную часть смотрите в моём руководстве по настройке nginx) тянет всю систему, а PostgreSQL бесплатен. Если не хотите собирать всё сами — именно эту архитектуру я поставляю как услугу разработки бота-скрейпера — от €60.
Честные ограничения: чего бот не делает
У любого хорошего инструмента должен быть честный раздел об ограничениях. Вот чего бот vakances не делает — и это стоит знать до того, как доверить ему поиск работы.
- Он не откликается за вас — Бот отслеживает отклики, а отправляете их вы. Большинство латвийских работодателей всё равно ждут живого сообщения — слепая автоподача вредит чаще, чем помогает.
- Скрейпинг — серая зона — Условия использования порталов технически запрещают автоматический сбор. На практике вежливый сбор с низкой частотой терпят, потому что он приводит трафик. Держите задержки разумными и никогда не долбите сайт.
- Сайты меняют HTML — Когда портал меняет дизайн, скрейпер ломается. Пайплайн чётко сообщает об этом, а починка парсера обычно занимает 15–30 минут.
-
Сопоставление по ключевым словам, а не чтение мыслей —
Вакансия, описывающая вашу роль совсем другими словами,
может получить низкий балл. Поэтому расшифровка видна, пороги настраиваются,
а поиск (
find) существует как страховка. - Вакансии исчезают — Компании закрывают объявления; бот помечает их удалёнными и убирает из списков. Если приглашение на собеседование пропало из истории — это уборка делает свою работу.
Бот против ручного поиска и рекрутеров: честное сравнение
А правда ли бот лучше альтернатив? Поставим их рядом, с реальными цифрами латвийского рынка.
| Метод | Время в день | Охват | Отслеживание | Стоимость |
|---|---|---|---|---|
| Ручная проверка сайтов | 30–45 мин | Только сайты, которые вы помните | Блокнот / память | Бесплатно (ваше время) |
| Email-рассылки сайтов | ~10 мин (чтение шума) | Один сайт на подписку | Нет | Бесплатно |
| LinkedIn / нетворкинг | 20–30 мин | Компании, которые там публикуются | Вручную | Бесплатно / Premium |
| Рекрутер | ~5 мин | Только список его клиентов | Делает он | 10–20% от первой зарплаты |
| Telegram-бот для поиска работы | 2–4 мин | 6 сайтов без дубликатов | 6 автоматических списков | €5–15/мес за хостинг (или €300 за разработку) |
Математика проста: бот не заменяет рекрутеров и нетворкинг — он заменяет скучные 30 минут. Нетворкинг остаётся важен (человеческая часть найма никуда не денется), но никто ещё не получал собеседование за то, что по пять раз в день перечитывал одни и те же результаты поиска на cv.lv.
Часто задаваемые вопросы о поиске работы в Латвии
- За сколько времени найти работу в Риге без ручного поиска?
- Совместите крупные порталы (cv.lv, ss.com, cvmarket.lv) с государственным порталом NVA и автоматической проверкой — Telegram-бот делает всё это в одном чате. Загрузите резюме один раз, задайте город и зарплату в /settings и просматривайте ежедневные совпадения. Скорость дают охват и ранний отклик — именно то, что даёт автоматизация.
- Что такое /vakances?
- Команда обзора рынка: все активные вакансии в базе, сгруппированные
по профессиям с количеством и отсортированные по спросу. Введите
show N(номер из списка), чтобы открыть вакансии этой категории. Самый быстрый способ увидеть, где сейчас реально есть работа в Латвии. - Может ли бот откликаться за меня?
- Нет. Он показывает вакансию с прямой ссылкой и отслеживает ваш статус (к отправке → откликнулся → собеседование → отказ), но резюме отправляете вы. Системы автоподачи обычно дают обратный эффект у работодателей — личное сообщение по-прежнему выигрывает.
- Насколько точен балл совпадения?
- Оценка — это совпадение ключевых слов (до 80 баллов) плюс бонус за категорию (20 баллов), с запасным поиском по названию. Всё прозрачно: каждая карточка показывает совпавшие ключевые слова и категорию, а порог (30/50/70/90) задаёте вы. Шум он отсекает надёжно; чтение описания вакансии он не заменит никогда.
- Какие сайты охвачены?
- Шесть: cv.lv, ss.com, cvmarket.lv, liepajniekiem.lv, cvvp.nva.gov.lv (государственный портал NVA с 4 442 активными объявлениями) и prakse.lv для стажировок. Скрейперы добавляются — обычно с этого и начинаются индивидуальные версии.
- Сколько стоит индивидуальный бот для поиска работы?
- Индивидуальная разработка — от €60 (сбор данных + интерфейс Telegram + сопоставление). Хостинг — €5–15 в месяц. Бот vakances из этой статьи — эталонная реализация: скажите, какие сайты и фильтры вам нужны, и я соберу ваш.
- Законен ли скрейпинг сайтов вакансий?
- Технически он нарушает условия большинства сайтов, но вежливый сбор с низкой частотой и задержками между запросами на практике широко терпим, потому что возвращает трафик на порталы. Не перегружайте серверы, не перепродавайте данные — и вы в той же серой зоне, что и тысячи аналитических инструментов.
Вы ещё ищете вручную?
Если вы активно ищете работу в Риге или в другом городе Латвии и заходите на сайты вакансий чаще двух раз в неделю, прекратите. 30 минут ежедневного переключения cv.lv, ss.com, cvmarket.lv и портала NVA — это ровно та работа, которую должен делать компьютер.
Ваше утро теперь: открыть Telegram, прочитать подборку, пролистать совпадения, ставить «откликнулся» или «нет» — всего 4 минуты. Обзор рынка показывает, где реальный спрос. Экспорт кладёт всё в Excel. Списки отслеживают, на каком этапе каждая заявка.
Компании и агентства могут то же самое. Индивидуальная разработка Telegram-бота от €60, код из этой статьи как основа.
Просто математика: рынок труда Латвии разбросан по 6 сайтам. Бот собирает всё в один чат. Первым его увидит тот, кто запустит сегодня.