Перейти к содержанию
Все статьи

AKLAB: как я строю автоматический мониторинг недвижимости для инвесторов

aklabaiразработкаstrapivueнедвижимостьинвестиции

Я делаю сервис мониторинга инвестиционной недвижимости — AKLAB. Он автоматически находит объекты, которые стоят значительно ниже рыночных эталонов. Парсит 10 федеральных площадок, анализирует отклонения от эталонных цен, присылает утренний дайджест на email.

Основной фокус — коммерческая недвижимость: офисы, склады, торговые помещения. Но мониторим также земельные участки и квартиры.

За полтора месяца довёл проект от идеи до продакшена. Рассказываю, как устроено.

Дашборд AKLAB — тёмная тема

Зачем

Рынок инвестиционной недвижимости — это торги. Сбербанк-АСТ, Алфалот, М-ЕТС, ГИС Торги, ЕТПРФ, Инвест Москва и другие. На каждой площадке — сотни лотов. Просматривать их вручную каждый день — нереально.

AKLAB делает это за меня: парсит площадки ночью, анализирует отклонения от эталонов, утром присылает результат на почту.

Архитектура

Один репозиторий, 15 PM2-процессов:

КомпонентПортОписание
Frontend (Vue 3 + Vite + Tailwind):5174Dashboard, Настройки, Карточки объектов
Backend (Strapi 5 + SQLite):1338REST API, Admin Panel, Cron scheduler
10 парсеров (Playwright/fetch):1345–1355alfalot, torgi-gov, sberbank-ast, m-ets …
Analyzer:1341Сравнение с эталонами
Digest:1342Утренний email-дайджест
Photo:1356Фото из карточек
Очередь@aklab/sqlite-queue

Backend — Strapi 5.44 + SQLite. Выбрал Strapi, потому что из коробки получаю REST API, админку, систему прав и кастомные контроллеры. Не нужно писать boilerplate.

Frontend — Vue 3 + Vite + Tailwind. Дашборд с фильтрами по городу, цене и типу объекта, карточки с галереей фото.

Парсеры — каждый микросервис в отдельной папке, shared-модули в _shared/. Один манифест services.json управляет портами, health-checks и PM2-конфигом.

Парсинг

Ночью запускаются 10 парсеров одновременно. Каждый обходит свою площадку, находит новые лоты и проверяет обновления старых.

Парсинг работает в две фазы — и это не просто «скан, потом загрузка». Это принципиальное решение, которое экономит время и ресурсы.

Phase 1 — Scan. Парсер обходит ленту площадки и собирает только карточные данные: цена, площадь, адрес, тип помещения. Тут же, на лету, применяет фильтры. Не попадает в нужный регион — отбрасывается. Площадь меньше минимума — отбрасывается. Цена выше порога — отбрасывается. Стоп-слова в названии — отбрасывается. Всё это происходит до того, как я потратил хоть одну лишнюю секунду на детальную выгрузку.

Типичный сценарий: площадка выдаёт 200 лотов по всей России. После фильтрации по региону (Москва + МО) остаётся 30. После фильтрации по площади и цене — 12. Именно эти 12 и пойдут во вторую фазу, а не все 200.

Phase 2 — Fetch Details. Для каждого прошедшего фильтр лота парсер заходит в карточку и забирает полное описание, фотографии, документы, условия торгов. Это дорогая операция — каждый запрос это реальный HTTP-запрос к площадке, с ожиданием загрузки, иногда с обходом JavaScript-рендеринга через Playwright.

Две фазы позволяют не грузить детали для объектов, которые заведомо не подходят. На некоторых площадках фильтрация отсекает 80–90% лотов ещё на этапе scan.

Скоринг

После парсинга analyzer оценивает каждый объект по сравнению с эталонными ценами.

Эталоны — это заранее заданные ориентиры стоимости за квадратный метр для каждого типа помещения в каждом регионе. Не «средняя цена по рынку», а конкретные контрольные точки, которые я веду вручную и корректирую по мере накопления данных.

Для каждого объекта analyzer считает отклонение от эталона:

deviation = (эталонная_цена − фактическая_цена) / эталонная_цена × 100

Если отклонение превышает порог (например, 20%) — объект попадает в фокус. Чем больше отклонение, тем выше фокус-скор.

Кроме отклонения, на скор влияют дополнительные факторы: тип торгов (банкротство vs реализация), наличие фото, полнота описания, сроки торгов. Объект с высоким отклонением, но без фотографий и с неполным описанием получит скор ниже, чем объект с аналогичным отклонением, но полной карточкой.

Весь парсинг и анализ происходит ночью. Утром digest формирует email-дайджест по объектам, попавшим в фокус, и отправляет мне на почту.

Как AI помогает

Я разрабатываю AKLAB с AI-ассистентом. Вот что это даёт на практике:

Параллельная работа. AI одновременно пишет код для нескольких сервисов — парсера, analyzer, фронтенд-компонента. Я ревьюю результат, а не пишу с нуля.

Документация. После каждого изменения AI обновляет внутреннюю документацию: архитектурные решения, known issues, deployment notes. Всё актуально в каждый момент времени.

Тесты. AI генерирует тесты параллельно с кодом. Не «напиши потом тесты» — а сразу вместе с фичей.

Деплой. Один скрипт: коммит, пуш, npm install, build 10 сервисов, перезапуск PM2, health-check. 3–5 минут от команды до рабочего продакшена.

Цифры

МетрикаЗначение
Версияv1.1.43
PM2-процессов15
Активных парсеров10
Площадок10 федеральных
Тестов578
Коммитов200+
Время от идеи до prod1.5 месяца

Что дальше

  • Email-дайджест с аналитикой по трендам
  • Расширение на больше площадок и регионов
  • API для партнёров
  • Предсказание доходности на основе исторических данных