← Назад к портфолио

📊 Парсер тендеров

Проблема: Тендерный отдел компании тратил 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

🔄 Как это работает

  1. Система запускается в headless-режиме браузера с рандомным User-Agent из пула
  2. Загружается страница поиска RTS-Tender с применением stealth-скриптов против детекта ботов
  3. Парсер извлекает все карточки тендеров (название, описание, дедлайн, ссылку) со страницы
  4. Для каждой карточки генерируется SHA256-хеш и проверяется наличие в базе данных
  5. Новые тендеры отправляются в Telegram всем получателям с форматированным HTML-сообщением
  6. После обработки страницы выполняется плавный скролл и переход на следующую
  7. Парсинг останавливается при 5 дубликатах подряд, старых датах или достижении последней страницы
  8. Система ждёт заданный интервал (30 мин) и повторяет цикл автоматически

🧠 Интеллектуальные возможности

Многоуровневая система остановки:

  1. Дедупликация по хешу — SHA256(название + ссылка) гарантирует уникальность каждого уведомления
  2. Счётчик последовательных дубликатов — если 5 тендеров подряд уже в базе, значит достигнута граница актуальных
  3. Проверка дат публикации — как только встречается тендер с датой старше текущего дня, парсинг прекращается
  4. Отсутствие кнопки пагинации — автоматическое завершение при достижении последней страницы результатов
  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 с количеством успешных/неудачных отправок

📈 Сценарии использования

  1. Тендерные отделы компаний — автоматический мониторинг государственных и коммерческих закупок по 44-ФЗ, 223-ФЗ
  2. Поставщики товаров и услуг — отслеживание закупок в конкретной отрасли (IT, медицина, строительство)
  3. Консалтинговые агентства — мониторинг тендеров для портфеля клиентов с разными критериями поиска
  4. Аналитические отделы — сбор данных о рынке государственных закупок для аналитики и прогнозирования
  5. Фрилансеры и малый бизнес — поиск закупок малого объёма (до 100-400 тыс. руб.) для быстрого участия

✅ Этот проект подойдёт вам, если:

  • Вы участвуете в государственных тендерах и хотите получать уведомления мгновенно
  • Тратите часы на мониторинг тендерных площадок (RTS-Tender, Zakupki.gov.ru и др.)
  • Упускаете выгодные закупки из-за несвоевременного обнаружения
  • Нужна система с множественными получателями (отдел продаж, руководство, аналитика)
  • Требуется устойчивое решение, работающее 24/7 без участия человека
  • Хотите автоматизировать мониторинг любых веб-ресурсов с динамическим контентом

Нужна система мониторинга для вашего бизнеса?

Разработаю парсер для любых площадок: тендеры, маркетплейсы, объявления, вакансии, недвижимость

Обсудить проект →