SPB Git

spb/immo-ka Public

Immo-Ka — agrégateur des propriétés à vendre au Québec (73 connecteurs, ~40 000 annonces, React+FastAPI)

Python 64% TypeScript 21.1% CSS 14.3% HTML 0.6%
7.0 KB · 143 lines markdown
Rendered Raw Blame History
1<div align="center">23# Immo·Ka45### Toutes les propriétés à vendre du Québec. Un seul endroit.67**[www.immo-ka.com](https://www.immo-ka.com)**89![Python](https://img.shields.io/badge/Python-3.14-141814?style=for-the-badge&logo=python&logoColor=c7f230)10![FastAPI](https://img.shields.io/badge/FastAPI-API-141814?style=for-the-badge&logo=fastapi&logoColor=c7f230)11![React](https://img.shields.io/badge/React_18-Vite_+_TS-141814?style=for-the-badge&logo=react&logoColor=c7f230)12![MapLibre](https://img.shields.io/badge/MapLibre-carte-141814?style=for-the-badge&logo=maplibre&logoColor=c7f230)13![SQLite](https://img.shields.io/badge/SQLite-WAL-141814?style=for-the-badge&logo=sqlite&logoColor=c7f230)1415![Propriétés](https://img.shields.io/badge/propri%C3%A9t%C3%A9s_agr%C3%A9g%C3%A9es-40_000%2B-1c5c41?style=flat-square)16![Connecteurs](https://img.shields.io/badge/connecteurs-73-1c5c41?style=flat-square)17![Agences](https://img.shields.io/badge/agences_actives-21-1c5c41?style=flat-square)18![Couverture](https://img.shields.io/badge/couverture-tout_le_Qu%C3%A9bec-1c5c41?style=flat-square)19![MàJ](https://img.shields.io/badge/mise_%C3%A0_jour-automatique-1c5c41?style=flat-square)2021*Agrégateur indépendant des maisons, condos et terrains à vendre au Québec —22un connecteur dédié par agence de courtage, chaque propriété normalisée vers un23schéma unique, avec galerie photo, caractéristiques complètes et lien direct vers24l'annonce originale de l'agence. Toujours à jour, automatiquement.*2526</div>2728---2930## Aperçu3132| Accueil — liste, filtres & carte | Fiche propriété — galerie & specs |33|---|---|34| ![Accueil Immo-Ka](docs/screenshots/home.png) | ![Fiche propriété](docs/screenshots/listing.png) |3536## Pourquoi Immo-Ka ?3738Chercher une propriété à vendre au Québec, c'est jongler entre les sites de RE/MAX,39Royal LePage, Sutton, Via Capitale, Century 21 et des dizaines d'autres bannières —40chacun avec sa navigation, ses filtres, son format. **Immo-Ka retourne le problème** :41un connecteur par agence visite chaque source, normalise chaque propriété vers un42schéma unique, et détecte les changements en continu.4344> Les sites d'agences n'offrent pas de webhooks. Immo-Ka reproduit l'équivalent :45> **synchronisation périodique + hash de contenu** → ajouts, changements de prix et46> retraits (propriété vendue) détectés automatiquement.4748C'est le pendant « à vendre » de [Lou-Ka](https://www.lou-ka.com) (location) — même49architecture, schéma adapté à la vente.5051## Couverture (métriques en direct)5253| Agence | Propriétés | Méthode technique |54|---|---:|---|55| RE/MAX Québec | ~25 300 | Meilisearch public + sharding FSA postal + page détail |56| Via Capitale | ~5 250 | portail central (Firecrawl stealth, pagination `criteresJson`) |57| Sutton | ~4 500 | sitemap `sitemap_inscription.cfm` → n° Centris |58| Proprio Direct | ~2 440 | API interne JSON |59| Engel & Völkers | ~1 240 | property-sitemap → JSON-LD |60| Royal LePage | ~1 000+ | recherche par ville filtrée QC + sharding + dédup MLS |61| Century 21 | ~1 600 | sous-agences source.immo (« All Quebec ») |62| Keller Williams (Urbain + Distinction) | ~510 | HTML rendu serveur + sitemap |63| Barnes Québec | ~340 | Algolia + page détail |64| Profusion (Christie's) | ~360 | WordPress + JSON-LD |65| M Immobilier · Vendirect · Sotheby's · L'Expert PM | ~180 | Centris / source.immo / JSON-LD |66| Sous-agences RE/MAX / Via Capitale / Century 21 | *backup* | 60+ connecteurs `*_ag_*`, dédup par n° Centris |6768**≈ 40 000 propriétés dédupliquées**, mises à jour automatiquement. Les sous-agences69servent de plan B : si le flux central d'une bannière tombe, elles prennent le relais70sans double-comptage (déduplication par numéro Centris).7172## Architecture7374```mermaid75flowchart LR76    subgraph Sources["Agences de courtage du Québec"]77        S1["RE/MAX · Royal LePage · Sutton<br/>Via Capitale · Century 21 · Proprio Direct<br/>Engel & Völkers · Barnes · Profusion<br/>… 73 connecteurs"]78    end79    subgraph ImmoKa["Immo-Ka"]80        C["Connecteurs<br/><i>1 adaptateur / agence</i>"] --> N["Normalisation<br/><i>schéma PropertyListing</i>"]81        N --> D[("SQLite WAL<br/>hash + diff + dédup Centris")]82        D --> A["API FastAPI<br/>/api/listings · /api/facets · geojson"]83        A --> F["React 18 + Vite + MapLibre<br/>liste · carte · fiche détaillée"]84    end85    W["⏱ Watcher (PM2)"] -.-> C86    S1 --> C87    F --> U["🔑 Acheteur"]88```8990| Couche | Rôle | Fichiers |91|---|---|---|92| **Connecteurs** | 1 module par agence : API JSON interne (Meilisearch, Algolia, source.immo, wp-json), JSON-LD, sitemap, ou Firecrawl pour les sites SPA/anti-bot | `immoka/connectors/*.py` |93| **Schéma** | `PropertyListing` : adresse, secteur, ville, région, type, prix, chambres/SdB, superficie, terrain, année, MLS, courtier, pièces (dimensions), **toutes les photos** | `immoka/schema.py` |94| **Diff engine** | upsert par hash de contenu, délai de grâce, détection de dérive, historique de prix, **déduplication inter-agences par n° Centris** | `immoka/db.py`, `immoka/web.py` |95| **API** | filtres ville/secteur/région/type/agence/prix/chambres, facettes, stats, GeoJSON | `immoka/web.py` |96| **Frontend** | React 18 + Vite + TS + react-router + MapLibre : accueil (liste/carte), fiche par propriété (galerie + lightbox, caractéristiques, pièces, historique de prix, courtier, mini-carte), Stats, Agences | `frontend/` |9798## Démarrage rapide99100```bash101python3 -m venv .venv && .venv/bin/pip install -r requirements.txt102103# frontend104cd frontend && npm install && npm run build && cd ..105106# (optionnel) sites JavaScript / anti-bot107echo "FIRECRAWL_API_KEY=fc-votre-cle" > .env108109.venv/bin/python run.py list              # connecteurs enregistrés110.venv/bin/python run.py sync              # toutes les agences (ou: sync remax_quebec sutton)111.venv/bin/python run.py serve 8090        # API + frontend → http://localhost:8090112.venv/bin/python run.py watch 180         # synchronisation en boucle113```114115## Ajouter une agence1161171. Créer `immoka/connectors/<id>.py` : sous-classe de `BaseConnector`, définir118   `source_id`, implémenter `fetch() -> list[PropertyListing]`. Le registre est119   **auto-découvrant** — aucun fichier partagé à modifier.1202. Ajouter l'entrée dans `data/sources.json`.1213. Tester : `.venv/bin/python run.py sync <id>`.122123Pour une bannière à sous-agences (RE/MAX, Via Capitale, Century 21), un module124génère un connecteur par sous-agence depuis un registre JSON — nommer les125`source_id` en `<banniere>_ag_<slug>` active automatiquement la déduplication.126127## Déploiement128129Déployé sur le cluster MacLustr (nœud M4M64a) via PM2 :130`immo-ka-web` (API + frontend), `immo-ka-sync` (watcher horaire), `immo-ka-ngrok`131(tunnel `www.immo-ka.com`). Base SQLite en mode WAL pour les accès concurrents.132133---134135## Auteur136137**Simon-Pierre Boucher**138📧 [contact@spboucher.ai](mailto:contact@spboucher.ai)139140*Agrégateur indépendant — les annonces proviennent des sites publics des agences de141courtage et sont rafraîchies automatiquement ; chaque fiche renvoie vers l'annonce142originale de l'agence.*143