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

Мониторинг посуточной аренды — Sutochno ру

Система мониторинга рынка посуточной аренды

Автоматический сбор данных по тысячам объявлений 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 квартир посуточной аренды, Санкт-Петербург

Нужна система мониторинга рынка или автоматизации сбора данных?

Разработаю парсер с аналитикой, отчётами и удобной веб-панелью управления — под вашу площадку и задачи

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