Проблема: Тендерный отдел компании тратил 3-4 часа ежедневно на мониторинг площадки RTS-Tender, вручную просматривая сотни тендеров. Из-за человеческого фактора важные закупки упускались, а устаревшие заявки попадали в обработку.
Решение: Автоматизированная система мониторинга с Telegram-уведомлениями, Playwright-парсингом и интеллектуальной дедупликацией, которая работает 24/7 и присылает только новые актуальные тендеры.
📋 Задача
RTS-Tender — федеральная электронная площадка с 12 млн+ закупочных процедур на сумму 42 трлн рублей. Ежедневно публикуются сотни новых тендеров, и компаниям необходимо:
- Мониторить в режиме реального времени — новые тендеры появляются каждые 10-15 минут
- Фильтровать по специфике — из тысяч закупок нужны только релевантные (IT-услуги, оборудование, конкретные регионы)
- Не пропускать дедлайны — срок подачи заявки часто составляет 3-5 дней
- Избегать дубликатов — один и тот же тендер может отображаться на разных страницах
Вручную просматривать результаты поиска на 20+ страницах, проверять актуальность дат и копировать информацию — это минимум 3-4 часа ежедневно. При этом риск пропустить выгодный тендер остаётся высоким.
⚙️ Что сделано
🔹 Функционал системы:
- Stealth-парсинг с Playwright — имитация реального пользователя с ротацией User-Agent, рандомным viewport и anti-detection скриптами (webdriver, plugins, languages)
- Интеллектуальная пагинация — автоматический переход по страницам с плавным скроллом (7 сек) и проверкой активности кнопки "Далее"
- Парсинг карточек тендеров — извлечение названия, описания/цены, дедлайна подачи заявки и прямой ссылки на закупку
- SHA256-дедупликация — генерация уникального хеша на основе названия + ссылки для предотвращения повторных уведомлений
- Умная остановка парсера — прекращение работы после 5 подряд идущих дубликатов или при обнаружении тендеров с датой старше текущего дня
- Множественная рассылка в Telegram — поддержка до 4+ получателей с retry-логикой, обработкой rate limits (429) и статистикой доставки
- SQLite база данных — хранение всех обработанных тендеров с индексами по хешу и дате, статистика за день/неделю/всё время
- Retry-механизм с экспоненциальной задержкой — автоматический повтор до 3 раз для сетевых операций (2^attempt секунд)
- Непрерывная работа 24/7 — планировщик с настраиваемым интервалом (30 мин по умолчанию) и обратным отсчётом до следующего запуска
- Детальное логирование — все ошибки записываются в errors.log с временными метками и контекстом выполнения
🔹 Технологии:
Python 3.9+ Playwright asyncio aiosqlite Telegram Bot API SHA256 async/await
🔄 Как это работает
- Система запускается в headless-режиме браузера с рандомным User-Agent из пула
- Загружается страница поиска RTS-Tender с применением stealth-скриптов против детекта ботов
- Парсер извлекает все карточки тендеров (название, описание, дедлайн, ссылку) со страницы
- Для каждой карточки генерируется SHA256-хеш и проверяется наличие в базе данных
- Новые тендеры отправляются в Telegram всем получателям с форматированным HTML-сообщением
- После обработки страницы выполняется плавный скролл и переход на следующую
- Парсинг останавливается при 5 дубликатах подряд, старых датах или достижении последней страницы
- Система ждёт заданный интервал (30 мин) и повторяет цикл автоматически
🧠 Интеллектуальные возможности
Многоуровневая система остановки:
- Дедупликация по хешу — SHA256(название + ссылка) гарантирует уникальность каждого уведомления
- Счётчик последовательных дубликатов — если 5 тендеров подряд уже в базе, значит достигнута граница актуальных
- Проверка дат публикации — как только встречается тендер с датой старше текущего дня, парсинг прекращается
- Отсутствие кнопки пагинации — автоматическое завершение при достижении последней страницы результатов
- Timeout-защита — если страница не загружается более 90 секунд, парсер корректно завершается с логированием
📊 Результаты
3-4 часа
Экономия времени ежедневно
24/7
Непрерывный мониторинг площадки
30 мин
Интервал проверки новых тендеров
100%
Охват актуальных тендеров
0 дубликатов
Умная система
4+ чата
Одновременная рассылка в Telegram
💡 Техническая изюминка
🕵️ Stealth-режим против детекта ботов:
Система использует комплекс антидетект-техник: инъекция JavaScript для подмены navigator.webdriver, эмуляция window.chrome объекта, ротация User-Agent и viewport, рандомизация языков браузера, плавный скроллинг с задержками. Это позволяет обходить защиту RTS-Tender и стабильно работать месяцами без блокировок.
"Раньше менеджеры тратили первую половину рабочего дня на просмотр тендеров вручную. Теперь система работает круглосуточно, и мы получаем уведомления в Telegram сразу после публикации. Ни один выгодный тендер не проходит мимо, а время сотрудников освободилось для подготовки качественных заявок. За 3 месяца работы системы мы увеличили количество поданных заявок на 40%!"
— Руководитель тендерного отдела IT-компании
⚙️ Архитектурные особенности
- Модульная архитектура — разделение на parser.py (парсинг), database.py (работа с БД), utils.py (вспомогательные функции), config.py (конфигурация), main.py (точка входа)
- Асинхронное программирование — использование asyncio и async/await для параллельной обработки задач и неблокирующих операций
- Retry-паттерн — универсальная функция retry_async() с экспоненциальной задержкой для всех сетевых операций
- Graceful shutdown — корректная обработка KeyboardInterrupt (Ctrl+C), гарантированное закрытие браузера в finally-блоке
- Defensive programming — каждый элемент парсинга обёрнут в try-except, ошибки логируются без прерывания работы
- Database-first подход — все данные сразу сохраняются в SQLite с UNIQUE constraint для автоматической защиты от дубликатов
- Stateful парсер — объект TenderParser хранит счётчики (найдено, новых, дубликатов, ошибок) для детальной статистики
- Configurable behavior — все критические параметры (интервал, лимит дубликатов, таймауты) вынесены в config.py
🔧 Дополнительные возможности
🔹 Встроенные механизмы отказоустойчивости:
- Обработка rate limits — если Telegram API возвращает 429, система автоматически ждёт указанное время (Retry-After header)
- Fallback для заблокированных пользователей — если бот заблокирован (403), уведомление пропускается без прерывания рассылки остальным
- Timeout-защита пагинации — если кнопка "Далее" не кликабельна более 30 секунд, парсер корректно завершается
- Автоочистка старых записей — метод cleanup_old_records() удаляет тендеры старше 90 дней для оптимизации БД
- Статистика отправки — после рассылки возвращается dict с количеством успешных/неудачных отправок
📈 Сценарии использования
- Тендерные отделы компаний — автоматический мониторинг государственных и коммерческих закупок по 44-ФЗ, 223-ФЗ
- Поставщики товаров и услуг — отслеживание закупок в конкретной отрасли (IT, медицина, строительство)
- Консалтинговые агентства — мониторинг тендеров для портфеля клиентов с разными критериями поиска
- Аналитические отделы — сбор данных о рынке государственных закупок для аналитики и прогнозирования
- Фрилансеры и малый бизнес — поиск закупок малого объёма (до 100-400 тыс. руб.) для быстрого участия
✅ Этот проект подойдёт вам, если:
- Вы участвуете в государственных тендерах и хотите получать уведомления мгновенно
- Тратите часы на мониторинг тендерных площадок (RTS-Tender, Zakupki.gov.ru и др.)
- Упускаете выгодные закупки из-за несвоевременного обнаружения
- Нужна система с множественными получателями (отдел продаж, руководство, аналитика)
- Требуется устойчивое решение, работающее 24/7 без участия человека
- Хотите автоматизировать мониторинг любых веб-ресурсов с динамическим контентом
Нужна система мониторинга для вашего бизнеса?
Разработаю парсер для любых площадок: тендеры, маркетплейсы, объявления, вакансии, недвижимость
Обсудить проект →