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

Зачем
Рынок инвестиционной недвижимости — это торги. Сбербанк-АСТ, Алфалот, М-ЕТС, ГИС Торги, ЕТПРФ, Инвест Москва и другие. На каждой площадке — сотни лотов. Просматривать их вручную каждый день — нереально.
AKLAB делает это за меня: парсит площадки ночью, анализирует отклонения от эталонов, утром присылает результат на почту.
Архитектура
Один репозиторий, 15 PM2-процессов:
| Компонент | Порт | Описание |
|---|---|---|
| Frontend (Vue 3 + Vite + Tailwind) | :5174 | Dashboard, Настройки, Карточки объектов |
| Backend (Strapi 5 + SQLite) | :1338 | REST API, Admin Panel, Cron scheduler |
| 10 парсеров (Playwright/fetch) | :1345–1355 | alfalot, 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+ |
| Время от идеи до prod | 1.5 месяца |
Что дальше
- Email-дайджест с аналитикой по трендам
- Расширение на больше площадок и регионов
- API для партнёров
- Предсказание доходности на основе исторических данных