Система мониторинга рынка посуточной аренды
Автоматический сбор данных по тысячам объявлений sutochno.ru, отслеживание каждой брони и отмены, динамика цен на 60 дней вперёд — и веб-панель управления, где всё это доступно без единой строки кода.
⚡ Проблема
Управляющие посуточной арендой не видят реальную картину рынка. Вручную отслеживать цены, загрузку и динамику бронирований у сотен конкурентов — невозможно. Ценообразование строится «на глаз», а выгодные периоды высокого спроса упускаются. Нет данных — нет прибыли.
✅ Решение
Парсер автоматически собирает все объявления по заданным фильтрам, извлекает цены и календарь занятости через внутреннее API сайта, а при повторных запусках — фиксирует каждую бронь и отмену. Веб-админка rentpulse.ru даёт полный контроль: настройки, запуск, результаты и отчёты — всё в браузере.
⚙️ Что реализовано
🔍
Полный обход каталога
До 4 ссылок поиска с разными фильтрами. Автоматическая пагинация, дедупликация по ID. Очистка DOM после каждой страницы — стабильная работа даже при 100+ страницах без зависаний.
💰
Цены и занятость на 60 дней
Гибридная стратегия: один bulk-запрос получает все цены, скользящее окно определяет занятость каждого дня. Вместо 60 отдельных запросов — интеллектуальная оптимизация трафика.
📊
Детектирование броней и отмен
Снимки состояния сохраняются после каждого прогона. При повторном запуске — автоматическое сравнение: какие даты забронировали, какие освободили. Даже между прогонами в разные дни.
⚡
Параллельная обработка
До 5 вкладок в одном браузере + до 5 прокси-браузеров одновременно. Итого до 25 карточек параллельно. Каталог с прокси тоже обрабатывается параллельно — каждый URL в своём браузере.
🛡️
Автовосстановление при сбоях
3 повторные попытки на каждую карточку. Монитор соединения: 2 провала подряд → перезапуск браузера → проверка/замена прокси → повтор необработанных карточек. До 3 перезапусков за прогон.
📋
Три типа Excel-отчётов
Основной отчёт (перезаписывается), датированный снимок (накапливается) и отчёт сравнения с бронями и отменами. Автофильтры, кликабельные ссылки, цветовая маркировка событий.
🖥️
Веб-админка rentpulse.ru
Полноценная панель управления на FastAPI: настройка параметров, запуск/остановка парсера, просмотр результатов с пагинацией и сортировкой, скачивание отчётов, управление прокси — всё без SSH.
🕵️
Stealth-режим и перехват API
Обход антибот-защиты через stealth-настройки Playwright. Сессионный токен перехватывается через page.route. Детект редиректа на CAPTCHA с автоматической повторной загрузкой.
🔄 Как это работает
01
Парсинг каталога
Для каждой ссылки поиска запускается отдельный браузер. Обход всех страниц пагинации, сбор базовых данных: цена, рейтинг, площадь, адрес, метро. Дедупликация по ID, очистка DOM после каждой страницы.
Playwright
02
Перехват токена и bulk-запрос цен
Загрузка страницы карточки → перехват сессионного токена → один запрос на 60 ночей получает все цены. Сезонные цены разворачиваются в дневные, базовая цена используется как fallback.
API sutochno
03
Определение занятости скользящим окном
Если объект частично занят — 60 запросов пакетами по 5 параллельно. Адаптивный подбор min_nights при ошибках. Ошибочные дни логируются, не маскируются.
Пакетная обработка
04
Сохранение снимков состояния
Календарь занятости + цены по дням + временная метка UTC. Пустые и некорректные снимки автоматически пропускаются — никаких «призрачных» событий в отчётах.
SQLite
05
Детектирование броней и отмен
Сравнение текущего и предыдущего снимков с выравниванием по реальным датам. Подряд идущие дни склеиваются в одно событие. Расчёт глубины бронирования, цены и итоговой стоимости.
Аналитика
06
Экспорт и веб-интерфейс
Три Excel-файла с автофильтрами и форматированием. Веб-админка: дашборд со статистикой, таблица результатов, отчёты сравнения, настройки парсера и управление прокси.
Excel + FastAPI
⚡
Интеллектуальная экономия запросов. Для полностью свободного объекта достаточно одного bulk-запроса вместо 60 отдельных. Скользящее окно запускается только для частично занятых — это сокращает нагрузку на API в 10–30 раз и снижает риск блокировки.
🔗 Ключевые интеграции
🔵 API sutochno.ru
Внутреннее JSON API
- Перехват сессионного токена через
page.route
- Bulk-запрос
getPricesAndAvailabilities на 60 ночей
- Парсинг
season_price и базовой цены из detail[]
- Валидация токена тестовым запросом перед основным
- Автоматическая перезагрузка при протухшем токене
🟣 Playwright
Stealth-браузер + параллелизм
- Stealth-настройки для обхода антибот-защиты
- Множественные вкладки с
asyncio параллелизмом
- Прокси-браузеры для масштабирования
- Очистка DOM для предотвращения утечек памяти
- Детект редиректа на CAPTCHA с повторной загрузкой
🟢 SQLite
Хранилище данных и снимков
- Upsert объявлений по
external_id
- Таблица снимков: календарь + цены + метка UTC
- Фильтрация пустых снимков перед сохранением
- Абстрактные репозитории (ABC) — замена БД без изменения логики
- Автосоздание таблиц при первом запуске
🟡 Веб-админка
FastAPI + Tailwind CSS + Alpine.js
- Управление
.env парсера через веб-форму
- Запуск/остановка через
systemctl
- Таблица результатов с пагинацией и сортировкой
- Скачивание Excel-отчётов и отчётов сравнения
- Управление пулом прокси: добавление, удаление, проверка
🔗
Корректное сравнение снимков из разных дней. Если первый прогон был в понедельник, а второй — в четверг, программа автоматически выравнивает календари по реальным датам и сравнивает только пересекающиеся дни. Ложные срабатывания из-за «сдвига» календаря исключены.
📊 Ключевые показатели
10 000+
Объявлений обрабатывается за один прогон
×25
Параллельных карточек (5 прокси × 5 вкладок)
60 дней
Глубина календаря цен и занятости
3 отчёта
Основной, датированный снимок и сравнение
~15 сек
Среднее время обработки одной карточки
SOLID
Архитектура парсера и веб-админки
🏗️ Архитектурные особенности
🧱
SOLID + слоёная архитектура в двух проектах
Парсер: Services → Repositories → Models. Админка: Routes → Services → Repositories. Все зависимости инжектируются через конструкторы. Фабрики в точке входа — единственное место сборки.
🔄
Strategy — гибридная стратегия сбора данных
HybridStrategy сочетает bulk-запрос и скользящее окно. Выбор метода определяется автоматически по ответу API. Новая стратегия добавляется без модификации существующего кода.
👁️
Observer — монитор соединения
ConnectionMonitor наблюдает за результатами загрузки страниц. При 2 провалах подряд — сигнал всем вкладкам через asyncio.Event. Браузер перезапускается, прокси проверяется и заменяется.
🗄️
Repository — абстракция над хранилищем
Абстрактные базовые классы для объявлений и снимков. SQLite-реализации подставляются через DI. Замена на PostgreSQL — без единого изменения в сервисном слое.
📝
Структурированное JSON-логирование
Каждая запись: timestamp, level, message, trace_id, context. Ротация 10 МБ × 5 копий. Отдельные логгеры для сервисов, репозиториев и внешних API. Полная прослеживаемость каждого прогона.
🔐
Восстановление состояния при перезапуске
Админка при старте проверяет systemctl is-active парсера. Если парсер работает — подключается мониторинг. Если уже завершился — помечает запуск корректно. Перезапуск админки не прерывает отображение статуса.
📦
Масштабирование без изменения кода. Нужно обрабатывать больше объявлений — добавьте прокси в пул через веб-админку. Нужен другой город — измените ссылку поиска в настройках. Нужна другая площадка — реализуйте новый ScraperService по тому же интерфейсу.
🛡️
Защита от потери данных. Снимки с пустым календарём не сохраняются — никаких ложных броней из нулевых данных. Ошибочные дни логируются поимённо, а не маскируются. Каждый датированный отчёт накапливается — полная история рынка за любой период.
🛠️ Технологии
Python 3.11+
Playwright
FastAPI
SQLite
aiosqlite
openpyxl
Jinja2
Tailwind CSS v4
Alpine.js
asyncio
dataclasses
Nginx
systemd
Let's Encrypt
bcrypt
ruff
mypy strict
pre-commit
✅ Подойдёт вам, если
- Вы управляете объектами посуточной аренды и хотите видеть реальные цены и загрузку конкурентов — не вручную, а автоматически, с точностью до каждого дня
- Вам нужно отслеживать спрос в динамике: когда бронируют, за сколько дней до заезда, какие периоды самые востребованные — чтобы выстраивать ценообразование на основе данных, а не догадок
- Вы инвестируете в недвижимость для посуточной аренды и хотите оценить доходность локации до покупки — по реальной загрузке и ценам действующих объектов
- Вам нужна система мониторинга любого рынка: отели, аренда, маркетплейсы — архитектура проекта позволяет адаптировать парсер под любую площадку без переписывания с нуля
- Важна надёжность при масштабе: автовосстановление при сбоях, параллельная обработка через прокси, защита от ложных данных и полная история изменений
Раньше я открывал sutochno.ru и вручную смотрел цены у десятка конкурентов — на это уходило полдня, а картина всё равно была неполной. Теперь система сама собирает данные по всему городу, а я вижу, кто поднял цены к выходным, у кого резко выросла загрузка, и какие даты ещё свободны. За первый месяц скорректировал ценообразование и поднял заполняемость на 18%.
— Владелец 12 квартир посуточной аренды, Санкт-Петербург
Нужна система мониторинга рынка или автоматизации сбора данных?
Разработаю парсер с аналитикой, отчётами и удобной веб-панелью управления — под вашу площадку и задачи
Обсудить проект →