Ежедневный снимок цен и параметров квартир застройщиков Москвы → SQLite → публичная фильтруемая витрина через Datasette.
Изначально — только ПИК (по умолчанию ЖК «Нарвин», block_id=1165),
теперь покрывает топ застройщиков: ПИК, ГК ФСК, Донстрой, А101, Level,
Абсолют, MR Group. Все они лежат в одной БД с разрезом по застройщику.
Живая витрина: https://pik.gorev.space
pik/client.py— пагинированный клиент кapi.pik.ru/v2/flatс retry на 502/503/504pik/mapping.py— нормализует JSON ПИК → строки SQLite (flats+snapshots)pik/store.py— схема и идемпотентный upsert в одной транзакцииpik/developers.py— реестр застройщиков + неймспейсинг id (общее id-пространство)pik/sources/— по модулю на застройщика (ФСК/Донстрой/А101/Level/Абсолют/MR Group), каждый приводит свой API/HTML к нормализованнымNormBlock/NormFlatpik/backfill_wayback.py— ретро-история из архивов pik.ru через web.archive.orgbin/scan.py— однопроходный сканер ПИК (cron-friendly)bin/scan_dev.py— параллельный сканер прочих застройщиковbin/backfill.py— одноразовая заливка историиmetadata.yml— конфиг Datasettedeploy/— systemd units + nginx + install.sh
python -m bin.scan_dev --db data/pik.db --all # все источники параллельно
python -m bin.scan_dev --db data/pik.db --developer "ГК ФСК"Самолёт и ЛСР пока не поддержаны: сайт Самолёта за QRATOR-JS-челленджем (нужен headless-браузер), сайт ЛСР отдаёт данные только с российских IP.
python3.12 -m venv venv
. venv/bin/activate
pip install -e .[serve,test]
pytest # 25 тестов
python -m bin.scan --db data/pik.db # ~1 минута, реальный API
datasette serve data/pik.db -m metadata.yml --port 5051http://127.0.0.1:5051/pik/today_one_room — сегодняшняя витрина (1-комн).
python -m bin.backfill --db data/pik.db --slug narvin --block-id 1165Для Нарвина даёт ~9 исторических срезов с июня 2025 (~160 уникальных квартир, рост цен 1к ~+28% Jun 2025 → Jan 2026).
Нужны только две вещи: PIK block_id и URL slug проекта.
Найти их можно через один любой flat/{id} любого выбранного дома:
curl -A "Mozilla/5.0" "https://api.pik.ru/v1/flat/<flat-id>" | jq '{block_id, url}'block_id подставляется в --block-id, slug из URL (https://www.pik.ru/<slug>)
— в --slug. Тогда:
python -m bin.scan --db data/pik.db --block-id <BID>
python -m bin.backfill --db data/pik.db --slug <slug> --block-id <BID>Или сразу несколько проектов в одном прогоне:
PIK_BLOCK_ID=1165 python -m bin.scan --block-id 1165,5686БД содержит flats.block_id — все ЖК живут в одной таблице.
DNS A-запись для домена → IP сервера должна быть. Дальше:
sudo REPO_DIR=$PWD bash deploy/install.sh
sudo certbot --nginx -d <domain>
sudo nginx -t && sudo systemctl reload nginxСкан ежедневно в 06:00 МСК через pik-scan.timer. Состояние:
systemctl status pik.service pik-scan.timer
systemctl list-timers pik-scan.timer
journalctl -u pik-scan.service -n 50GET https://api.pik.ru/v2/flat?block_id=<BID>&types=1&page=N
50 элементов на страницу, требует браузерный User-Agent (его выставляет
PikClient). Сайт pik.ru под QRATOR — публичный сайт не парсим, JSON-API
этого не требует.
flats— стабильные характеристики (этаж, площадь, корпус, секция); один ряд на квартируsnapshots— ежедневный срез (цена, статус, отделка, лучшая ипотека); PK = (flat_id, scan_date)today_one_room— view: последний срез ×rooms='1', с русскими колонками- Все ЖК в одной БД, фильтруйте по
flats.block_id
docs/superpowers/specs/2026-05-15-pik-narvin-parser-design.mddocs/superpowers/plans/2026-05-15-pik-narvin-parser-plan.md
Apache-2.0 (см. LICENSE).