docs: documentation standardisée des 214 connecteurs (générateur + fiches)
scripts/gen_connector_docs.py : générateur 100 % programmatique et rejouable qui croise data/sources.json, l introspection statique (ast) du code des connecteurs et la BD live (volumétrie, complétude SQL par champ, sync_log). Écrit docs/connecteurs/INDEX.md + une fiche par connecteur (sections fixes : description, accès, champs -> schéma, fréquence & budget, volumétrie, erreurs, licence, historique). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
216 changed files +17,888 −0
added
docs/connecteurs/INDEX.md
+288 −0
@@ -0,0 +1,288 @@ | ||
| 1 | +# Lou-Ka — Index des connecteurs | |
| 2 | + | |
| 3 | +_Généré automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**214 connecteurs documentés** (212 activés, 2 désactivés) · **51247 annonces actives** au total · registre : 275 entrées. | |
| 6 | + | |
| 7 | +| Connecteur | Nom | Région | Type d'accès | Backend | Actives/Total | GPS | Prix | Photos | État | Dernier sync OK | | |
| 8 | +|---|---|---|---|---|---|---|---|---|---|---| | |
| 9 | +| [`aalto`](aalto.md) | Aalto Suites (Zibi / Dream) | Outaouais | API JSON interne du site | direct | 26/33 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 10 | +| [`acceslogis_gb`](acceslogis_gb.md) | Accès Logis GB | Lanaudière / Mauric… | pages HTML (rendu serveur) | direct | 10/11 | 20 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 11 | +| [`agence_sherbrooke`](agence_sherbrooke.md) | Agence de location Sherbrooke (groupe P… | Estrie | sitemap XML + pages HTML | direct | 14/18 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 12 | +| [`akelius`](akelius.md) | Akelius Montréal | Montréal | pages HTML (rendu serveur) | direct | 242/290 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 13 | +| [`alexcellence`](alexcellence.md) | Immeubles Alexcellence | Estrie | pages HTML (rendu serveur) | direct | 6/6 | 50 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 14 | +| [`alias_appartements`](alias_appartements.md) | Alias Appartements | Saguenay–Lac-Saint-… | sitemap XML + pages HTML | direct | 1/1 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 15 | +| [`alouer_sherbrooke`](alouer_sherbrooke.md) | À Louer Sherbrooke | Estrie | API admin-ajax (WordPress) | direct | 1/1 | 0 % | 0 % | 100 % | actif | 2026-08-18 03:15 | | |
| 16 | +| [`app_urbains`](app_urbains.md) | Appartements Urbains | Québec | sitemap XML + pages HTML | direct | 18/21 | 100 % | 83 % | 100 % | actif | 2026-08-18 03:15 | | |
| 17 | +| [`appartements_rimouski`](appartements_rimouski.md) | Appartements Rimouski (Immeubles DTM) | Bas-Saint-Laurent | sitemap XML + pages HTML | direct | 19/20 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 18 | +| [`ascensio`](ascensio.md) | Groupe Ascensio | Estrie | pages HTML (rendu serveur) | direct | 9/10 | 44 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 19 | +| [`atlas_immo`](atlas_immo.md) | Atlas société immobilière | Chaudière-Appalaches | pages HTML (rendu serveur) | direct | 0/0 | — | — | — | actif | 2026-08-18 03:15 | | |
| 20 | +| [`aula`](aula.md) | AULA Lévis | Québec | API REST WordPress (wp-json) | direct | 68/70 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:16 | | |
| 21 | +| [`axia`](axia.md) | Axia Appartements | Montréal | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:16 | | |
| 22 | +| [`barnes_quebec`](barnes_quebec.md) | BARNES Québec (location) | Montréal | API JSON interne du site | direct | 101/103 | 99 % | 98 % | 100 % | actif | 2026-08-18 03:16 | | |
| 23 | +| [`beaudoin`](beaudoin.md) | Société Beaudoin Immobilier | Montréal | API REST WordPress (wp-json) | direct | 12/12 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:16 | | |
| 24 | +| [`beaulieu_groupe`](beaulieu_groupe.md) | Beaulieu Groupe Immobilier (BGI) | Bas-Saint-Laurent | sitemap XML + pages HTML | direct | 4/4 | 100 % | 0 % | 100 % | actif | 2026-08-18 03:16 | | |
| 25 | +| [`bestlife`](bestlife.md) | Les Gestions Bestlife | Estrie | pages HTML (rendu serveur) | direct | 12/13 | 92 % | 100 % | 100 % | actif | 2026-08-18 03:16 | | |
| 26 | +| [`boardwalk`](boardwalk.md) | Boardwalk REIT | Montréal | pages HTML (rendu serveur) | direct | 100/100 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:17 | | |
| 27 | +| [`bons_locataires`](bons_locataires.md) | Bons Locataires | Grand Montréal | sitemap XML + pages HTML | direct | 14/14 | 100 % | 21 % | 93 % | actif | 2026-08-18 03:18 | | |
| 28 | +| [`boreal_abitibi`](boreal_abitibi.md) | Constructions Boréal Abitibi | Abitibi-Témiscaming… | API admin-ajax (WordPress) | direct | 3/5 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 29 | +| [`bribourg`](bribourg.md) | Bribourg | Québec | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 30 | +| [`brigil`](brigil.md) | Brigil | Outaouais | API JSON interne du site | direct | 42/42 | 98 % | 24 % | 100 % | actif | 2026-08-18 03:18 | | |
| 31 | +| [`brio`](brio.md) | Les Immeubles Brio | Québec | pages HTML (rendu serveur) | direct | 3/3 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 32 | +| [`brivia_1sp`](brivia_1sp.md) | Groupe Brivia (1 Square Phillips) | Montréal | API JSON interne du site | direct | 3/3 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 33 | +| [`brochu`](brochu.md) | Groupe Immobilier Brochu | Québec | pages HTML (rendu serveur) | direct | 7/7 | 86 % | 57 % | 100 % | actif | 2026-08-18 03:18 | | |
| 34 | +| [`cap_gestion`](cap_gestion.md) | CAP Gestion (CAP Immobilier) | Laurentides / Lanau… | pages HTML (rendu serveur) | direct | 122/122 | 98 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 35 | +| [`capital_rdr`](capital_rdr.md) | Gestion Capital RDR | Mauricie | sitemap XML + pages HTML | direct | 4/4 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 36 | +| [`capreit`](capreit.md) | CAPREIT | Québec | API admin-ajax (WordPress) | direct | 117/122 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 37 | +| [`carat_immobilier`](carat_immobilier.md) | Carat Immobilier | Abitibi-Témiscaming… | sitemap XML + pages HTML | direct | 3/4 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:18 | | |
| 38 | +| [`centurion`](centurion.md) | Centurion / CP Living (Quartier QB) | Québec | API JSON interne du site | direct | 4/4 | 100 % | 75 % | 100 % | actif | 2026-08-18 03:18 | | |
| 39 | +| [`cite_immobilier`](cite_immobilier.md) | Cité Immobilier | Centre-du-Québec | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 0 % | 0 % | actif | 2026-08-18 03:18 | | |
| 40 | +| [`cogir`](cogir.md) | Cogir Immobilier | Québec | pages HTML (rendu serveur) | direct | 285/300 | 89 % | 96 % | 100 % | actif | 2026-08-18 03:20 | | |
| 41 | +| [`contraste`](contraste.md) | Contraste Immobilier | Québec | pages HTML (rendu serveur) | direct | 221/234 | 100 % | 86 % | 100 % | actif | 2026-08-18 03:21 | | |
| 42 | +| [`copley`](copley.md) | Groupe Copley | Montréal | pages HTML (rendu serveur) | direct | 52/52 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:21 | | |
| 43 | +| [`cosoltec`](cosoltec.md) | Cosoltec (Evado, Le Monroe, Natür) | Laurentides | API JSON interne du site | direct | 44/52 | 98 % | 80 % | 100 % | actif | 2026-08-18 03:21 | | |
| 44 | +| [`courtemanche`](courtemanche.md) | Gestion Immobilière Courtemanche | Saguenay–Lac-Saint-… | sitemap XML + pages HTML | direct | 0/0 | — | — | — | actif | 2026-08-18 03:21 | | |
| 45 | +| [`cromwell`](cromwell.md) | Cromwell Management | Montréal | pages HTML (rendu serveur) | direct | 12/12 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:21 | | |
| 46 | +| [`denux`](denux.md) | Groupe Denux | Montréal | API JSON interne du site | direct | 18/18 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:21 | | |
| 47 | +| [`desmarais`](desmarais.md) | Immeubles Desmarais | Outaouais | pages HTML (rendu serveur) | direct | 14/14 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:21 | | |
| 48 | +| [`desroches`](desroches.md) | Immeubles Claude Desroches | Montérégie | pages HTML (rendu serveur) | direct | 6/6 | 100 % | 100 % | 50 % | actif | 2026-08-18 03:21 | | |
| 49 | +| [`devcore`](devcore.md) | Devcore Group | Côte-Nord | API REST WordPress (wp-json) | direct | 14/14 | 0 % | 7 % | 100 % | actif | 2026-08-18 03:22 | | |
| 50 | +| [`devimco`](devimco.md) | Devimco Appartements | Montréal | API JSON interne du site | direct | 480/575 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:22 | | |
| 51 | +| [`dma_locago`](dma_locago.md) | DMA / Locago (Douville, Moffet & Associ… | Québec | pages HTML (rendu serveur) | direct | 118/124 | 29 % | 98 % | 100 % | actif | 2026-08-18 03:23 | | |
| 52 | +| [`duproprio`](duproprio.md) | DuProprio (location) | Province | sitemap XML + pages HTML | direct | 3890/3896 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:23 | | |
| 53 | +| [`dynamic`](dynamic.md) | Gestion immobilière Dynamic | Estrie | pages HTML (rendu serveur) | direct | 48/53 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 54 | +| [`edifia`](edifia.md) | Edifia Groupe Immobilier | Québec | pages HTML (rendu serveur) | direct | 180/185 | 100 % | 93 % | 100 % | actif | 2026-08-18 03:24 | | |
| 55 | +| [`elements`](elements.md) | Quartier les Éléments | Québec | pages HTML (rendu serveur) | direct | 2/4 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:24 | | |
| 56 | +| [`elite`](elite.md) | Elite Immobilier | Outaouais | pages HTML (rendu serveur) | direct | 12/12 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:24 | | |
| 57 | +| [`elk`](elk.md) | ELK Property Management | Outaouais | pages HTML (rendu serveur) | direct | 3/3 | 67 % | 100 % | 100 % | actif | 2026-08-18 03:24 | | |
| 58 | +| [`equinoxe_batimo`](equinoxe_batimo.md) | Batimo/EMD — Collection Équinoxe | Montréal | API admin-ajax (WordPress) | direct | 615/662 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:26 | | |
| 59 | +| [`evoludev`](evoludev.md) | Groupe Evoludev | Lanaudière | pages HTML (rendu serveur) | direct | 134/134 | 100 % | 99 % | 100 % | actif | 2026-08-18 03:26 | | |
| 60 | +| [`fb_marketplace`](fb_marketplace.md) | Facebook Marketplace (location) | Province | pages HTML (rendu serveur) | direct | 2107/5142 | 15 % | 100 % | 100 % | actif | 2026-08-18 02:58 | | |
| 61 | +| [`ferrovia`](ferrovia.md) | Ferrovia (condos locatifs Mirabel) | Laurentides | pages HTML (rendu serveur) | direct | 23/24 | 0 % | 0 % | 0 % | actif | 2026-08-18 01:37 | | |
| 62 | +| [`firma`](firma.md) | Groupe Firma | Montréal | API REST WordPress (wp-json) | direct | 12/12 | 75 % | 8 % | 100 % | actif | 2026-08-18 01:37 | | |
| 63 | +| [`floria`](floria.md) | Gestion Floria | Estrie | pages HTML (rendu serveur) | direct | 21/21 | 100 % | 24 % | 95 % | actif | 2026-08-18 01:38 | | |
| 64 | +| [`forsa`](forsa.md) | Gestion immobilière Forsa | Lanaudière | pages HTML (rendu serveur) | direct | 13/13 | 92 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 65 | +| [`fournelle`](fournelle.md) | Appartements Fournelle (Groupe Fournell… | Centre-du-Québec | pages HTML (rendu serveur) | direct | 4/4 | 0 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 66 | +| [`garic`](garic.md) | Garic Gestion Immobilière | Outaouais | API admin-ajax (WordPress) | direct | 45/54 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 67 | +| [`gesteco`](gesteco.md) | Gesteco | Montérégie | API JSON interne du site | direct | 10/14 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 68 | +| [`gestimmo_estrie`](gestimmo_estrie.md) | Gestimmo Estrie | Estrie | pages HTML (rendu serveur) | direct | 41/41 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 69 | +| [`gestion_fauvel`](gestion_fauvel.md) | Gestion Fauvel | Centre-du-Québec | pages HTML (rendu serveur) | direct | 11/11 | 91 % | 91 % | 100 % | actif | 2026-08-18 01:38 | | |
| 70 | +| [`gestion_habitation`](gestion_habitation.md) | Gestion Habitation | Abitibi-Témiscaming… | sitemap XML + pages HTML | direct | 4/4 | 0 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 71 | +| [`gestion_isr`](gestion_isr.md) | Gestion ISR | Centre-du-Québec | pages HTML (rendu serveur) | direct | 20/22 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 72 | +| [`gestion_jdm`](gestion_jdm.md) | JDM Gestion immobilière | Bas-Saint-Laurent | sitemap XML + pages HTML | direct | 2/2 | 100 % | 0 % | 100 % | actif | 2026-08-18 01:38 | | |
| 73 | +| [`gestion_laprise`](gestion_laprise.md) | Gestion Laprise | Côte-Nord | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 50 % | 100 % | actif | 2026-08-18 01:38 | | |
| 74 | +| [`gestion_legrand`](gestion_legrand.md) | Gestion Le Grand | Centre-du-Québec | API REST WordPress (wp-json) | direct | 5/5 | 40 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 75 | +| [`gestion_montreal`](gestion_montreal.md) | Gestion Montréal | Montréal | pages HTML (rendu serveur) | direct | 22/24 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 76 | +| [`gestion_tb`](gestion_tb.md) | Gestion TB (portail Appartements TB) | Centre-du-Québec | pages HTML (rendu serveur) | direct | 31/35 | 0 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 77 | +| [`gestion_valco`](gestion_valco.md) | Gestion Valco | Mauricie | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 0 % | 50 % | actif | 2026-08-18 01:38 | | |
| 78 | +| [`gestipro`](gestipro.md) | Gestipro | Québec | pages HTML (rendu serveur) | direct | 98/116 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 79 | +| [`gia_t`](gia_t.md) | GIA-T — Gestion Immobilière Abitibi-Tém… | Abitibi-Témiscaming… | pages HTML (rendu serveur) | direct | 3/4 | 67 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 80 | +| [`gimcote`](gimcote.md) | GIM Côté | Québec | pages HTML (rendu serveur) | direct | 85/89 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 81 | +| [`gio`](gio.md) | Gestion Immobilière de l'Outaouais (GIO) | Outaouais | pages HTML (rendu serveur) | direct | 5/5 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 82 | +| [`girescom`](girescom.md) | Girescom gestion immobilière | Québec | pages HTML (rendu serveur) | direct | 40/41 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:38 | | |
| 83 | +| [`girs`](girs.md) | GIRS — Gestion Immobilière de la Rive S… | Chaudière-Appalaches | sitemap XML + pages HTML | direct | 8/8 | 100 % | 0 % | 100 % | actif | 2026-08-18 01:38 | | |
| 84 | +| [`gparadis`](gparadis.md) | GParadis | Québec | pages HTML (rendu serveur) | direct | 22/22 | 82 % | 0 % | 100 % | actif | 2026-08-18 01:39 | | |
| 85 | +| [`groupe_dallaire`](groupe_dallaire.md) | Groupe Dallaire (Faubourg du Moulin) | Québec | API admin-ajax (WordPress) | Scrapfly | 255/259 | 100 % | 100 % | 100 % | actif (dégradé) | 2026-08-18 01:44 | | |
| 86 | +| [`groupe_jacques`](groupe_jacques.md) | Groupe Jacques | Centre-du-Québec | pages HTML (rendu serveur) | direct | 10/11 | 100 % | 60 % | 100 % | actif | 2026-08-18 01:39 | | |
| 87 | +| [`groupe_maurice`](groupe_maurice.md) | Le Groupe Maurice | Province | API REST WordPress (wp-json) | direct | 203/203 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:40 | | |
| 88 | +| [`groupe_robin`](groupe_robin.md) | Groupe Robin | Mauricie | API admin-ajax (WordPress) | direct | 72/74 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:40 | | |
| 89 | +| [`groupe_theoret`](groupe_theoret.md) | Groupe Théorêt (Gestion Immobilière) | Mauricie | pages HTML (rendu serveur) | direct | 24/24 | 83 % | 100 % | 0 % | actif | 2026-08-18 01:40 | | |
| 90 | +| [`habitations_jeanne`](habitations_jeanne.md) | Les Habitations Jeanne | Côte-Nord | sitemap XML + pages HTML | direct | 14/14 | 100 % | 0 % | 100 % | actif | 2026-08-18 01:40 | | |
| 91 | +| [`habitations_sf`](habitations_sf.md) | Les Habitations SF (S&F Gestion) | Lanaudière | pages HTML (rendu serveur) | direct | 7/7 | 43 % | 86 % | 100 % | actif | 2026-08-18 01:40 | | |
| 92 | +| [`halfred`](halfred.md) | Halfred | Outaouais | pages HTML (rendu serveur) | direct | 164/169 | 93 % | 100 % | 100 % | actif | 2026-08-18 01:41 | | |
| 93 | +| [`hazelview`](hazelview.md) | Hazelview Properties | Montréal | API JSON interne du site | direct | 6/6 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:41 | | |
| 94 | +| [`headway`](headway.md) | La Corporation Headway | Québec | pages HTML (rendu serveur) | direct | 7/7 | 86 % | 0 % | 100 % | actif | 2026-08-18 01:41 | | |
| 95 | +| [`heafey`](heafey.md) | Groupe Heafey (Le We 2, Le We 3, Loggia… | Outaouais | API JSON interne du site | direct | 246/255 | 15 % | 0 % | 100 % | actif | 2026-08-18 01:41 | | |
| 96 | +| [`hestia`](hestia.md) | Hestia Groupe immobilier | Mauricie | pages HTML (rendu serveur) | direct | 3/3 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:41 | | |
| 97 | +| [`huma`](huma.md) | HUMĀ Condos locatifs | Québec | pages HTML (rendu serveur) | direct | 38/38 | 26 % | 0 % | 100 % | actif | 2026-08-18 01:42 | | |
| 98 | +| [`immeubles_aeb`](immeubles_aeb.md) | Immeubles AEB | Saguenay–Lac-Saint-… | pages HTML (rendu serveur) | direct | 26/26 | 100 % | 100 % | 81 % | actif | 2026-08-18 01:42 | | |
| 99 | +| [`immeubles_bc`](immeubles_bc.md) | Les Immeubles Beaulieu et Collin | Bas-Saint-Laurent | sitemap XML + pages HTML | direct | 20/26 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 100 | +| [`immeubles_bois`](immeubles_bois.md) | Les Immeubles Bois | Bas-Saint-Laurent | pages HTML (rendu serveur) | direct | 23/23 | 83 % | 0 % | 100 % | actif | 2026-08-18 01:42 | | |
| 101 | +| [`immeubles_db`](immeubles_db.md) | Les Immeubles D.B. Busque-Massé | Estrie | pages HTML (rendu serveur) | direct | 13/13 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 102 | +| [`immeubles_dcl`](immeubles_dcl.md) | Les Immeubles DCL | Abitibi-Témiscaming… | pages HTML (rendu serveur) | direct | 8/11 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 103 | +| [`immeubles_guillot`](immeubles_guillot.md) | Les Immeubles Guillot | Québec | pages HTML (rendu serveur) | direct | 7/7 | 57 % | 0 % | 100 % | actif | 2026-08-18 01:42 | | |
| 104 | +| [`immeubles_ouellet`](immeubles_ouellet.md) | Les Immeubles Vianney Ouellet & Fils | Bas-Saint-Laurent | pages HTML (rendu serveur) | direct | 1/1 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 105 | +| [`immeubles_pm`](immeubles_pm.md) | Les Immeubles PM | Estrie | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 106 | +| [`immnasr`](immnasr.md) | Les Immeubles Michel Nazair | Outaouais | pages HTML (rendu serveur) | direct | 3/3 | 67 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 107 | +| [`immobilia`](immobilia.md) | Immobilia Rimouski | Bas-Saint-Laurent | pages HTML (rendu serveur) | direct | 1/2 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 108 | +| [`immogex`](immogex.md) | Immogex | Centre-du-Québec | pages HTML (rendu serveur) | direct | 3/3 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:42 | | |
| 109 | +| [`immomarketing`](immomarketing.md) | IMMOMARKETING (Immoappart) | Québec | pages HTML (rendu serveur) | direct | 84/90 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:43 | | |
| 110 | +| [`immostar`](immostar.md) | Immostar | Québec | API REST WordPress (wp-json) | direct | 156/165 | 72 % | 99 % | 100 % | actif | 2026-08-18 01:43 | | |
| 111 | +| [`info_logement`](info_logement.md) | Info-Logement | Lanaudière | pages HTML (rendu serveur) | direct | 50/56 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:43 | | |
| 112 | +| [`interrent`](interrent.md) | InterRent REIT (CLV Group) | Montréal | pages HTML (rendu serveur) | direct | 200/211 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:43 | | |
| 113 | +| [`jutras`](jutras.md) | Habitations Jutras | Centre-du-Québec | pages HTML (rendu serveur) | direct | 35/35 | 0 % | 54 % | 100 % | actif | 2026-08-18 01:44 | | |
| 114 | +| [`kangalou`](kangalou.md) | Kangalou | Province | API JSON interne du site | direct | 7916/7916 | 100 % | 100 % | 99 % | actif | 2026-08-18 03:09 | | |
| 115 | +| [`kass`](kass.md) | KASS Property Management | Outaouais | pages HTML (rendu serveur) | direct | 4/4 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:44 | | |
| 116 | +| [`katasa`](katasa.md) | Groupe Katasa | Outaouais | pages HTML (rendu serveur) | direct | 4/4 | 0 % | 100 % | 100 % | actif | 2026-08-18 01:44 | | |
| 117 | +| [`kijiji`](kijiji.md) | Kijiji Québec (location) | Province | pages HTML (rendu serveur) | direct | 5276/7407 | 100 % | 97 % | 99 % | actif | 2026-08-18 01:53 | | |
| 118 | +| [`la_cour`](la_cour.md) | La Cour Appartements | Québec | API REST WordPress (wp-json) | direct | 20/21 | 100 % | 100 % | 100 % | actif | 2026-08-18 03:15 | | |
| 119 | +| [`laberge`](laberge.md) | Groupe Laberge | Québec | pages HTML (rendu serveur) | direct | 55/58 | 93 % | 100 % | 100 % | actif | 2026-08-18 01:53 | | |
| 120 | +| [`labonte`](labonte.md) | Gestion Labonté | Estrie | pages HTML (rendu serveur) | direct | 18/18 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:53 | | |
| 121 | +| [`lachance`](lachance.md) | Les Entreprises Lachance | Estrie | sitemap XML + pages HTML | direct | 65/86 | 95 % | 100 % | 100 % | actif | 2026-08-18 01:54 | | |
| 122 | +| [`lacite`](lacite.md) | La Cité Gatineau (Adam Real Estate) | Outaouais | pages HTML (rendu serveur) | direct | 6/7 | 0 % | 0 % | 100 % | actif | 2026-08-18 01:57 | | |
| 123 | +| [`lafrance_mathieu`](lafrance_mathieu.md) | Lafrance & Mathieu | Québec | pages HTML (rendu serveur) | direct | 37/40 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:57 | | |
| 124 | +| [`lakle`](lakle.md) | La Klé | Québec | API REST WordPress (wp-json) | direct | 45/49 | 100 % | 56 % | 96 % | actif | 2026-08-18 01:58 | | |
| 125 | +| [`lambert`](lambert.md) | Société Immobilière Lambert | Mauricie | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 50 % | 100 % | actif | 2026-08-18 01:58 | | |
| 126 | +| [`laureat_richard`](laureat_richard.md) | Logements Lauréat Richard | Estrie | pages HTML (rendu serveur) | direct | 23/23 | 100 % | 0 % | 100 % | actif | 2026-08-18 01:58 | | |
| 127 | +| [`le_baronet`](le_baronet.md) | Le Baronet | Chaudière-Appalaches | sitemap XML + pages HTML | direct | 3/3 | 0 % | 100 % | 100 % | actif | 2026-08-18 01:58 | | |
| 128 | +| [`le_st_georges`](le_st_georges.md) | Le St-Georges | Chaudière-Appalaches | API REST WordPress (wp-json) | direct | 4/4 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:58 | | |
| 129 | +| [`leclif`](leclif.md) | Le Clif | Québec | pages HTML (rendu serveur) | direct | 9/9 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:58 | | |
| 130 | +| [`ledomaine`](ledomaine.md) | Les Habitations Le Domaine | Montréal | pages HTML (rendu serveur) | direct | 5/5 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:58 | | |
| 131 | +| [`lelaureat`](lelaureat.md) | Résidences Le Lauréat | Estrie | pages HTML (rendu serveur) | direct | 5/5 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:58 | | |
| 132 | +| [`lequerre`](lequerre.md) | Habitations L'Équerre | Estrie | pages HTML (rendu serveur) | direct | 1/1 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:58 | | |
| 133 | +| [`lespac`](lespac.md) | LesPAC (location) | Province | pages HTML (rendu serveur) | direct | 2253/2566 | 47 % | 87 % | 93 % | actif | 2026-08-17 22:44 | | |
| 134 | +| [`leviu`](leviu.md) | Le VIU / VIU2 (Groupe Heafey) | Outaouais | pages HTML (rendu serveur) | direct | 2/2 | 0 % | 100 % | 100 % | actif | 2026-08-17 22:44 | | |
| 135 | +| [`location_di`](location_di.md) | Location DI (Groupe Sphère DI) | Mauricie / Lanaudiè… | pages HTML (rendu serveur) | direct | 9/12 | 100 % | 100 % | 100 % | actif | 2026-08-17 22:44 | | |
| 136 | +| [`location_saguenay`](location_saguenay.md) | Location Saguenay | Saguenay–Lac-Saint-… | pages HTML (rendu serveur) | direct | 21/21 | 76 % | 0 % | 100 % | actif | 2026-08-17 22:45 | | |
| 137 | +| [`loftsmtl`](loftsmtl.md) | Lofts MTL | Montréal | API JSON interne du site | direct | 9/9 | 100 % | 100 % | 100 % | actif | 2026-08-17 22:45 | | |
| 138 | +| [`logement_mauricie`](logement_mauricie.md) | Logement Mauricie (regroupement de prop… | Mauricie | pages HTML (rendu serveur) | direct | 1/1 | 100 % | 100 % | 100 % | actif | 2026-08-17 22:45 | | |
| 139 | +| [`logis_experts`](logis_experts.md) | Logis-Experts | Québec | API JSON interne du site | direct | 498/517 | 100 % | 100 % | 39 % | actif | 2026-08-17 22:45 | | |
| 140 | +| [`logisbourg`](logisbourg.md) | Logisbourg | Québec | pages HTML (rendu serveur) | direct | 11/14 | 100 % | 100 % | 100 % | actif | 2026-08-17 22:45 | | |
| 141 | +| [`logisco`](logisco.md) | Logisco | Québec | pages HTML (rendu serveur) | direct | 157/174 | 99 % | 100 % | 100 % | actif | 2026-08-17 22:45 | | |
| 142 | +| [`logisma`](logisma.md) | Logisma | Québec | API REST WordPress (wp-json) | direct | 15/19 | 80 % | 100 % | 100 % | actif | 2026-08-17 22:45 | | |
| 143 | +| [`logispro`](logispro.md) | LogisPro Rimouski | Bas-Saint-Laurent | sitemap XML + pages HTML | direct | 4/4 | 100 % | 75 % | 100 % | actif | 2026-08-17 22:45 | | |
| 144 | +| [`logisquebec`](logisquebec.md) | LogisQuébec | Province | sitemap XML + pages HTML | direct | 6393/6396 | 100 % | 100 % | 100 % | actif | 2026-08-18 02:51 | | |
| 145 | +| [`lokalia`](lokalia.md) | Espaces Lokalia | Québec | API admin-ajax (WordPress) | direct | 131/135 | 100 % | 82 % | 100 % | actif | 2026-08-17 23:06 | | |
| 146 | +| [`louer_ca`](louer_ca.md) | Louer.ca | Province | API GraphQL interne | direct | 4370/5321 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:14 | | |
| 147 | +| [`louer_saguenay`](louer_saguenay.md) | Louer Saguenay | Saguenay–Lac-Saint-… | sitemap XML + pages HTML | direct | 5/5 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:14 | | |
| 148 | +| [`louis14`](louis14.md) | Quartier Louis Quatorze (Groupe Damco) | Québec | pages HTML (rendu serveur) | direct | 18/18 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:14 | | |
| 149 | +| [`lr_gestion`](lr_gestion.md) | LR Gestion immobilière (LR Location) | Outaouais | pages HTML (rendu serveur) | direct | 111/116 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:14 | | |
| 150 | +| [`luxuor`](luxuor.md) | Les Immeubles Luxuor | Saguenay–Lac-Saint-… | pages HTML (rendu serveur) | direct | 4/4 | 75 % | 0 % | 100 % | actif | 2026-08-17 23:14 | | |
| 151 | +| [`lynk_olymbec`](lynk_olymbec.md) | Lynk (Olymbec) | Montréal | pages HTML (rendu serveur) | Firecrawl | 4/4 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:14 | | |
| 152 | +| [`m_immobilier`](m_immobilier.md) | M Immobilier (location) | Montréal | pages HTML (rendu serveur) | direct | 192/198 | 59 % | 100 % | 100 % | actif | 2026-08-17 23:14 | | |
| 153 | +| [`majestic`](majestic.md) | Le Majestic du Lac Boivin | Montérégie | pages HTML (rendu serveur) | direct | 1/1 | 100 % | 100 % | 0 % | actif | 2026-08-17 23:14 | | |
| 154 | +| [`matinale`](matinale.md) | Gestion Matinale | Estrie | pages HTML (rendu serveur) | direct | 44/45 | 57 % | 100 % | 100 % | actif | 2026-08-17 23:15 | | |
| 155 | +| [`may_bourg`](may_bourg.md) | Gestion May Bourg | Centre-du-Québec | API REST WordPress (wp-json) | direct | 6/7 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:15 | | |
| 156 | +| [`medway`](medway.md) | Groupe Medway | Bas-Saint-Laurent | pages HTML (rendu serveur) | direct | 488/498 | 91 % | 100 % | 100 % | actif | 2026-08-17 23:16 | | |
| 157 | +| [`mellem`](mellem.md) | Mellem (Groupe Mach) | Outaouais | sitemap XML + pages HTML | direct | 78/87 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:16 | | |
| 158 | +| [`mercini`](mercini.md) | Groupe Mercini (Gestion Faleschini Merc… | Québec | pages HTML (rendu serveur) | direct | 47/52 | 94 % | 100 % | 100 % | actif | 2026-08-17 23:16 | | |
| 159 | +| [`metcap`](metcap.md) | MetCap Living | Montréal | pages HTML (rendu serveur) | direct | 8/8 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:16 | | |
| 160 | +| [`minto`](minto.md) | Minto Apartments | Montréal | pages HTML (rendu serveur) | direct | 19/20 | 84 % | 100 % | 100 % | actif | 2026-08-17 23:16 | | |
| 161 | +| [`mkar`](mkar.md) | Gestion Immobilière MKAR | Saguenay–Lac-Saint-… | sitemap XML + pages HTML | direct | 5/5 | 100 % | 0 % | 100 % | actif | 2026-08-17 23:16 | | |
| 162 | +| [`moderno`](moderno.md) | Moderno Construction | Lanaudière | pages HTML (rendu serveur) | direct | 7/7 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:16 | | |
| 163 | +| [`mondev`](mondev.md) | Mondev | Montréal | pages HTML (rendu serveur) | direct | 47/49 | 49 % | 100 % | 100 % | actif | 2026-08-17 23:17 | | |
| 164 | +| [`montagnais`](montagnais.md) | Le Montagnais, résidences étudiantes | Estrie | API admin-ajax (WordPress) | direct | 31/31 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:17 | | |
| 165 | +| [`morin`](morin.md) | Constructions Morin | Estrie | pages HTML (rendu serveur) | direct | 6/7 | 83 % | 100 % | 100 % | actif | 2026-08-17 23:17 | | |
| 166 | +| [`msi`](msi.md) | MSI Gestion immobilière | Québec | pages HTML (rendu serveur) | direct | 96/105 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:18 | | |
| 167 | +| [`multi_logis`](multi_logis.md) | Multi-Logis | Côte-Nord | sitemap XML + pages HTML | direct | 27/27 | 100 % | 96 % | 70 % | actif | 2026-08-17 23:18 | | |
| 168 | +| [`niddamour`](niddamour.md) | Nid d'Amour | Montréal | API JSON interne du site | direct | 14/14 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:18 | | |
| 169 | +| [`novelo`](novelo.md) | Les Appartements Novelo | Saguenay–Lac-Saint-… | sitemap XML + pages HTML | direct | 4/4 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:18 | | |
| 170 | +| [`oklouer`](oklouer.md) | OK Louer (location temporaire) | Québec | pages HTML (rendu serveur) | direct | 41/41 | 95 % | 100 % | 100 % | actif | 2026-08-17 23:18 | | |
| 171 | +| [`omhm`](omhm.md) | OMHM — logements abordables | Montréal | pages HTML (rendu serveur) | direct | 3/3 | 0 % | 100 % | 0 % | actif | 2026-08-17 23:18 | | |
| 172 | +| [`osgoode`](osgoode.md) | Osgoode Properties | Outaouais | API JSON interne du site | direct | 4/4 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:18 | | |
| 173 | +| [`oxford`](oxford.md) | Appartements Oxford | Estrie | pages HTML (rendu serveur) | direct | 2/2 | 0 % | 100 % | 100 % | actif | 2026-08-17 23:19 | | |
| 174 | +| [`per`](per.md) | Les Immeubles Paul-E. Richard | Québec | pages HTML (rendu serveur) | direct | 3/3 | 67 % | 100 % | 100 % | actif | 2026-08-17 23:19 | | |
| 175 | +| [`picard`](picard.md) | Picard Immobilier | Québec | pages HTML (rendu serveur) | direct | 34/34 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:19 | | |
| 176 | +| [`place_florimay`](place_florimay.md) | Place Florimay | Chaudière-Appalaches | API REST WordPress (wp-json) | direct | 0/0 | — | — | — | actif | 2026-08-17 23:19 | | |
| 177 | +| [`plan_a`](plan_a.md) | Plan A Immobilier | Montréal | pages HTML (rendu serveur) | direct | 11/11 | 91 % | 91 % | 100 % | actif | 2026-08-17 23:19 | | |
| 178 | +| [`progim`](progim.md) | Progim | Montréal | pages HTML (rendu serveur) | direct | 62/68 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:19 | | |
| 179 | +| [`projection_immo`](projection_immo.md) | Projection Immobilière | Bas-Saint-Laurent | sitemap XML + pages HTML | direct | 1/1 | 100 % | 0 % | 100 % | actif | 2026-08-17 23:19 | | |
| 180 | +| [`promenade_des_forts`](promenade_des_forts.md) | Promenade des Forts | Québec | pages HTML (rendu serveur) | direct | 2/2 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:20 | | |
| 181 | +| [`proprio_direct`](proprio_direct.md) | Proprio Direct (location) | Province | API JSON interne du site | direct | 190/190 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:20 | | |
| 182 | +| [`quanta`](quanta.md) | Gestion Quanta | Outaouais | pages HTML (rendu serveur) | direct | 2/2 | 0 % | 100 % | 100 % | actif | 2026-08-17 23:20 | | |
| 183 | +| [`quartier_mosaique`](quartier_mosaique.md) | Quartier Mosaïque (Constrobourg) | Québec | pages HTML (rendu serveur) | direct | 24/24 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:20 | | |
| 184 | +| [`quartier_oree`](quartier_oree.md) | Quartier Orée | Chaudière-Appalaches | pages HTML (rendu serveur) | direct | 31/31 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:20 | | |
| 185 | +| [`quartier_plus`](quartier_plus.md) | Le Quartier Plus | Chaudière-Appalaches | sitemap XML + pages HTML | direct | 59/59 | 100 % | 0 % | 100 % | actif | 2026-08-17 23:20 | | |
| 186 | +| [`quartier_sila`](quartier_sila.md) | Quartier Sila | Québec | pages HTML (rendu serveur) | direct | 199/200 | 100 % | 26 % | 100 % | actif | 2026-08-17 23:20 | | |
| 187 | +| [`realstar`](realstar.md) | Realstar | Montréal | API JSON interne du site | direct | 9/9 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:20 | | |
| 188 | +| [`remax_quebec`](remax_quebec.md) | RE/MAX Québec (location) | Province | pages HTML (rendu serveur) | direct | 3239/3373 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:23 | | |
| 189 | +| [`rentals_ca`](rentals_ca.md) | Rentals.ca (Québec) | Province | API GraphQL interne | Scrapfly | 3452/3452 | 100 % | 100 % | 86 % | actif | 2026-08-18 03:14 | | |
| 190 | +| [`rentalys`](rentalys.md) | Rentalys | Montréal | pages HTML (rendu serveur) | direct | 10/10 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:23 | | |
| 191 | +| [`rivero`](rivero.md) | Le Rivero | Québec | pages HTML (rendu serveur) | direct | 0/214 | — | — | — | désactivé (disabled=True) | — | | |
| 192 | +| [`roomies`](roomies.md) | Roomies.ca | Province | sitemap XML + pages HTML | direct | 276/276 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:24 | | |
| 193 | +| [`roussin`](roussin.md) | Immeubles Roussin | Québec | pages HTML (rendu serveur) | direct | 36/36 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:24 | | |
| 194 | +| [`royal_lepage`](royal_lepage.md) | Royal LePage (location) | Province | pages HTML (rendu serveur) | direct | 952/1043 | 100 % | 100 % | 100 % | actif | 2026-08-18 01:56 | | |
| 195 | +| [`savouet`](savouet.md) | Groupe Savouet | Estrie | pages HTML (rendu serveur) | direct | 15/17 | 93 % | 100 % | 100 % | actif | 2026-08-17 23:25 | | |
| 196 | +| [`sdg`](sdg.md) | SDG Immobilier | Québec | pages HTML (rendu serveur) | direct | 9/11 | 89 % | 0 % | 100 % | actif | 2026-08-17 23:25 | | |
| 197 | +| [`sentinelle`](sentinelle.md) | La Sentinelle (Groupe Immobilier Brochu) | Québec | pages HTML (rendu serveur) | direct | 10/11 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:25 | | |
| 198 | +| [`sgiq`](sgiq.md) | SGIQ (Société de gestion immobilière du… | Québec | pages HTML (rendu serveur) | direct | 147/147 | 99 % | 100 % | 100 % | actif | 2026-08-17 23:26 | | |
| 199 | +| [`shdm`](shdm.md) | SHDM | Montréal | API GraphQL interne | direct | 2/21 | 50 % | 100 % | 100 % | actif | 2026-08-17 23:26 | | |
| 200 | +| [`siagi`](siagi.md) | SIA Gestion Immobilière | Estrie | pages HTML (rendu serveur) | direct | 6/6 | 100 % | 100 % | 0 % | actif | 2026-08-17 23:26 | | |
| 201 | +| [`sibelanger`](sibelanger.md) | Société immobilière Bélanger | Québec | pages HTML (rendu serveur) | direct | 12/19 | 83 % | 100 % | 100 % | actif | 2026-08-17 23:26 | | |
| 202 | +| [`sig`](sig.md) | Société d'investissement Gilbert (résid… | Québec | pages HTML (rendu serveur) | direct | 4/4 | 75 % | 100 % | 100 % | actif | 2026-08-17 23:26 | | |
| 203 | +| [`simard`](simard.md) | Immeubles Simard | Québec | pages HTML (rendu serveur) | direct | 5/5 | 20 % | 40 % | 100 % | actif | 2026-08-17 23:26 | | |
| 204 | +| [`somex_saintnicolas`](somex_saintnicolas.md) | Somex Saint-Nicolas | Québec | pages HTML (rendu serveur) | direct | 145/145 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:26 | | |
| 205 | +| [`souleymane`](souleymane.md) | Gestion Souleymane | Outaouais | pages HTML (rendu serveur) | direct | 13/14 | 92 % | 100 % | 100 % | actif | 2026-08-17 23:26 | | |
| 206 | +| [`stb_immobilier`](stb_immobilier.md) | STB Immobilier | Bas-Saint-Laurent | sitemap XML + pages HTML | direct | 11/11 | 91 % | 73 % | 100 % | actif | 2026-08-17 23:26 | | |
| 207 | +| [`summum`](summum.md) | Gestion immobilière Summum | Laurentides | pages HTML (rendu serveur) | direct | 89/95 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:26 | | |
| 208 | +| [`sutton`](sutton.md) | Groupe Sutton Québec (location) | Province | sitemap XML + pages HTML | direct | 1224/1392 | 70 % | 73 % | 73 % | actif | 2026-08-17 23:27 | | |
| 209 | +| [`terater`](terater.md) | Les Constructions Tèratèr | Estrie | pages HTML (rendu serveur) | direct | 12/14 | 67 % | 100 % | 100 % | actif | 2026-08-17 23:27 | | |
| 210 | +| [`terra`](terra.md) | Terra Condos locatifs | Québec | pages HTML (rendu serveur) | direct | 29/51 | 100 % | 90 % | 100 % | actif | 2026-08-17 23:27 | | |
| 211 | +| [`thrace`](thrace.md) | Gestions Thrace | Mauricie | sitemap XML + pages HTML | direct | 172/182 | 100 % | 66 % | 100 % | actif | 2026-08-17 23:27 | | |
| 212 | +| [`tri_logis`](tri_logis.md) | Société immobilière Tri-Logis | Abitibi-Témiscaming… | pages HTML (rendu serveur) | direct | 0/1 | — | — | — | actif | 2026-08-17 23:27 | | |
| 213 | +| [`trudel`](trudel.md) | Trudel (Fleur de Lys, LGC) | Québec | pages HTML (rendu serveur) | direct | 0/30 | — | — | — | désactivé (disabled=True) | — | | |
| 214 | +| [`trylon`](trylon.md) | Trylon Apartments | Montréal | pages HTML (rendu serveur) | direct | 7/7 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:27 | | |
| 215 | +| [`ubee`](ubee.md) | Ubee (location) | Province | API JSON interne du site | direct | 243/246 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:27 | | |
| 216 | +| [`uptimo`](uptimo.md) | Uptimo Gestion immobilière | Estrie | pages HTML (rendu serveur) | direct | 62/78 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:27 | | |
| 217 | +| [`urban_services`](urban_services.md) | Urban Services (Urban Tenant Solutions) | Outaouais | pages HTML (rendu serveur) | direct | 52/56 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:27 | | |
| 218 | +| [`utile`](utile.md) | UTILE (logement étudiant) | Montréal | pages HTML (rendu serveur) | direct | 28/28 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:27 | | |
| 219 | +| [`via_capitale`](via_capitale.md) | Via Capitale (location) | Province | pages HTML (rendu serveur) | Firecrawl | 193/211 | 54 % | 100 % | 100 % | actif | 2026-08-17 23:28 | | |
| 220 | +| [`viridi`](viridi.md) | Le Viridi | Québec | pages HTML (rendu serveur) | direct | 16/17 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:28 | | |
| 221 | +| [`wandji`](wandji.md) | Gestion Immobilière Wandji | Outaouais | API JSON interne du site | direct | 25/30 | 100 % | 100 % | 100 % | actif | 2026-08-17 23:28 | | |
| 222 | +| [`werkliv`](werkliv.md) | Werkliv | Montréal | pages HTML (rendu serveur) | direct | 4/4 | 0 % | 100 % | 100 % | actif | 2026-08-17 23:28 | | |
| 223 | + | |
| 224 | +## Entrées du registre sans module connecteur | |
| 225 | + | |
| 226 | +Sources recensées mais non connectées (voir le champ `status` du registre pour la raison détaillée) : | |
| 227 | + | |
| 228 | +- `alexandre_pelletier` — Les Immeubles Alexandre Pelletier (non connectable) | |
| 229 | +- `beaulieu_gestion` — Beaulieu Gestion Immobilière (non connectable) | |
| 230 | +- `bloc` — Société Immobilière BLOC (non connectable) | |
| 231 | +- `condos_laurentides` — Condos Laurentides (Le Rocher / Le Rivya) (non connectable) | |
| 232 | +- `custeau_centro` — Groupe Custeau / Espace Centro (Le MW) (non connectable actuellement) | |
| 233 | +- `danelly` — Groupe Immobilier Danelly (non connectable) | |
| 234 | +- `devco` — Groupe Devco Immobilier (non connectable) | |
| 235 | +- `developlex` — Déveloplex (non connectable) | |
| 236 | +- `gci` — Les Immeubles GCI (non connectable) | |
| 237 | +- `gestion77` — Gestion Immobilière 7/7 (non connectable) | |
| 238 | +- `gestion_buro` — Gestion immobilière Buro (non connectable) | |
| 239 | +- `gestion_gt` — Gestion Immeubles GT (GIGT) (non connectable) | |
| 240 | +- `gestion_immologis` — Gestion Immo-Logis (non connectable) | |
| 241 | +- `gestion_nordsud` — Gestion immobilière Nord-Sud (non connectable) | |
| 242 | +- `gestion_traversy` — Gestion Immobilière Lionel Traversy (non connectable) | |
| 243 | +- `gocar` — Gestion GOCAR (non connectable actuellement) | |
| 244 | +- `godbout` — Gestion A. Godbout (non connectable actuellement) | |
| 245 | +- `godin` — Gestion A. Godin (non connectable) | |
| 246 | +- `habitat_honguedo` — Habitat Honguedo (non connectable) | |
| 247 | +- `hillpark` — Hillpark Capital (non connectable) | |
| 248 | +- `hro` — Habitations des Rivières de l'Outaouais (non connectable) | |
| 249 | +- `immo_jem` — Immo-Jem inc. (non connectable) | |
| 250 | +- `immoestrie` — Gestion immobilière de l'Estrie (non connectable) | |
| 251 | +- `immofidelite` — Groupe Immobilier Fidélité (non connectable) | |
| 252 | +- `immotop` — ImmoTop (non connectable) | |
| 253 | +- `innoplex` — Innoplex Immobilier (non connectable) | |
| 254 | +- `jpg` — Construction JPG (non connectable) | |
| 255 | +- `landry` — Immeubles Georges Landry (non connectable) | |
| 256 | +- `legc` — Le GC (géré par Lafrance & Mathieu) (couvert via lafrance_mathieu) | |
| 257 | +- `lib_emd` — Lib Aylmer (EMD-Bâtimo) (non connectable) | |
| 258 | +- `lm_gestion` — LM Gestion Immobilière (non connectable) | |
| 259 | +- `logements_cote_sud` — Les Logements Côte du Sud (LCS) inc. (non connectable) | |
| 260 | +- `lpl` — Immeubles L.P.L. (Loyer Sherbrooke) (non connectable) | |
| 261 | +- `maitre_carre` — Maître Carré (non connectable) | |
| 262 | +- `maltais` — Gestion Immobilière Maltais (non connectable) | |
| 263 | +- `marc_breton` — Gestion Marc Breton (non connectable) | |
| 264 | +- `mcf_immo` — MCF Immobilier (Groupe MCF / Marcel Charest et Fils) (non connectable) | |
| 265 | +- `mcs5` — Groupe MCS5 (non connectable) | |
| 266 | +- `memphremagog` — Groupe Immobilier Memphrémagog (non connectable) | |
| 267 | +- `mka` — MKA Gestion Immobilière (non connectable) | |
| 268 | +- `mkg_prestige` — MK Gestion Prestige (non connectable) | |
| 269 | +- `nicolyn` — Société Nicolyn (non connectable) | |
| 270 | +- `novard` — Constructions Novard (non connectable) | |
| 271 | +- `odyssee` — Groupe Odyssée (Le Vivo, Novium, Quantum…) (non connectable) | |
| 272 | +- `penates` — Gestion Immobilière Pénates et Lares (non connectable) | |
| 273 | +- `presquile` — Logis Presqu'Île (non connectable) | |
| 274 | +- `prestiplex` — Prestiplex (non connectable) | |
| 275 | +- `proplex` — Gestion immobilière Proplex (Immobilier 3C) (non connectable) | |
| 276 | +- `quartier_du_moulin` — Quartier du Moulin (non connectable) | |
| 277 | +- `quintcap` — Quintcap (non connectable) | |
| 278 | +- `ralph` — Ralph condos locatifs (non connectable) | |
| 279 | +- `rama` — Groupe Rama (non connectable) | |
| 280 | +- `rester` — Rester Management (non connectable) | |
| 281 | +- `rivard` — Les Habitations Rivard (non connectable) | |
| 282 | +- `rou_bec` — Gestions des immeubles Rou-Bec (non connectable) | |
| 283 | +- `serviceplus` — Gestion immobilière Service Plus (non connectable actuellement) | |
| 284 | +- `six80` — Appartements Six80 (non connectable) | |
| 285 | +- `symphonie` — Symphonie de Cowansville (non connectable) | |
| 286 | +- `tourliv` — Tourliv (Rizzo Capital) (non connectable) | |
| 287 | +- `vallees` — Gestion des Vallées (non connectable) | |
| 288 | +- `verseau` — Gestion Immobilière du Verseau (non connectable) | |
added
docs/connecteurs/aalto.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Aalto Suites (Zibi / Dream) — connecteur `aalto` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 26/33 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Aalto Suites (aaltosuites.ca — Zibi, Hull) Tours locatives Aalto et Aalto II de Dream, premiers immeubles résidentiels du quartier Zibi (rive québécoise, secteur Hull de Gatineau — 10, rue Jos-Montferrand, J8X 0A6, adresse publiée par le site). Site RentCafe/Yardi (gabarit « ritz ») derrière Cloudflare (403 en direct) : rendu via Firecrawl comme realstar.py/osgoode.py. La page /floorplans (française) publie une carte par PLAN : nom (« Aalto II | S2 »), typologie (« studio / 1 SdB »), superficie en pc, prix « à partir de $1,520.00/mois » et image du plan -> une annonce par plan. Aucun décompte d'unités disponibles publié -> availability vide. NB : le Crawl-delay 10 de zibi.ca ne s'applique qu'à zibi.ca (jamais requêté ici) ; aaltosuites.ca n'impose aucun délai (2 rendus par sync). | |
| 10 | + | |
| 11 | +- **Site** : https://www.aaltosuites.ca | |
| 12 | +- **Page des annonces** : https://www.aaltosuites.ca/floorplans | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull — quartier Zibi) | |
| 14 | +- **Module** : `louka/connectors/aalto.py` — classe `AaltoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://www.aaltosuites.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.aaltosuites.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 2.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 26 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Aalto II \| S2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 10, rue Jos-Montferrand, Gatineau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Hull | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 520 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 483 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4229721 | | |
| 43 | +| `description` | Description | 100 % | studio / 1 SdB — 483 pc — Aalto II — Bienvenue à Aalto et Aalto II — les premiers immeubl… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://resource.rentcafe.com/image/upload/q_auto,f_auto,c_limit,w_510/s3/2/… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true}, "balcony": true, "price_from": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.aaltosuites.ca/floorplans | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 26 trouvées, +0 / ~26 / -0 | |
| 53 | +- **Throttling** : 2.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 33 au total, **26 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync aalto` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='aalto' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 2.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/acceslogis_gb.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Accès Logis GB — connecteur `acceslogis_gb` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Lanaudière / Mauricie · Backend : direct · Annonces actives : 10/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Accès Logis GB (acceslogisgb.com) Gestionnaire de Lanaudière/Mauricie (Joliette, Ste-Élisabeth, St-Ambroise-de-Kildare, Shawinigan…). Site builder mono-page : les cartes « LOGEMENTS DISPONIBLES » vivent dans des grilles .columnswithgap-02 (titre <p.font-026><b>, photo, description <p.font-014> qui se termine par « Disponible … » + « 1150$ PAR MOIS »). Aucune page détail ni URL par annonce : external_id = slug du titre + repère d'étage tiré de la description (les titres se répètent d'un étage à l'autre). 1 requête/sync. | |
| 10 | + | |
| 11 | +- **Site** : https://acceslogisgb.com | |
| 12 | +- **Page des annonces** : https://acceslogisgb.com/#logements | |
| 13 | +- **Secteurs couverts** : Joliette, Sainte-Élisabeth, Saint-Ambroise-de-Kildare, Crabtree, Berthierville + Shawinigan (rue Frigon) | |
| 14 | +- **Module** : `louka/connectors/acceslogis_gb.py` — classe `AccesLogisGBConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://acceslogisgb.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://acceslogisgb.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 10 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3 1/2, Rang du Ruisseau, Ste-Élisabeth | | |
| 33 | +| `address` | Adresse civique | 20 % | 2510 Rang du Ruisseau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sainte-Élisabeth | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 125 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 10 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 20 % | 46.0929158 | | |
| 43 | +| `description` | Description | 100 % | Logement 3 1/2 à louer, situé au 2510 Rang du Ruisseau à Sainte-Élizabeth, une municipali… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://acceslogisgb.com/logements-a-louer-lanaudiere/logement-a-louer-saint… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 80 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://acceslogisgb.com/#logements | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 10 trouvées, +0 / ~10 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **10 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 20 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 1 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-17 17:46 | HTTPSConnectionPool(host='acceslogisgb.com', port=443): Max retries exceeded with url: / (Caused by NewConnectionError("HTTPSConnection(host='acceslogisgb.com'… | | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync acceslogis_gb` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='acceslogis_gb' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/agence_sherbrooke.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Agence de location Sherbrooke (groupe Prestiplex) — connecteur `agence_sherbrooke` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 14/18 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Agence de location Sherbrooke (agencedelocationsherbrooke.com) — le portail d'annonces du groupe Prestiplex (prestiplex.com n'affiche plus d'inventaire : son sitemap property ne contient qu'une fiche de test). Sherbrooke, East Angus, Magog. Même plateforme WordPress + thème Houzez que Gestion Dynamic : parsing hérité de DynamicConnector. Particularités du site : - la PAGE D'ACCUEIL est la page d'annonces (LIST_PATH = "/") ; - la disponibilité est l'étiquette /label/ de la carte (« Libre maintenant », « Juillet »…) ; - l'adresse complète (Nominatim) est déjà sur la carte (address.item-address) — ville/secteur en sont déduits. | |
| 10 | + | |
| 11 | +- **Site** : https://agencedelocationsherbrooke.com | |
| 12 | +- **Page des annonces** : https://agencedelocationsherbrooke.com/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont, Mont-Bellevue, Les Nations), East Angus, Magog | |
| 14 | +- **Module** : `louka/connectors/agence_sherbrooke.py` — classe `AgenceSherbrookeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://agencedelocationsherbrooke.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://agencedelocationsherbrooke.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 14 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 905 Courcelette | | |
| 33 | +| `address` | Adresse civique | 100 % | Rue de Courcelette, Mont-Bellevue | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 79 % | Les Nations | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 795 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 7 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.388177 | | |
| 43 | +| `description` | Description | 100 % | 3 ½ à louer – Disponible dès maintenant! Caractéristiques : 1 espace de stationnement inc… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://agencedelocationsherbrooke.com/wp-content/uploads/2026/07/image-2026… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 Chambre", "1 Salle de bain", "Chat permis", "Déneigement", "Entré laveuse/sécheuse"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "appliances": {"washer_dryer": tru… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://agencedelocationsherbrooke.com/property/905-courcelette/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 14 trouvées, +0 / ~14 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 18 au total, **14 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync agence_sherbrooke` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='agence_sherbrooke' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/akelius.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Akelius Montréal — connecteur `akelius` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 242/290 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Akelius Residential (rent.akelius.com) Page de recherche Canada rendue côté serveur (Angular SSR) : l'état TransferState (<script id="akeliusWebsite-state">) contient le JSON complet des unités canadiennes (adresse, loyer, pi², chambres, photos). On filtre sur le Grand Montréal (Montréal, Westmount, Mont-Royal, Saint-Lambert, Greenfield Park) — Toronto/Ottawa/Gatineau exclus. Chaque unité a aussi un JSON détail (/lettings/marketing/v2/CA/<id>.json) avec les keyfacts complets : inclusions (chauffage, eau chaude, électricité, internet), électroménagers, animaux, meublé, ascenseur, piscine, gym, année de construction, téléphone — visité via le cache self.detail() (max ~150 nouveaux fetchs par synchronisation). | |
| 10 | + | |
| 11 | +- **Site** : https://rent.akelius.com | |
| 12 | +- **Page des annonces** : https://rent.akelius.com/en/search/canada/apartment/montreal | |
| 13 | +- **Secteurs couverts** : Plateau, CDN, NDG, Villeray | |
| 14 | +- **Module** : `louka/connectors/akelius.py` — classe `AkeliusConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://rent.akelius.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://rent.akelius.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 242 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4557 Sherbrooke Street West — unité 12 | | |
| 33 | +| `address` | Adresse civique | 100 % | 4557 Sherbrooke Street West, Montréal, H3Z 1E8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Westmount | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 695 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 553 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.482613 | | |
| 43 | +| `description` | Description | 100 % | Type : groundFloor — 553 pi² — 1 salle(s) de bain | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 14 photo(s) — https://ak-let-api-gateway-production.azure-api.net/api/media/marketing/3df… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["553 pi²", "1 sdb", "Laveuse-sécheuse", "Buanderie", "Chauffage inclus", "Eau chaude inc… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true, "electricity": false, "internet": fal… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://rent.akelius.com/en/search/canada/detail/50030a-12 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 242 trouvées, +0 / ~242 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 290 au total, **242 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync akelius` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='akelius' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/alexcellence.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immeubles Alexcellence — connecteur `alexcellence` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 6/6 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immeubles Alexcellence (immeublesalexcellence.com) — apparts à Sherbrooke, secteurs Université de Sherbrooke et Mont-Bellevue (clientèle étudiante). WordPress + thème immobilier Houzez : 4e membre de la famille Houzez de l'Estrie — hérite de DynamicConnector (lesgestionsdynamic.com) et n'en redéfinit que les constantes et le crochet de disponibilité. Archive /appartements-a-louer/ paginée (cartes item-listing-wrap v6 avec data-listid, data-images, item-price « 1,010$/par mois »). Particularité locale : les étiquettes label-status portent à la fois le statut (« À LOUER » / « LOUÉ ») et la date de libération (« 1er août 2026 ») — les logements LOUÉ sont écartés, la date devient la disponibilité. Fiches détail Houzez sans bloc adresse structuré ni GPS : description + address.item-address seulement. | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesalexcellence.com | |
| 12 | +- **Page des annonces** : https://immeublesalexcellence.com/appartements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Université de Sherbrooke, Mont-Bellevue) | |
| 14 | +- **Module** : `louka/connectors/alexcellence.py` — classe `AlexcellenceConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesalexcellence.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesalexcellence.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4½ à proximité du Carrefour de l’Estrie, rue Savio | | |
| 33 | +| `address` | Adresse civique | 50 % | 2050 André, Sherbrooke | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 010 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 50 % | 45.3733923 | | |
| 43 | +| `description` | Description | 100 % | Description du loyer Découvrez ce 4½ situé près du Carrefour de l’Estrie , parfait pour l… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://immeublesalexcellence.com/wp-content/uploads/2025/06/1-FRONT-logeme… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Lits: 2", "Bain: 1"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 83 % | {"pool": true, "parking": {"available": true, "included": true}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesalexcellence.com/appartements/4%c2%bd-a-proximite-de-luniversite-de-sher… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 6 trouvées, +0 / ~6 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 6 au total, **6 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 50 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync alexcellence` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='alexcellence' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/alias_appartements.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Alias Appartements — connecteur `alias_appartements` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 1/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Alias Appartements (aliasappartements.com — rue des Mouettes, Jonquière, ville de Saguenay ; Groupe Boudreault). Projet locatif neuf UNIQUE de 80 unités 4½ livré en 4 phases (2023-2025). WordPress + Elementor + JetElements rendu serveur, page projet unique SANS fiches d'unités : le site publie le nombre d'unités (« 80 unités »), le type (« 4 1/2 »), le loyer plancher (« À partir de 1575$ »), l'adresse (h3 « Rue des Mouettes, Jonquière »), les caractéristiques (carrousel JetElements) et des photos — disponibilités par formulaire/contact. -> 1 annonce « catalogue » à granularité PROJET (précédent girs/immeubles_guillot), availability vide, rien d'inventé ; price via price_label (« à partir de », plus bas loyer). external_id stable : rue-des-mouettes. robots.txt Yoast ouvert (Disallow vide), sitemap public. | |
| 10 | + | |
| 11 | +- **Site** : https://www.aliasappartements.com | |
| 12 | +- **Page des annonces** : https://www.aliasappartements.com | |
| 13 | +- **Secteurs couverts** : Saguenay / Jonquière (rue des Mouettes, près du Mont-Jacob) — projet unique de 80 unités 4½ en 4 phases (Groupe Boudreault) | |
| 14 | +- **Module** : `louka/connectors/alias_appartements.py` — classe `AliasAppartementsConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.aliasappartements.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.aliasappartements.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Alias Appartements — Rue des Mouettes, Jonquière | | |
| 33 | +| `address` | Adresse civique | 100 % | Rue des Mouettes, Jonquière | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saguenay | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Jonquière | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 575 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.39603 | | |
| 43 | +| `description` | Description | 100 % | Alias Appartements ne vous propose pas seulement de voir votre habitation autrement, mais… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://www.aliasappartements.com/wp-content/uploads/2023/07/Vue-exterieure… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["80 unités", "Air climatisé mural (Thermopompe)", "Salle de lavage indépendante", "Entré… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"dishwasher_hookup": true}, "ac": true, "balcony": true, "laundry": true,… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.aliasappartements.com/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 1 trouvées, +0 / ~1 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — 1 annonce « catalogue » à granularité projet (type 4½, à partir de 1575 $, caractéristiques, photos) ; disponibilités par formulaire seulement | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync alias_appartements` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='alias_appartements' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/alouer_sherbrooke.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# À Louer Sherbrooke — connecteur `alouer_sherbrooke` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 1/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur À Louer Sherbrooke (alouersherbrooke.com) — 100+ logements dans 5 immeubles regroupés du quartier Université (Sherbrooke) ; clientèle étudiants/professionnels/ retraités. WordPress (thème idconception) : la liste est servie par admin-ajax `pagination-load-posts` (CPT appartements, 8 cartes/page, pagination dans la réponse). Cartes : classe `dispo` (À louer, avec date « À partir du … ») ou `loue` (Loué — exclues), grandeur (3½…), quartier, inclusions et photo. Les fiches (via self.detail, cache BD) ajoutent la description complète et la galerie. AUCUN prix ni adresse civique publiés par la source (immeubles regroupés, quartier Université) — champs laissés vides, rien d'inventé. external_id = slug du billet. | |
| 10 | + | |
| 11 | +- **Site** : https://www.alouersherbrooke.com | |
| 12 | +- **Page des annonces** : https://www.alouersherbrooke.com/appartements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (quartier Université) | |
| 14 | +- **Module** : `louka/connectors/alouer_sherbrooke.py` — classe `AlouerSherbrookeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://www.alouersherbrooke.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.alouersherbrooke.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Laveuse-sécheuse fournies | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Université | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Caractéristiques générales \| Laveuse-sécheuse fournies \| Chauffage et eau chaude inclus… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 20 photo(s) — https://www.alouersherbrooke.com/wp-content/uploads/2020/01/loyersherbrooke… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Balcon", "Chauffage, eau chaude et Internet inclus", "Entrée laveuse/sécheuse"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.alouersherbrooke.com/appartements/laveuse-secheuse-fournies/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 1 trouvées, +0 / ~1 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync alouer_sherbrooke` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='alouer_sherbrooke' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/app_urbains.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Appartements Urbains — connecteur `app_urbains` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 18/21 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Appartements Urbains (appartementsurbains.ca — Ste-Foy, Montcalm, Limoilou, Loretteville, Lévis) Pages projets (Oxygen/WP) : tableau d'unités disponibles avec liens « /unites/?_unite=NNN ». Une annonce par unité disponible. | |
| 10 | + | |
| 11 | +- **Site** : https://www.appartementsurbains.ca | |
| 12 | +- **Page des annonces** : https://www.appartementsurbains.ca | |
| 13 | +- **Secteurs couverts** : Ste-Foy, Montcalm, Limoilou, Loretteville, Lévis | |
| 14 | +- **Module** : `louka/connectors/app_urbains.py` — classe `AppartementsUrbainsConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.appartementsurbains.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.appartementsurbains.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 18 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Charlie — unité 504 | | |
| 33 | +| `address` | Adresse civique | 100 % | 1385 Rue Monseigneur-Plessis, Québec, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Limoilou | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 89 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 83 % | 1 630 $ | | |
| 38 | +| `bedrooms` | Chambres | 89 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 89 % | 915 | | |
| 41 | +| `availability_date` | Date de disponibilité | 33 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8175411 | | |
| 43 | +| `description` | Description | 100 % | Le Charlie est un projet de condos locatifs modernes et branchés. 90 unités construites p… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 16 photo(s) — https://lecharlie.ca/wp-content/uploads/vf-off-caneva-charlie-condo.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Terrasse sur le toit", "Ascenseurs", "Caméras de sécurité", "Stationnement intérieur", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"cable": true}, "ac": true, "elevator": true, "balcony": true, "gym": tru… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.appartementsurbains.ca/le-charlie/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 18 trouvées, +0 / ~18 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 21 au total, **18 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 83 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync app_urbains` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='app_urbains' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/appartements_rimouski.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Appartements Rimouski (Immeubles DTM) — connecteur `appartements_rimouski` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 19/20 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Appartements Rimouski (Immeubles DTM — appartementsrimouski.com, Rimouski et Le Bic, ~100+ logements). WordPress multisite + thème Pro (Cornerstone) + plugin Estatik pour l'annuaire d'immeubles ; la page « Choisir mon logement » /choisir-mon-logement liste les UNITÉS actuellement en location : cartes rendues serveur (titre, prix « 725$/mois », disponibilité « Disponible maintenant »/« 1 septembre 2026 », adresse complète, chambres/SDB, badge Résidentiel/Commercial, photo). Fiche unité /logements/<slug> (via cache BD) : description complète, quartier (« Quartier : Rimouski-Est »), galerie et GPS via le JSON-LD schema.org/House (lat/lng inversés à la source : corrigés). robots.txt : Disallow /pro/* seulement, sitemap XML. | |
| 10 | + | |
| 11 | +- **Site** : https://www.appartementsrimouski.com | |
| 12 | +- **Page des annonces** : https://www.appartementsrimouski.com/choisir-mon-logement | |
| 13 | +- **Secteurs couverts** : Rimouski (Centre-ville, Rimouski-Est, Saint-Pie-X, Nazareth, Pointe-au-Père, Terrasse Arthur-Buies, Le Bic) | |
| 14 | +- **Module** : `louka/connectors/appartements_rimouski.py` — classe `AppartementsRimouskiConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.appartementsrimouski.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.appartementsrimouski.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 19 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 5 1/2 NEUF dans le secteur du Bic | | |
| 33 | +| `address` | Adresse civique | 100 % | 25 Rue Adrien Breton, Rimouski, QC, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rimouski | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Bic | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 95 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 750 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 89 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.3760046 | | |
| 43 | +| `description` | Description | 100 % | Nous avons un beau logement 5 1/2 neuf de qualité supérieure à vous proposer, parfait pou… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 13 photo(s) — https://www.appartementsrimouski.com/wp-content/uploads/sites/334/2026/08/i… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["3 chambre(s)", "1 SDB"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 89 % | {"inclusions": {"heating": false, "electricity": false, "internet": true}, "appliances": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.appartementsrimouski.com/logements/5-1-2-neuf-dans-le-secteur-du-bic | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 19 trouvées, +0 / ~19 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 20 au total, **19 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync appartements_rimouski` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='appartements_rimouski' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/ascensio.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Ascensio — connecteur `ascensio` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 9/10 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Ascensio (groupeascensio.com) Société immobilière — logements neufs à Sherbrooke (Les Nations : arrondissements Jacques-Cartier et Mont-Bellevue) + Pont-Rouge (région de Québec). WordPress : la page /logements-a-louer/ est rendue serveur — grille `.grid-logements .grid-item` (une carte par logement disponible : type + numéro, date de disponibilité, secteur, immeuble, photo, lien /location/<slug>/). Les fiches (via self.detail, cache BD) ajoutent le numéro de référence stable (external_id, ex. BRY-2030134), la mensualité, la description, les pièces et dimensions et la galerie. Seuls les logements affichés (tous « Disponible ») deviennent des annonces. | |
| 10 | + | |
| 11 | +- **Site** : https://groupeascensio.com | |
| 12 | +- **Page des annonces** : https://groupeascensio.com/logements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Les Nations : Jacques-Cartier, Mont-Bellevue) — aussi Pont-Rouge (Capitale-Nationale) | |
| 14 | +- **Module** : `louka/connectors/ascensio.py` — classe `AscensioConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://groupeascensio.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://groupeascensio.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 9 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3½ Logement 301 — 20 Bryant | | |
| 33 | +| `address` | Adresse civique | 44 % | 20 Bryant | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Les Nations - Arrondissement Jacques-Cartier (Nord) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 425 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 727 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 44 % | 45.3991595 | | |
| 43 | +| `description` | Description | 100 % | Luxueux logement neuf d’une superficie de 727 pi2 avec plafond de 9,2 pieds de hauteur. V… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://groupeascensio.com/wp-content/uploads/2024/11/IMG_1907.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Immeuble : 20 Bryant", "Cuisine : 13'-8\\" x 9'-4\\"", "Salle à manger : 12'-6\\" x 6'-… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"elevator": true, "balcony": true, "storage": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://groupeascensio.com/location/20-bryant-3%c2%bd-modele-4-logement-301/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 9 trouvées, +0 / ~9 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 10 au total, **9 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 44 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync ascensio` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='ascensio' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/atlas_immo.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Atlas société immobilière — connecteur `atlas_immo` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Chaudière-Appalaches · Backend : direct · Annonces actives : 0/0 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Atlas société immobilière (atlasimmo.ca — Beauce : Saint-Georges, Saint-Victor, Notre-Dame-des-Pins, ~50-100 logements 2½–6½). CMS custom « webchef », pages .php statiques servies en HTTP (pas de TLS). Page /logements-a-louer-en-beauce.php : toutes les unités disponibles sont rendues serveur (cartes `div.resultat` — nom d'immeuble, rue + ville, description « 4X 4 et demi moderne », drapeaux Disponible/Chauffé/Éclairé avec icônes ok/cancel, photo) ; le filtre ville/grandeur/prix est purement client (JS). Quand aucun logement n'est libre, seule la mention « Aucun appartement n'est disponible… » s'affiche et le connecteur retourne [] — situation normale (parc beauceron plein). Prix jamais affiché sur les cartes -> None (rien d'inventé) ; granularité immeuble assumée (précédent immeubles_guillot). Les fiches /logement-a-louer/<id>-<slug>.php existent mais leur structure n'a jamais été observée (aucune archive) : pas d'appel détail pour l'instant. robots.txt : Disallow répertoires internes (/webchef, /inc…) seulement. | |
| 10 | + | |
| 11 | +- **Site** : http://www.atlasimmo.ca | |
| 12 | +- **Page des annonces** : http://www.atlasimmo.ca/logements-a-louer-en-beauce.php | |
| 13 | +- **Secteurs couverts** : Beauce : Saint-Georges, Saint-Victor, Notre-Dame-des-Pins — espaces commerciaux exclus | |
| 14 | +- **Module** : `louka/connectors/atlas_immo.py` — classe `AtlasImmoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : http://www.atlasimmo.ca | |
| 20 | +- **URLs de départ (constantes du module)** : http://www.atlasimmo.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 0 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | — | — | | |
| 33 | +| `address` | Adresse civique | — | — | | |
| 34 | +| `city` | Ville (normalisée) | — | — | | |
| 35 | +| `sector` | Secteur / quartier | — | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | — | — | | |
| 37 | +| `price` | Loyer mensuel ($) | — | — | | |
| 38 | +| `bedrooms` | Chambres | — | — | | |
| 39 | +| `bathrooms` | Salles de bain | — | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | — | — | | |
| 41 | +| `availability_date` | Date de disponibilité | — | — | | |
| 42 | +| `lat` | GPS (lat/lng) | — | — | | |
| 43 | +| `description` | Description | — | — | | |
| 44 | +| `images` | Photos (JSON) | — | — | | |
| 45 | +| `amenities` | Commodités (JSON) | — | — | | |
| 46 | +| `details` | Détails additionnels (JSON) | — | — | | |
| 47 | +| `url` | URL de l'annonce source | — | — | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 0 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 0 au total, **0 actives** | |
| 59 | +- **Première ingestion** : — · **Dernière observation** : — | |
| 60 | +- **Complétude clé (actives)** : GPS — · prix — · photos — · description — | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — inventaire à 0 le 2026-08-09 (parc plein, le site ne rend des cartes que pour les logements libres) ; fixture rejouant l'état réel du 2023-02-24 via la Wayback Machine | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync atlas_immo` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='atlas_immo' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — mention au registre : « …actif — inventaire à 0 le 2026-08-09 (parc plein, le site ne rend des cartes que pour les logements libres) ; fixture rejouant… » | |
| 81 | +- 2023-02-24 — mention au registre : « …site ne rend des cartes que pour les logements libres) ; fixture rejouant l'état réel du 2023-02-24 via la Wayback Machine… » | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/aula.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# AULA Lévis — connecteur `aula` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 68/70 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur AULA Lévis (aulalevis.com) 4700, boulevard Guillaume-Couture, Lévis — 163 condos locatifs (loft à 5½). Même plateforme WordPress « do-selecteur-plans » que La Cour Appartements (sélecteur SVG /plans-et-prix/ + REST /wp-json/do-selecteur-plans/v1/unite) : tout le parsing est hérité de LaCourConnector, seules les constantes du projet changent. Particularités AULA : classe « attente » en plus de disponible/indisponible (exclue), inclusions REST vides — les commodités viennent des pages /projet/ et /interieurs/ (widgets Jet Engine + h6). | |
| 10 | + | |
| 11 | +- **Site** : https://aulalevis.com | |
| 12 | +- **Page des annonces** : https://aulalevis.com/plans-et-prix/ | |
| 13 | +- **Secteurs couverts** : Lévis (Vieux-Lévis / Desjardins) | |
| 14 | +- **Module** : `louka/connectors/aula.py` — classe `AulaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://aulalevis.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://aulalevis.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 68 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | AULA Lévis — Unité 101 | | |
| 33 | +| `address` | Adresse civique | 100 % | 4700, boulevard Guillaume-Couture, Lévis, G6W 5N6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Lévis | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 665 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 976 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7852244 | | |
| 43 | +| `description` | Description | 100 % | 4½ + bureau — 976 pi² — terrasse 106 pi² — étage 1 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 11 photo(s) — https://aulalevis.com/wp-content/uploads/2025/03/TypeU_2.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Piscine intérieure", "Salle commune", "Gym", "Terrasse dernier étage", "3 ascenseurs", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "elevator": true, "balcony": true, "pool": true, "gym": true, "parking": {"a… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://aulalevis.com/plans-et-prix/#unite-101 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:16 — 68 trouvées, +0 / ~68 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 70 au total, **68 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync aula` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='aula' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/axia.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Axia Appartements — connecteur `axia` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur AXIA Appartements (axiaappartements.com) Complexe locatif neuf à Lachine (Montréal), géré par Pur Immobilia. Site vitrine WordPress/WPBakery une page : deux configurations (2 chambres 4½ et 3 chambres 5½) avec superficie et prix « à partir de » — 1 annonce par configuration. | |
| 10 | + | |
| 11 | +- **Site** : https://www.axiaappartements.com | |
| 12 | +- **Page des annonces** : https://www.axiaappartements.com/ | |
| 13 | +- **Secteurs couverts** : Lachine | |
| 14 | +- **Module** : `louka/connectors/axia.py` — classe `AxiaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.axiaappartements.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.axiaappartements.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | AXIA Appartements — 2 chambres (4½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 200, boul. Saint-Joseph, Lachine (Québec) H8S 2L3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Lachine | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 095 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 852 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4367674 | | |
| 43 | +| `description` | Description | 100 % | À partir de 852 pi 2. Louez un nouvel appartement moderne de 2 ou 3 chambres avec gym, co… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 17 photo(s) — https://www.axiaappartements.com/wp-content/uploads/2026/02/banner-scaled.j… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Hall d’entrée", "Stationnement souterrain", "Salle d’entrainement", "Salle de divertiss… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true}, "balcony": true, "gym": true, "laundry": true, "parking"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.axiaappartements.com/#appartements | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:16 — 2 trouvées, +0 / ~2 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync axia` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='axia' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/barnes_quebec.md
+86 −0
@@ -0,0 +1,86 @@ | ||
| 1 | +# BARNES Québec (location) — connecteur `barnes_quebec` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 101/103 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +BARNES Québec (barnes-quebec.com) — LOCATIONS Agence de prestige (Montréal, Québec, Laval, Mont-Tremblant…). Site WordPress indexé dans Algolia ; la config expose l'App ID et une clé API dans le HTML. L'index « quebec_all » mélange ventes (type "property") et locations (type "rental") : on filtre côté serveur avec facetFilters=[["type:rental"]]. Chaque location porte le loyer mensuel numérique (property_rent), l'adresse, chambres/salles de bains, superficie et géolocalisation. Les enregistrements sont dupliqués par langue (FR/EN) → on dédoublonne par titre normalisé en gardant la fiche FR. Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://barnes-quebec.com | |
| 12 | +- **Page des annonces** : https://barnes-quebec.com/louer/ | |
| 13 | +- **Secteurs couverts** : Montréal et environs — locations haut de gamme (index Algolia, facette type:rental) | |
| 14 | +- **Module** : `louka/connectors/barnes_quebec.py` — classe `BarnesQuebecConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://barnes-quebec.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://{APP_ID}-dsn.algolia.net/1/indexes/{INDEX}/query · https://barnes-quebec.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.25 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 101 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 6675 Rue St-Urbain #302 Montréal (Rosemont/La Petite-Patrie) (Montréal) | | |
| 33 | +| `address` | Adresse civique | 100 % | 6675 Rue St-Urbain #302 | | |
| 34 | +| `city` | Ville (normalisée) | 99 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 72 % | Rosemont/La Petite-Patrie | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 96 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 98 % | 2 600 $ | | |
| 38 | +| `bedrooms` | Chambres | 96 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 97 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 71 % | 775 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 99 % | 45.53074 | | |
| 43 | +| `description` | Description | 100 % | La PETITE-ITALIE et un dernier étage !! Face aux studios Mila et Behaviour Interactive, c… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 42 photo(s) — https://barnes-quebec.com/wp-content/uploads/2026/08/24043507-addcb7eda4967… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true}, "appliances": {"fridge": true, "stove": true, "dish… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://barnes-quebec.com/rental/6675-rue-st-urbain-302-montreal-rosemont-la-petite-patri… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:16 — 101 trouvées, +0 / ~101 / -0 | |
| 53 | +- **Throttling** : 0.25 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `HITS_PER_PAGE` = 100, `MAX_PAGES` = 40 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 103 au total, **101 actives** | |
| 60 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-18 | |
| 61 | +- **Complétude clé (actives)** : GPS 99 % · prix 98 % · photos 100 % · description 100 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 60, dont 12 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +| Date | Message (sync_log) | | |
| 67 | +|---|---| | |
| 68 | +| 2026-08-15 19:18 | 403 Client Error: Forbidden for url: https://hcw55viqnm-dsn.algolia.net/1/indexes/quebec_all/query | | |
| 69 | +| 2026-08-15 17:25 | 403 Client Error: Forbidden for url: https://hcw55viqnm-dsn.algolia.net/1/indexes/quebec_all/query | | |
| 70 | +| 2026-08-15 15:31 | 403 Client Error: Forbidden for url: https://hcw55viqnm-dsn.algolia.net/1/indexes/quebec_all/query | | |
| 71 | +| 2026-08-15 14:56 | 403 Client Error: Forbidden for url: https://hcw55viqnm-dsn.algolia.net/1/indexes/quebec_all/query | | |
| 72 | +| 2026-08-15 12:58 | 403 Client Error: Forbidden for url: https://hcw55viqnm-dsn.algolia.net/1/indexes/quebec_all/query | | |
| 73 | + | |
| 74 | +Rejouer la source seule : `python3 run.py sync barnes_quebec` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='barnes_quebec' ORDER BY ts DESC LIMIT 5;`). | |
| 75 | + | |
| 76 | +## Licence, attribution & conditions | |
| 77 | + | |
| 78 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 79 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.25 s ; cache détail pour minimiser les requêtes. | |
| 80 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 81 | +- Retrait sur demande : contact@spboucher.ai. | |
| 82 | + | |
| 83 | +## Historique | |
| 84 | + | |
| 85 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 86 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/beaudoin.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Société Beaudoin Immobilier — connecteur `beaudoin` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 12/12 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Société Beaudoin immobilier (beaudoinimmobilier.ca — Longueuil, Boucherville, Montréal : Anjou, Lachine, Saint-Léonard). Thème WordPress Houzez : les logements sont des posts « property » exposés par l'API REST (/wp-json/wp/v2/properties) avec prix, adresse géocodée, lat/lng, taxonomies (type d'unité, ville, disponibilité, commodités) et galerie d'images (IDs de médias résolus via /wp-json/wp/v2/media). Le site couvre d'autres régions : seul le Grand Montréal est conservé. | |
| 10 | + | |
| 11 | +- **Site** : https://www.beaudoinimmobilier.ca | |
| 12 | +- **Page des annonces** : https://www.beaudoinimmobilier.ca/index.php/decouvrez-nos-immeubles | |
| 13 | +- **Secteurs couverts** : Longueuil, Boucherville, Lachine | |
| 14 | +- **Module** : `louka/connectors/beaudoin.py` — classe `BeaudoinConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://www.beaudoinimmobilier.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.beaudoinimmobilier.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 12 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Grand 5 1/2 au Bois de Champbellé – 525 Saint-Charles O | | |
| 33 | +| `address` | Adresse civique | 100 % | 525, Rue Saint-Charles Ouest | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Longueuil | | |
| 35 | +| `sector` | Secteur / quartier | 42 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 235 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 67 % | 1250 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5344619 | | |
| 43 | +| `description` | Description | 100 % | Ce magnifique grand 5 ½, entièrement rénové, est situé dans le secteur recherché du Vieux… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 16 photo(s) — https://www.beaudoinimmobilier.ca/wp-content/uploads/2026/07/20240809_13105… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Eau chaude incluse", "Cuisinière incluse", "Réfrigérateur inclus", "Lave-vaisselle incl… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 75 % | {"inclusions": {"hot_water": true}, "appliances": {"fridge": true, "stove": true, "dishwa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.beaudoinimmobilier.ca/index.php/property/grand-5-1-2-au-bois-de-champbelle-52… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:16 — 12 trouvées, +0 / ~12 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 12 au total, **12 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync beaudoin` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='beaudoin' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/beaulieu_groupe.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Beaulieu Groupe Immobilier (BGI) — connecteur `beaulieu_groupe` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Beaulieu Groupe Immobilier / BGI (beaulieugroupeimmobilier.com — Rimouski, Bas-Saint-Laurent ; distinct des Immeubles Beaulieu et Collin `immeubles_bc` et de Beaulieu Gestion à Rivière-du-Loup). WordPress + Elementor avec un shortcode maison : - archive /batiment/?category=residentiel : cartes `div.card-batiment` par immeuble avec statut « COMPLET » ou « Locaux disponibles : N » ; - fiche /batiment/<slug>/ : description de l'immeuble + cartes d'unités `div.card-local` (« 418 Alcide-C.-Horth, app #206 | 4 1/2 ») dont le `p.card-text` vaut « Indisponible » (image générique Complet.png) ou, pour les unités libres, « Superficie : N pi² » avec photo réelle. Le connecteur ne visite que les fiches des immeubles NON marqués COMPLET (politesse) et n'émet que les unités non « Indisponible ». Aucun prix publié -> price=None, rien d'inventé. Tout le parc affiché est à Rimouski. external_id stable : slug de la fiche + numéro d'appartement (418-rue-alcide-c-horth--app-206). robots.txt Yoast ouvert (Disallow vide), sitemap public. | |
| 10 | + | |
| 11 | +- **Site** : https://beaulieugroupeimmobilier.com | |
| 12 | +- **Page des annonces** : https://beaulieugroupeimmobilier.com/batiment/?category=residentiel | |
| 13 | +- **Secteurs couverts** : Rimouski (5 immeubles résidentiels dont 24 logements neufs au 418 rue Alcide-C.-Horth) — commercial exclu | |
| 14 | +- **Module** : `louka/connectors/beaulieu_groupe.py` — classe `BeaulieuGroupeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://beaulieugroupeimmobilier.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://beaulieugroupeimmobilier.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 418 Alcide-C.-Horth, app #206 \| 4 1/2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 418 Alcide-C.-Horth, Rimouski | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rimouski | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1000 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.4461098 | | |
| 43 | +| `description` | Description | 100 % | Beaulieu Groupe Immobilier propose 24 logements neufs modernes et spacieux, conçus pour o… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://beaulieugroupeimmobilier.com/wp-content/uploads/2026/05/Cuisine-B-in… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "balcony": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://beaulieugroupeimmobilier.com/batiment/418-rue-alcide-c-horth/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:16 — 4 trouvées, +0 / ~4 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — prix et dates jamais publiés (unités libres = cartes non « Indisponible », superficie et photo réelles) ; 4 immeubles sur 5 COMPLET au 2026-08-09 | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync beaulieu_groupe` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='beaulieu_groupe' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-09 — mention au registre : « …cartes non « Indisponible », superficie et photo réelles) ; 4 immeubles sur 5 COMPLET au 2026-08-09… » | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/bestlife.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Gestions Bestlife — connecteur `bestlife` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 12/13 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Gestions Bestlife (lesgestionsbestlife.com) — 500+ portes en gestion à Sherbrooke (Fleurimont, Rock Forest, Mont-Bellevue), East Angus, Richmond. WordPress Divi + WooCommerce : chaque logement est un « produit » (archive /appartements-a-louer-sherbrooke/, cartes li.product avec titre « adresse – type », prix WooCommerce — promo = del/ins — et taxonomie product_cat-<type>). Les fiches produit (via self.detail, cache BD) ajoutent la disponibilité (« Disponible dès maintenant »), les listes Inclusions/Spécifications et la galerie photos. La ville est extraite de la parenthèse du titre (« (East-Angus) », « (Richemond) ») — Sherbrooke par défaut. external_id = slug du produit (stable). | |
| 10 | + | |
| 11 | +- **Site** : https://lesgestionsbestlife.com | |
| 12 | +- **Page des annonces** : https://lesgestionsbestlife.com/appartements-a-louer-sherbrooke/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont, Mont-Bellevue, Rock Forest), East Angus, Richmond | |
| 14 | +- **Module** : `louka/connectors/bestlife.py` — classe `BestlifeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://lesgestionsbestlife.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lesgestionsbestlife.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 12 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1082 Sainte-Thérèse – 4 1/2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 1082 Sainte-Thérèse | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 150 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 8 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 8 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 92 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 92 % | 45.3896965 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://i0.wp.com/lesgestionsbestlife.com/wp-content/uploads/2026/08/exposio… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 stationnement", "Entrée lave-vaisselle", "Entrée laveuse/sécheuse", "Thermopompe", "C… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true, "dishwasher_hookup": true}, "ac": true, "pet… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lesgestionsbestlife.com/produit/1082-sainte-therese/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:16 — 12 trouvées, +0 / ~12 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 13 au total, **12 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 92 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync bestlife` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='bestlife' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/boardwalk.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Boardwalk REIT — connecteur `boardwalk` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 100/100 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Boardwalk REIT (bwalk.com) Pages de villes de la région de Montréal rendues serveur (HubSpot CMS) : Longueuil, Laval, Île-des-Sœurs/Verdun, Ville Saint-Laurent. Fiches propriétés avec cartes de types de suites (« À partir de … $ ») qui portent aussi superficie (pi ca), c. à c./sdb et le statut (« N logements disponibles » / « liste d'attente ») ; adresse complète + téléphone dans l'en-tête (p.address-and-phone). Les pages de suites ne servent plus qu'aux photos spécifiques, via le cache self.detail(). REIT pancanadien : seules les propriétés du Grand Montréal sont couvertes. | |
| 10 | + | |
| 11 | +- **Site** : https://www.bwalk.com | |
| 12 | +- **Page des annonces** : https://www.bwalk.com/fr-ca/appartements-a-louer-a-montreal-longueuil/longueuil | |
| 13 | +- **Secteurs couverts** : Longueuil | |
| 14 | +- **Module** : `louka/connectors/boardwalk.py` — classe `BoardwalkConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.bwalk.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.bwalk.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 100 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Domaine d'Iberville Apartments — 3 1/2 Pièces | | |
| 33 | +| `address` | Adresse civique | 100 % | 101-300 Rue Joliette, Montréal - Longueuil, J4H 2G5 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Longueuil | | |
| 35 | +| `sector` | Secteur / quartier | 89 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 199 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 97 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 53 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.531969 | | |
| 43 | +| `description` | Description | 100 % | Située sur la rive sud du fleuve Saint-Laurent en face du centre-ville de Montréal, la pr… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://www.bwalk.com/hubfs/001%20Organized%20Web%20Photos/Domaine%20dIbervi… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Piscine", "Sauna", "Dépanneur", "Ascenseur", "Espace d'entreposage", "Balcon", "Eau", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "elevator": true, "balcony": true,… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.bwalk.com/fr-ca/appartements-a-louer-a-montreal-longueuil/longueuil/domaine-d… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:17 — 100 trouvées, +0 / ~100 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 100 au total, **100 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync boardwalk` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='boardwalk' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/bons_locataires.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Bons Locataires — connecteur `bons_locataires` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Grand Montréal · Backend : direct · Annonces actives : 14/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Bons Locataires (bonslocataires.com) — agence de location Montréal/Laval/Longueuil. WordPress, aucun anti-bot (seul mod_security bloque les sitemaps XML — on ne les utilise pas). Source de vérité : la page carte MapListPro (~8 Mo) dont le tableau JSON inline contient les 1 600+ emplacements avec lat/lng, taxonomies (région/quartier/taille) et description complète. Le site garde les logements loués sur la carte (« DÉJÀ LOUÉ », pin PouceVert) : on ne conserve que les annonces encore offertes, et on valide que leur page (locationUrl) répond toujours 200 (certains vieux liens sont morts). Prix et disponibilité en texte libre -> regex. ~20-40 annonces actives. | |
| 10 | + | |
| 11 | +- **Site** : https://www.bonslocataires.com | |
| 12 | +- **Page des annonces** : https://www.bonslocataires.com/logement-appartement-a-louer-enquete-proprio-credit-locataire-visite-virtuelle-360/ | |
| 13 | +- **Secteurs couverts** : Montréal, Laval, Longueuil — agence de location | |
| 14 | +- **Module** : `louka/connectors/bons_locataires.py` — classe `BonsLocatairesConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.bonslocataires.com/logement-appartement-a-louer- | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.bonslocataires.com/logement-appartement-a-louer- | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 120 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 14 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | LAVAL DES RAPIDES* Beau & grand 1 ½ secteur tranquille | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Laval | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Laval-des-Rapides | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 1½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 21 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 36 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5498359 | | |
| 43 | +| `description` | Description | 93 % | — | | |
| 44 | +| `images` | Photos (JSON) | 93 % | 1 photo(s) — https://www.bonslocataires.com/wp-content/uploads/2015/03/laval-1.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 93 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.bonslocataires.com/laval-des-rapides-1½-600 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.4 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 14 trouvées, +0 / ~14 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **14 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 21 % · photos 93 % · description 93 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 7, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync bons_locataires` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='bons_locataires' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/boreal_abitibi.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Constructions Boréal Abitibi — connecteur `boreal_abitibi` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Abitibi-Témiscamingue · Backend : direct · Annonces actives : 3/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Constructions Boréal Abitibi (constructionsborealabitibi.com — Val-d'Or et Malartic, logements neufs ; seul acteur structuré à Malartic). WordPress + thème maison Tailwind : la grille /locations/ est remplie en AJAX (admin-ajax.php, action=get_rents, nonce lu dans le HTML de la page). Chaque « rent » est une carte HTML `article.listing-item` : ville (Val-d'Or/Malartic), adresse + n° d'app., prix (« 1 550 $ / mois »), « Disponible en août », chambres/salles de bain/garage (pictos), « Non meublé, non chauffé, non éclairé ». Fiche détail /loyer/<slug>/ (via cache BD) : Grandeur (4 et demi), étage, parking, inclusions, description et galerie ; la mention « logements non-fumeur / aucun animal » du site alimente `pets`. robots.txt WP standard (admin-ajax.php explicitement permis), sitemap XML. | |
| 10 | + | |
| 11 | +- **Site** : https://constructionsborealabitibi.com | |
| 12 | +- **Page des annonces** : https://constructionsborealabitibi.com/locations/ | |
| 13 | +- **Secteurs couverts** : Val-d'Or (3e Avenue, rue Giguère), Malartic (Dargis Ménard) — logements neufs | |
| 14 | +- **Module** : `louka/connectors/boreal_abitibi.py` — classe `BorealAbitibiConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://constructionsborealabitibi.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://constructionsborealabitibi.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 320-328, 3e Avenue 326 — Val-d'Or | | |
| 33 | +| `address` | Adresse civique | 100 % | 320-328, 3e Avenue 326, Val-d'Or | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Val-d'Or | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 550 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.0977193 | | |
| 43 | +| `description` | Description | 100 % | Proximité des écoles, des épiceries, des dépanneurs, du centre-ville. | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://constructionsborealabitibi.com/wp-content/uploads/2020/09/dscn1016-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["2 chambre(s)", "1 salle(s) de bain", "1 garage/stationnement", "Non meublé, non chauffé… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false}, "appliances": {"washer_dryer_hoo… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://constructionsborealabitibi.com/loyer/320-328-3e-avenue-2e-etage-326/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 3 trouvées, +0 / ~3 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync boreal_abitibi` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='boreal_abitibi' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/bribourg.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Bribourg — connecteur `bribourg` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Bri Bourg (bribourg.com) Site PHP simple (Charlesbourg, Vanier, Beauport). Les annonces de logements à louer sont publiées via un blogue DropInBlog embarqué dans Logements-a-louer.php ; on lit le flux RSS DropInBlog, puis on complète avec la page d'immeuble correspondante (Immeubles.php) : photos, code postal, descriptif de l'immeuble et services à proximité (via le cache self.detail()). Contact (tel:/mailto:) pris sur la page principale. | |
| 10 | + | |
| 11 | +- **Site** : https://bribourg.com | |
| 12 | +- **Page des annonces** : https://bribourg.com/Immeubles.php | |
| 13 | +- **Secteurs couverts** : Charlesbourg, Vanier, Beauport | |
| 14 | +- **Module** : `louka/connectors/bribourg.py` — classe `BribourgConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://bribourg.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://bribourg.com · https://io.dropinblog.com/feed/{blog_id}/?limit=100 | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3 ½ à louer (Vanier) – Dès aujourd'hui | | |
| 33 | +| `address` | Adresse civique | 100 % | 510, avenue Claude-Martin, Québec (Vanier), G1M 1T3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Vanier | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 860 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8228015 | | |
| 43 | +| `description` | Description | 100 % | Adresse : 510, avenue Claude-Martin, Québec (Vanier) Loyer : 860 $ par mois Disponibilité… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://dropinblog.net/34265643/files/510-avenue-claude-martin-vanier-quebec… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["3 ½", "860 $ par mois", "Chauffé / éclairé / eau chaude", "Secteur de Vanier"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true}, "balcony": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://bribourg.com/Logements-a-louer.php?p=lol | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 2 trouvées, +0 / ~2 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync bribourg` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='bribourg' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/brigil.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Brigil — connecteur `brigil` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 42/42 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Brigil (brigil.com — Gatineau/Outaouais) Promoteur-gestionnaire dominant de Gatineau. Site = portail Yardi RentCafe protégé par Cloudflare : curl/requests reçoivent 403 (« Just a moment »), TOUT passe par Firecrawl avec attente de rendu — même patron que realstar.py (RentCafe + Cloudflare) : 1) /searchlisting?province=Quebec -> cartes propriétés (nom, gamme Aura/Apogee/Comfort, lits, fourchette de prix, vignette) ; le portail ne filtre PAS par ville côté serveur et les cartes ne portent pas la ville : elle est lue sur la fiche de chaque propriété ; 2) fiche propriété -> adresse structurée (itemprop=address), photos, description, plus les plans quand ils y sont intégrés ; 3) /floorplans si la fiche n'a pas de plans -> plans structurés (nom, chambres, sdb, pi², « Starting at »). Les propriétés d'Ottawa/Ontario sont écartées : d'abord par l'URL (/apartments/on/…), ensuite par la ville lue sur la fiche. Une annonce par propriété. Les rendus passent par self.detail(...) (cache BD) : Firecrawl n'est rappelé que si la carte a changé, et un plafond (max_renders) borne le coût de chaque synchronisation. | |
| 10 | + | |
| 11 | +- **Site** : https://www.brigil.com | |
| 12 | +- **Page des annonces** : https://www.brigil.com/searchlisting?province=Quebec | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer, Buckingham, Plateau, Le Plateau du Parc, Vieux-Port) | |
| 14 | +- **Module** : `louka/connectors/brigil.py` — classe `BrigilConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://www.brigil.com/searchlisting?province=Quebec | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.brigil.com/searchlisting?province=Quebec | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 42 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Aura Rivermead | | |
| 33 | +| `address` | Adresse civique | 100 % | 15 Ch. Morley-Walters, Gatineau, QC J9J 0B8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 24 % | 1 656 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 5 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 26 % | 1252 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 98 % | 45.4021379 | | |
| 43 | +| `description` | Description | 100 % | If you've always dreamed of living surrounded by lush greenery while enjoying the benefit… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 20 photo(s) — https://resource.rentcafe.com/image/upload//q_auto,f_auto,w_600,h_400,c_lfi… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"price_from": true, "contact": {"phone": "833-348-9970"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.brigil.com/apartments/qc/gatineau/aura-rivermead/default.aspx | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 42 trouvées, +0 / ~42 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 42 au total, **42 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 98 % · prix 24 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync brigil` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='brigil' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/brio.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Immeubles Brio — connecteur `brio` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Brio (immeublesbrio.com) Projet mono-immeuble « Le Brio » à Val-Bélair (boul. Pie-XI, Québec). Les unités sont affichées par étage (hotspots Divi) avec statut Disponible / Loué ; les prix « à partir de » par type (3½/4½/5½) sont affichés sur la page d'accueil. | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesbrio.com | |
| 12 | +- **Page des annonces** : https://immeublesbrio.com/appartements-a-louer-val-belair | |
| 13 | +- **Secteurs couverts** : Val-Bélair, Neufchâtel, Loretteville | |
| 14 | +- **Module** : `louka/connectors/brio.py` — classe `BrioConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesbrio.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesbrio.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Brio — Appartement 109 (5½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1105, rue des Rigoles, Québec, QC G3K 0M7 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Val-Bélair | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 850 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1309 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8537801 | | |
| 43 | +| `description` | Description | 100 % | Superficie: 1309 pi2 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://immeublesbrio.com/wp-content/uploads/2019/12/109-209-309-409-509.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["3 chambres à coucher", "Walk-in dans la chambre à coucher principale et secondaire", "1… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"elevator": true, "laundry": true, "storage": true, "parking": {"available": true, "type… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesbrio.com/appartements-a-louer-val-belair/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 3 trouvées, +0 / ~3 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync brio` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='brio' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/brivia_1sp.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Brivia (1 Square Phillips) — connecteur `brivia_1sp` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur 1 Square Phillips (Groupe Brivia) (1squarephillips.ca/locatif — tour locative au centre-ville de Montréal, 1205 rue du Square-Phillips, Ville-Marie). La page /locatif présente les trois typologies offertes (Studio / 1 Chambre / 2 Chambres) avec loyer "à partir de" -> une annonce par typologie (uid stables). L'inventaire unité par unité est exposé par l'API AJAX des plans (2022/php/ ajax_load_unit_selector/_floor/_unit.php, phase=rental) : on y lit les unités réellement disponibles (« onsale »), leur étage, leur superficie (pi²) et le plan — utilisés pour enrichir chaque typologie. | |
| 10 | + | |
| 11 | +- **Site** : https://briviagroup.ca | |
| 12 | +- **Page des annonces** : https://www.1squarephillips.ca/locatif | |
| 13 | +- **Secteurs couverts** : Centre-ville | |
| 14 | +- **Module** : `louka/connectors/brivia_1sp.py` — classe `Brivia1SPConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://www.1squarephillips.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.1squarephillips.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1 Square Phillips — Studio locatif | | |
| 33 | +| `address` | Adresse civique | 100 % | 1205, rue du Square-Phillips, Montréal, QC H3B 3C9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Centre-ville (Ville-Marie) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 600 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 67 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5039775 | | |
| 43 | +| `description` | Description | 100 % | Condos locatifs de luxe au centre-ville de Montréal, formule tout inclus : électroménager… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 30 photo(s) — https://www.1squarephillips.ca/2022/images/bckg-rental-2.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Tout inclus (électricité, chauffage, climatisation, eau chaude, Wi-Fi)", "Électroménage… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.1squarephillips.ca/locatif | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 3 trouvées, +0 / ~3 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync brivia_1sp` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='brivia_1sp' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/brochu.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Immobilier Brochu — connecteur `brochu` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 7/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Immobilier Brochu (groupeimmobilierbrochu.com — Lévis : St-Romuald, Charny, St-Nicolas, centre-ville + Québec : Les Saules). Une annonce par projet/immeuble (pas d'unités individuelles listées sur le site). | |
| 10 | + | |
| 11 | +- **Site** : https://groupeimmobilierbrochu.com | |
| 12 | +- **Page des annonces** : https://groupeimmobilierbrochu.com | |
| 13 | +- **Secteurs couverts** : Lévis (St-Romuald, Charny, St-Nicolas), Les Saules | |
| 14 | +- **Module** : `louka/connectors/brochu.py` — classe `BrochuConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://groupeimmobilierbrochu.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://groupeimmobilierbrochu.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 7 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Pilier – Finaliste du prix Nobilis 2026 | | |
| 33 | +| `address` | Adresse civique | 100 % | 1275 rue J.-B.-Demers Lévis (QC) G6W 0X9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Lévis | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 86 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 57 % | — | | |
| 38 | +| `bedrooms` | Chambres | 86 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-11-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 86 % | 46.7380264 | | |
| 43 | +| `description` | Description | 100 % | Profitez du confort d’un condo neuf et moderne sans les tracas de la propriété. Un enviro… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 3 photo(s) — https://groupeimmobilierbrochu.com/wp-content/uploads/2025/10/Enscape_2023-1… | | |
| 45 | +| `amenities` | Commodités (JSON) | 86 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"contact": {"phone": "418-836-7666", "email": "info@lepilierlevis.com"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://groupeimmobilierbrochu.com/projets/le-pilier/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 7 trouvées, +0 / ~7 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **7 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 86 % · prix 57 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync brochu` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='brochu' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/cap_gestion.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# CAP Gestion (CAP Immobilier) — connecteur `cap_gestion` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Laurentides / Lanaudière · Backend : direct · Annonces actives : 122/122 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur CAP Gestion / CAP Immobilier (capgestion.ca) — Saint-Jérôme, Lachute, Mirabel, Joliette, Louiseville, Repentigny, Lavaltrie, Brownsburg-Chatham… WordPress + plugin immobilier Estatik 4 Pro : la page « Logements à louer » (rendu serveur, ~10 fiches/page, pagination ?paged-1=N) expose des cartes .es-listing avec data-post-id (id STABLE), prix, adresse complète et type de logement. Chaque fiche /propriete/<slug>/ fournit les champs STRUCTURÉS Estatik (.es-property-field : type, salles de bain, chambres, superficie, animaux, chauffage, stationnement, étage, période de location…) + description et galerie. Les fiches étiquetées « Loué » (es_label/loue) sont exclues : le logement n'est plus offert. robots.txt permissif (Yoast). | |
| 10 | + | |
| 11 | +- **Site** : https://capgestion.ca | |
| 12 | +- **Page des annonces** : https://capgestion.ca/gestion-immobiliere-logements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Saint-Jérôme, Lachute, Brownsburg-Chatham, Mirabel, Sainte-Agathe-des-Monts, Sainte-Adèle, Joliette, Saint-Charles-Borromée, Lavaltrie, Repentigny, Laval, Grenville | |
| 14 | +- **Module** : `louka/connectors/cap_gestion.py` — classe `CapGestionConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://capgestion.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://capgestion.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 122 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | APPARTEMENT 3 CHAMBRES – SAINTE-AGATHE-DES-MONTS – NOVEMBRE | | |
| 33 | +| `address` | Adresse civique | 100 % | 123 Rue Demontigny, Sainte-Agathe-des-Monts, QC J8C 2T5, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sainte-Agathe-des-Monts | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 445 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 99 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 85 % | 1208 | | |
| 41 | +| `availability_date` | Date de disponibilité | 94 % | 2026-11-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 98 % | 46.0689009 | | |
| 43 | +| `description` | Description | 100 % | 5 1/2 disponible pour le 1er novembre PROMO: 1ER MOIS GRATUIT ** Situé au 123 Demontigny,… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 20 photo(s) — https://capgestion.ca/wp-content/uploads/2026/07/exterieur-scaled.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Animaux acceptés : Limité", "Type d'animal autorisé : Chat stérilisé d'intérieur", "Éle… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "pets": "oui", "parking": {"availa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://capgestion.ca/propriete/appartement-3-chambres-sainte-agathe-des-monts-novembre/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 122 trouvées, +0 / ~122 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 122 au total, **122 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 98 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync cap_gestion` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='cap_gestion' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/capital_rdr.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Capital RDR — connecteur `capital_rdr` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Capital RDR (gestionrdr.com) 545 appartements à Trois-Rivières / Cap-de-la-Madeleine (fusionnés dans la ville de Trois-Rivières). Site GoDaddy Website Builder : la page « Logements à louer » est un widget « menu » dont chaque item porte un data-aid stable (MENU_ITEM_<hash du titre>) avec titre (« 4½ au 430 Saint-Maurice »), prix (« 990.00$ »), photo et description en paragraphes (« *Disponible immédiatement!* », adresse civique, inclusions, animaux…). Pas de fiche individuelle : l'URL renvoie à la page + ancre de l'item. robots.txt permissif (sitemap seulement). | |
| 10 | + | |
| 11 | +- **Site** : https://gestionrdr.com | |
| 12 | +- **Page des annonces** : https://gestionrdr.com/logements-%C3%A0-louer-1 | |
| 13 | +- **Secteurs couverts** : Trois-Rivières, Cap-de-la-Madeleine | |
| 14 | +- **Module** : `louka/connectors/capital_rdr.py` — classe `CapitalRDRConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://gestionrdr.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionrdr.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4½ au 430 Saint-Maurice | | |
| 33 | +| `address` | Adresse civique | 100 % | 430 rue St-Maurice App9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Trois-Rivières | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 990 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.3783467 | | |
| 43 | +| `description` | Description | 100 % | *Disponible immédiatement!* 430 rue St-Maurice App9 Beau 4½, poele & frigo inclu à seulem… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://img1.wsimg.com/isteam/ip/65e71d87-4eea-4508-9b0c-5c8d14f6fa2e/11.png… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false}, "appliances": {"fridge": true, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionrdr.com/logements-%C3%A0-louer-1#4AU430SAIN | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 4 trouvées, +0 / ~4 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync capital_rdr` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='capital_rdr' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/capreit.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# CAPREIT — connecteur `capreit` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 117/122 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur CAPREIT (capreit.ca) Flux JSON officiel du moteur de recherche (admin-ajax `property_json`) filtré sur les villes de la région de Québec ET du Grand Montréal (île de Montréal, Laval, Rive-Sud, Rive-Nord proche); les fiches propriétés (rendu serveur) fournissent les types d'unités, prix, disponibilités, commodités et la galerie photo. Une annonce par type d'unité disponible. Exclus : hors-province (province != QC) et villes hors des deux régions. | |
| 10 | + | |
| 11 | +- **Site** : https://www.capreit.ca | |
| 12 | +- **Page des annonces** : https://www.capreit.ca/fr/appartements-a-louer/ville-de-quebec-qc/appartements-le-samuel-holland | |
| 13 | +- **Secteurs couverts** : Ville de Québec (Samuel-Holland) | |
| 14 | +- **Module** : `louka/connectors/capreit.py` — classe `CapreitConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://www.capreit.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.capreit.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 117 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Faubourg de la Pointe et Domaine Laudance — 1 1/2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 900, 920 Laudance, 3780, 3786, 3792, 3793, 3798 Le Marié, 3700, 3706 des Compagnons, Vill… | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Laudance et Campanile (Pointe-de-Sainte-Foy) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 1½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 930 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 370 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.760387 | | |
| 43 | +| `description` | Description | 100 % | Caractéristiques de l'immeuble Communauté avec beaux aménagements paysagers et des appart… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 14 photo(s) — https://www.capreit.ca/wp-content/uploads/2021/09/FPDL-4.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Voir ma liste", "Coin-buanderie dans l’unité", "Piscine *", "Balcons privés", "Ascenseu… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"elevator": true, "balcony": true, "pool": true, "laundry": true, "parking": {"available… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.capreit.ca/fr/appartements-a-louer/ville-de-quebec-qc/faubourg-de-la-pointe-e… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 117 trouvées, +0 / ~117 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 122 au total, **117 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync capreit` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='capreit' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/carat_immobilier.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Carat Immobilier — connecteur `carat_immobilier` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Abitibi-Témiscamingue · Backend : direct · Annonces actives : 3/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Carat Immobilier (caratimmobilier.ca — Rouyn-Noranda, Abitibi-Témiscamingue). WordPress + thème immobilier Houzez (cartes v2), tout rendu serveur — même famille que gimcote.py / immeubles_bc.py. Archive /appartements/ : cartes `.item-listing-wrap` (statut « Disponible… », prix « 1 ,058$ », adresse complète, galerie dans data-images). Fiche détail /property/<slug>/ (via cache BD) : description, commodités (#property-features-wrap), bloc « Détails » structuré (type 4 1/2, chambres, salle de bain, superficie) et bloc adresse (ville, quartier, immeuble). Pas de GPS réel (carte Houzez sur coordonnées par défaut). robots.txt Yoast ouvert, sitemap XML. | |
| 10 | + | |
| 11 | +- **Site** : https://caratimmobilier.ca | |
| 12 | +- **Page des annonces** : https://caratimmobilier.ca/appartements/ | |
| 13 | +- **Secteurs couverts** : Rouyn-Noranda (quartiers Rouyn, Sacré-Cœur) — statuts « Loué » exclus | |
| 14 | +- **Module** : `louka/connectors/carat_immobilier.py` — classe `CaratImmobilierConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://caratimmobilier.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://caratimmobilier.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 ½ à louer demi sous –sol – Quartier Sacré-Cœur, Rouyn-Noranda | | |
| 33 | +| `address` | Adresse civique | 100 % | 769 Av. Murdoch, Rouyn-Noranda, QC J9X 1H9, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rouyn-Noranda | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Rouyn | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 920 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 67 % | 850 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.246803 | | |
| 43 | +| `description` | Description | 100 % | Abordable, situé dans un secteur paisible, à proximité de tous les services, des commerce… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://caratimmobilier.ca/wp-content/uploads/2026/08/20200626_131205.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["2 chambre(s)", "1 salle(s) de bain", "Espace Laveuse Sécheuse", "Internet sans fil haut… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "internet": true}, "appliances": {"washer_dryer": tr… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://caratimmobilier.ca/property/769-murdoch-disponible-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 3 trouvées, +0 / ~3 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync carat_immobilier` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='carat_immobilier' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/centurion.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Centurion / CP Living (Quartier QB) — connecteur `centurion` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Centurion / CP Living (cpliving.com) REIT national (Centurion Property Associates) — région de Québec : le Quartier QB, 2551 chemin des Quatre-Bourgeois (Sainte-Foy), 684 unités. Le site est propulsé par Rentsync : la page de recherche référence un proxy legacy `widgets/search/api_proxy.php?client_id=21&city_id=2310` (404 aujourd'hui) mais son JS (scripts/main.js) appelle en réalité le flux JSON officiel `https://api.theliftsystem.com/v2/search` avec un auth_token embarqué. On lit client_id/city_id sur la page, le token dans main.js (repli : constantes), puis on interroge le flux directement — aucune exécution JavaScript nécessaire, Cloudflare accepte le UA de base. Filtre région : city_ids 2310 (Ville de Québec) + 1039 (Gatineau, ajouté à l'expansion provinciale 2026-08) + garde-fou province/ville. La fiche propriété (rendu serveur) fournit la galerie photo, via le cache BD self.detail() (revisitée seulement quand le flux change). | |
| 10 | + | |
| 11 | +- **Site** : https://www.cpliving.com | |
| 12 | +- **Page des annonces** : https://www.cpliving.com/apartments-for-rent/quebec-city | |
| 13 | +- **Secteurs couverts** : ['Sainte-Foy'] | |
| 14 | +- **Module** : `louka/connectors/centurion.py` — classe `CenturionConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://www.cpliving.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://api.theliftsystem.com/v2/search` · https://www.cpliving.com · https://api.theliftsystem.com/v2/search | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Quartier QB | | |
| 33 | +| `address` | Adresse civique | 100 % | 2551 Chemin des Quatre-Bourgeois, Québec, QC G1V 0G2 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 75 % | — | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 75 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7807897 | | |
| 43 | +| `description` | Description | 100 % | Quartier QB is in the heart of Québec City's up and coming downtown hub – Sainte-Foy. The… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 6 photo(s) — https://assets.rentsync.com/centurion/images/gallery/full/1651515067110_qb-u… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["In-suite laundry", "Dishwasher", "Microwave", "Air conditioner", "Balcony"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true, "stove": true, "dishwasher": true, "washer_dryer": true},… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.cpliving.com/apartments/quartier-qb | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 4 trouvées, +0 / ~4 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 75 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync centurion` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='centurion' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/cite_immobilier.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Cité Immobilier — connecteur `cite_immobilier` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Cité Immobilier (citeimmobilier.com) 224 logements à Victoriaville. Site GoDaddy Website Builder 8 (même famille que capital_rdr) mais SANS annonces par unité : la page /immeubles liste les immeubles (cartes data-ux="ContentBasic", titres data-aid ABOUT_HEADLINE_*) avec adresse civique, description et un bouton d'état — « APPARTEMENT À LOUER » (vacance) ou « - COMPLET - ». On publie une annonce par immeuble résidentiel affichant une vacance ; prix/type ne sont pas publiés. robots.txt : « User-agent: * » sans Disallow (tout permis). | |
| 10 | + | |
| 11 | +- **Site** : https://citeimmobilier.com/accueil | |
| 12 | +- **Page des annonces** : https://citeimmobilier.com/immeubles | |
| 13 | +- **Secteurs couverts** : Victoriaville | |
| 14 | +- **Module** : `louka/connectors/cite_immobilier.py` — classe `CiteImmobilierConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://citeimmobilier.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://citeimmobilier.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement à louer — 85-89 rue Notre-Dame Est | | |
| 33 | +| `address` | Adresse civique | 100 % | 85-89 rue Notre-Dame Est | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Victoriaville | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.0563841 | | |
| 43 | +| `description` | Description | 100 % | Emplacement de choix tant sur le plan commercial que résidentiel, car de nombreux commerc… | | |
| 44 | +| `images` | Photos (JSON) | 0 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 50 % | {"parking": {"available": true}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://citeimmobilier.com/immeubles#85-89-rue-notre-dame-est | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:18 — 2 trouvées, +0 / ~2 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 0 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync cite_immobilier` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='cite_immobilier' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/cogir.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Cogir Immobilier — connecteur `cogir` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 285/300 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Cogir Immobilier (cogir.net) Page liste « gestion-immeubles-residentiels » (rendu serveur) filtrée sur les villes de la région de Québec/Lévis, du Grand Montréal (île de Montréal, Laval, Longueuil/Rive-Sud, Rive-Nord proche) et de l'Outaouais (Gatineau/Hull/Aylmer); chaque immeuble a une fiche avec un tableau « Modèles disponibles » (type + prix à partir de) et une galerie photos (DATA/PHOTO). Une annonce par modèle d'unité, sinon par immeuble. Exclus : Ontario/Halifax/etc., résidences pour aînés/retraités/étudiantes. | |
| 10 | + | |
| 11 | +- **Site** : https://www.cogir.net | |
| 12 | +- **Page des annonces** : https://www.cogir.net/gestion-immeubles-residentiels.html | |
| 13 | +- **Secteurs couverts** : Québec (Le Bacc, Loretteville, Père-Lelièvre...) | |
| 14 | +- **Module** : `louka/connectors/cogir.py` — classe `CogirConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.cogir.net | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.cogir.net | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 285 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | L'Aventura Condos Locatifs — 3½ (1 chambre) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1769 Rue Careau, Québec, QC, Québec G1M 0E6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 13 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 99 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 96 % | 1 496 $ | | |
| 38 | +| `bedrooms` | Chambres | 98 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 96 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 89 % | 46.8202665 | | |
| 43 | +| `description` | Description | 100 % | Découvrez ce milieu de vie distinctif conçu pour vous : Inspirée des plus grands complexe… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://www.cogir.net/DATA/PHOTO/22326_aprinc.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 57 % | ["Patinoire extérieure", "Air climatisé", "Balcons", "Piscine extérieure", "BBQ", "Gym", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "balcony": true, "pool": true, "gym": true, "price_from": true, "contact": {… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.cogir.net/immeuble-residentiel-quebec/2677-l-aventura-condos-locatifs.html | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:20 — 285 trouvées, +0 / ~285 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 300 au total, **285 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 89 % · prix 96 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync cogir` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='cogir' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/contraste.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Contraste Immobilier — connecteur `contraste` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 221/234 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Contraste Immobilier (contrasteimmobilier.ca — Beauport, Limoilou, Ste-Foy, Val-Bélair, Lévis, St-Nicolas, St-Romuald). Site WordPress rendu serveur : page d'accueil = cartes d'immeubles, pages immeubles = unités individuelles (div.building-stack-unit avec attributs data-*). | |
| 10 | + | |
| 11 | +- **Site** : https://contrasteimmobilier.ca | |
| 12 | +- **Page des annonces** : https://contrasteimmobilier.ca | |
| 13 | +- **Secteurs couverts** : Beauport, Limoilou, Ste-Foy, Val-Bélair, Lévis, St-Nicolas, St-Romuald | |
| 14 | +- **Module** : `louka/connectors/contraste.py` — classe `ContrasteConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://contrasteimmobilier.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://contrasteimmobilier.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 221 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Agora Phase 2 — unité 206 | | |
| 33 | +| `address` | Adresse civique | 100 % | 4855 rue de L'Escarpement, Québec, Québec, G3K0N8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 55 % | Québec | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 86 % | 1 381 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-12-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8509083 | | |
| 43 | +| `description` | Description | 100 % | 🤩 NOUVEAU : 2 mois gratuits* sur toutes nos unités ! Au centre de tous vos besoins. Situé… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 4 photo(s) — https://contrasteimmobilier.ca/wp-content/uploads/2025/02/plan-202-204-206-3… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Non chauffé et éclairé", "Entrée laveuse-sécheuse", "Internet inclus", "Air climatisé",… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": true, "internet": true}, "appliances": {… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://contrasteimmobilier.ca/appartements/ago2-4855/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 221 trouvées, +0 / ~221 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 234 au total, **221 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 86 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync contraste` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='contraste' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/copley.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Copley — connecteur `copley` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 52/52 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Copley (groupecopley.com) Locations haut de gamme — Westmount, Mont-Royal, Saint-Laurent, centre-ville de Montréal, NDG (le site couvre aussi Toronto/Ottawa, exclus ici). Webflow CMS rendu serveur : /properties paginé (?15d7d54c_page=N), cartes avec champs fs-cmsfilter-*, fiches détaillées pour les photos. | |
| 10 | + | |
| 11 | +- **Site** : https://www.groupecopley.com | |
| 12 | +- **Page des annonces** : https://www.groupecopley.com/ | |
| 13 | +- **Secteurs couverts** : Westmount, Mont-Royal, Saint-Laurent | |
| 14 | +- **Module** : `louka/connectors/copley.py` — classe `CopleyConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.groupecopley.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.groupecopley.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 52 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 447 Mount Stephen | | |
| 33 | +| `address` | Adresse civique | 100 % | 447 Mount Stephen, Westmount, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Westmount | | |
| 35 | +| `sector` | Secteur / quartier | 60 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 3 500 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1573 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.48367 | | |
| 43 | +| `description` | Description | 100 % | Located in Montreal's prestigious Westmount district, this beautifully renovated upper du… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 30 photo(s) — https://cdn.prod.website-files.com/6449860fc17b160d22960284/68a375c4c6a1343… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1.5 salle(s) de bain", "Laundry", "Kitchen Appliances", "Light Fixtures", "Balcony", "H… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true}, "ac": true, "balcony": true, "parking": {"available": tr… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.groupecopley.com/properties/447-mount-stephen-avenue | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 52 trouvées, +0 / ~52 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 52 au total, **52 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync copley` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='copley' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/cosoltec.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Cosoltec (Evado, Le Monroe, Natür) — connecteur `cosoltec` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Laurentides · Backend : direct · Annonces actives : 44/52 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Cosoltec (cosoltec.com — projets locatifs Evado à Sainte-Thérèse, Le Monroe à Blainville, Natür à Saint-Jérôme). Les sites vitrines (evado.ca, lemonroe.ca, naturcondos.ca) affichent leurs unités via le widget Planpoint : on interroge la même API JSON publique (app.planpoint.io/api/{groups,projects}/find, POST namespace+hostName, 3 requêtes/sync) — prix mensuel, pi², chambres, statut, plans et photos par unité ; seules les unités « Available » sont retenues. | |
| 10 | + | |
| 11 | +- **Site** : https://www.cosoltec.com/fr | |
| 12 | +- **Page des annonces** : https://www.cosoltec.com/fr/espaces-disponibles | |
| 13 | +- **Secteurs couverts** : Sainte-Thérèse, Blainville, Saint-Jérôme | |
| 14 | +- **Module** : `louka/connectors/cosoltec.py` — classe `CosoltecConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://app.planpoint.io/api | |
| 20 | +- **URLs de départ (constantes du module)** : https://app.planpoint.io/api · https://www.evado.ca/plans · https://www.lemonroe.ca/plans · https://www.naturcondos.ca/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 44 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Evado — Unité 204 | | |
| 33 | +| `address` | Adresse civique | 98 % | 350 Place Fabien-Drapeau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sainte-Thérèse | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 80 % | 1 800 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 693 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 98 % | 45.6501510049674 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 3 photo(s) — https://storage.googleapis.com/planpoint-bucket/imageprjett-1739155435539.we… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"bathrooms": 1, "floor": "2", "furnished": false} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.evado.ca/plans | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 44 trouvées, +0 / ~44 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 52 au total, **44 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 98 % · prix 80 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync cosoltec` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='cosoltec' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/courtemanche.md
+78 −0
@@ -0,0 +1,78 @@ | ||
| 1 | +# Gestion Immobilière Courtemanche — connecteur `courtemanche` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 0/0 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Immobilière Courtemanche (gestioncourtemanche.ca — Saguenay : Chicoutimi/Chicoutimi-Nord, plusieurs centaines d'unités, leader du Saguenay). WordPress + Beaver Builder + plugin maison « realestate », tout rendu serveur. Liste /location/tous/ (taxonomie real-estate-location) : cartes `.real-estate-box` avec type (« 1 1/2 »), adresse, prix (« 700 $ / mois »), inclusions et date « Libre le » ; quand aucun logement n'est libre, la page affiche « Aucun logement disponible… » et le connecteur retourne une liste vide — situation normale sur ce marché (taux d'inoccupation très bas au Saguenay). Fiche détail /immobilier/<slug>/ (via cache BD) : description, caractéristiques (taxonomie real-estate-characteristic), GPS (carte Google du plugin) et secteur (lien « Retour » vers /location/<secteur>/). robots.txt Yoast ouvert, sitemaps real-estate-location/-characteristic. | |
| 10 | + | |
| 11 | +- **Site** : https://gestioncourtemanche.ca | |
| 12 | +- **Page des annonces** : https://gestioncourtemanche.ca/location/tous/ | |
| 13 | +- **Secteurs couverts** : Saguenay / Chicoutimi (Centres commerciaux, UQAC/CÉGEP, Chicoutimi-Nord) — 0 logement libre au 2026-08-08, parc plein | |
| 14 | +- **Module** : `louka/connectors/courtemanche.py` — classe `CourtemancheConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://gestioncourtemanche.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestioncourtemanche.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 0 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | — | — | | |
| 33 | +| `address` | Adresse civique | — | — | | |
| 34 | +| `city` | Ville (normalisée) | — | — | | |
| 35 | +| `sector` | Secteur / quartier | — | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | — | — | | |
| 37 | +| `price` | Loyer mensuel ($) | — | — | | |
| 38 | +| `bedrooms` | Chambres | — | — | | |
| 39 | +| `bathrooms` | Salles de bain | — | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | — | — | | |
| 41 | +| `availability_date` | Date de disponibilité | — | — | | |
| 42 | +| `lat` | GPS (lat/lng) | — | — | | |
| 43 | +| `description` | Description | — | — | | |
| 44 | +| `images` | Photos (JSON) | — | — | | |
| 45 | +| `amenities` | Commodités (JSON) | — | — | | |
| 46 | +| `details` | Détails additionnels (JSON) | — | — | | |
| 47 | +| `url` | URL de l'annonce source | — | — | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 0 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 0 au total, **0 actives** | |
| 59 | +- **Première ingestion** : — · **Dernière observation** : — | |
| 60 | +- **Complétude clé (actives)** : GPS — · prix — · photos — · description — | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync courtemanche` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='courtemanche' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/cromwell.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Cromwell Management — connecteur `cromwell` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 12/12 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Cromwell Management (cromwellmgt.ca) ~20 immeubles à Montréal (Plateau, Outremont, Westmount, centre-ville, Côte-des-Neiges, Hampstead). Les unités individuelles avec prix sont publiées sur le site jumeau cromwellmontreal.ca (WordPress + thème Houzez, rendu serveur) : cartes .item-listing-wrap avec data-listid, fiches /property/<slug>/ pour photos, statut et description. | |
| 10 | + | |
| 11 | +- **Site** : https://cromwellmgt.ca | |
| 12 | +- **Page des annonces** : https://cromwellmgt.ca/en/apartments-for-rent-montreal | |
| 13 | +- **Secteurs couverts** : Centre-ville, Outremont, CSL, NDG | |
| 14 | +- **Module** : `louka/connectors/cromwell.py` — classe `CromwellConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://cromwellmontreal.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://cromwellmontreal.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 12 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Renovated Plateau Studio Apartment | | |
| 33 | +| `address` | Adresse civique | 100 % | 3605 Rue Saint-Urbain, Montréal, QC, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 83 % | Plateau | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 345 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 334 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5128813 | | |
| 43 | +| `description` | Description | 100 % | Promotion of 1 FREE MONTH. Conditions may apply. That offer can be modified or canceled a… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://cromwellmontreal.ca/wp-content/uploads/2023/08/stu-203-overview-sfw-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["334 Sq. ft", "1 Bathroom(s)", "Balcony", "City Views", "Cooking Stove", "Dishwasher", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true}, "appliances": {"fridge": true, "stov… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://cromwellmontreal.ca/property/renovated-plateau-studio-apartment/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 12 trouvées, +0 / ~12 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 12 au total, **12 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync cromwell` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='cromwell' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/denux.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Denux — connecteur `denux` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 18/18 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Denux (groupedenux.com) Portefeuille pancanadien (plateforme Rentsync / The Lift System). Seules les villes québécoises sont interrogées (Montréal, Saint-Lambert, Mascouche) — la Colombie-Britannique, l'Alberta et la France sont exclues d'office. Découverte des immeubles via l'API JSON du site (api.theliftsystem.com/v2/search, jeton public embarqué dans le JS du site), puis parsing des fiches /residential/<slug> rendues serveur : suites disponibles (div.suite[data-suite-id] avec type, prix, chambres, date de disponibilité), commodités et galerie photos. | |
| 10 | + | |
| 11 | +- **Site** : https://www.groupedenux.com | |
| 12 | +- **Page des annonces** : https://www.groupedenux.com/ | |
| 13 | +- **Secteurs couverts** : Montréal, Saint-Lambert, Mascouche | |
| 14 | +- **Module** : `louka/connectors/denux.py` — classe `DenuxConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://api.theliftsystem.com/v2/search | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.groupedenux.com · https://api.theliftsystem.com/v2/search | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par offset | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 18 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | ROYAL-URBAIN — Studio | | |
| 33 | +| `address` | Adresse civique | 100 % | 3777 ST-URBAIN | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 61 % | Plateau Mont-Royal | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 025 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5141861 | | |
| 43 | +| `description` | Description | 100 % | Prestigious high-rise in the heart of downtown Montreal, near McGill University, St-Laure… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://assets.rentsync.com/groupe_denux/images/gallery/full/1719431683447_… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Balconies", "Cable ready", "Fridge", "Individual thermostats", "Internet ready", "Park … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true, "cable": true}, "appliances": {"fridge": true, "stove":… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.groupedenux.com/residential/royal-urbain | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 18 trouvées, +0 / ~18 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 18 au total, **18 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync denux` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='denux' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/desmarais.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immeubles Desmarais — connecteur `desmarais` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 14/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immeubles Desmarais (immeublesdesmarais.ca) Gestionnaire historique de Gatineau (Hull, Aylmer, Buckingham). Site PHP custom encodé ISO-8859-1, rendu CÔTÉ SERVEUR : la page /logements liste les cartes (titre, secteur, chambres, superficie, type, prix « À partir de ») avec pagination ?entity=logements&page=N. Le script de la carte Google (showAddress) publie en plus l'adresse civique + code postal et le lien canonique /logements/<id>/<slug> de chaque annonce. La fiche détail ajoute la date de disponibilité, la description complète et la galerie (/upload/logements/<id>/NN.jpg) — via self.detail() (cache BD) avec plafond par sync. Les locaux commerciaux vivent sous /locaux (entité distincte) et ne sont donc jamais ramassés. | |
| 10 | + | |
| 11 | +- **Site** : https://www.immeublesdesmarais.ca | |
| 12 | +- **Page des annonces** : https://www.immeublesdesmarais.ca/logements | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer, Buckingham) | |
| 14 | +- **Module** : `louka/connectors/desmarais.py` — classe `DesmaraisConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.immeublesdesmarais.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.immeublesdesmarais.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 14 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le St-Laurent (100-110 Dollard-des-Ormeaux) | | |
| 33 | +| `address` | Adresse civique | 100 % | 110 Dollard-des-Ormeaux, Gatineau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 71 % | Hull | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 710 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1050 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.432142 | | |
| 43 | +| `description` | Description | 100 % | PROMOTION POUR UN TEMPS LIMITÉ: SUR UN BAIL DE 12 MOIS, LE DERNIER MOIS DE LOYER EST GRAT… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 20 photo(s) — https://www.immeublesdesmarais.ca/upload/logements/9/01.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": true}, "appliances": {"fridge": true, "s… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.immeublesdesmarais.ca/logements/9/le-st-laurent-100-110-dollard-des-ormeaux | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 14 trouvées, +0 / ~14 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **14 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync desmarais` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='desmarais' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/desroches.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immeubles Claude Desroches — connecteur `desroches` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montérégie · Backend : direct · Annonces actives : 6/6 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immeubles Claude Desroches (immeublesclaudedesroches.com — Granby, Cowansville, Drummondville). Site PHP custom : une seule page statique /logements-a-louer/ avec un tableau par ville (« Nos logements à louer à <Ville> ») ; une ligne par logement, repérée par son ancre stable <a name="logNN">. Colonnes : photo (badge est-loue.png = déjà loué -> ignoré), adresse, grandeur, prix, étage, note libre (mois de libération, inclusions, rénové…). La section « LOCAUX À LOUER » (commercial) n'a pas d'ancres logNN et est donc naturellement exclue. Aucune page détail n'existe. | |
| 10 | + | |
| 11 | +- **Site** : https://www.immeublesclaudedesroches.com | |
| 12 | +- **Page des annonces** : https://www.immeublesclaudedesroches.com/logements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Granby, Cowansville (+ quelques logements à Drummondville) | |
| 14 | +- **Module** : `louka/connectors/desroches.py` — classe `DesrochesConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.immeublesclaudedesroches.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.immeublesclaudedesroches.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 601 Bertrand, Granby | | |
| 33 | +| `address` | Adresse civique | 100 % | 601 Bertrand, Granby | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Granby | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 950 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4204967 | | |
| 43 | +| `description` | Description | 100 % | juillet | | |
| 44 | +| `images` | Photos (JSON) | 50 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Étage : 1er"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"floor": 1} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.immeublesclaudedesroches.com/logements-a-louer/#log96 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:21 — 6 trouvées, +0 / ~6 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 6 au total, **6 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 50 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync desroches` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='desroches' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/devcore.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Devcore Group — connecteur `devcore` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Côte-Nord · Backend : direct · Annonces actives : 14/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Devcore Group (devcore.ca — 555 portes à Sept-Îles + Gatineau/Maniwaki/Thurso/Val-d'Or ; siège à Gatineau). WordPress + WPML. Le site n'expose pas d'unités individuelles : chaque « milieu de vie » (CPT `properties`) est une page marketing par complexe. L'API REST wp-json est ouverte et PRIVILÉGIÉE ici (4 requêtes par sync, zéro parsing de gabarit) : /wp/v2/properties + les taxonomies property_city (ville), property_type (« 1 chambre », « Studio »…) et property_price (fourchettes ; « … / mois » = locatif, « $100,000… » = vente). Une annonce Lou-Ka = un complexe locatif : prix seulement si la page annonce « à partir de N$ » (jamais de valeur inventée), typologies en commodités, fourchettes en détails. Filtres : propriétés de l'Ontario (Cornwall, Ottawa, Limoges…) exclues, vente-seulement exclue, logements corporatifs (moyen terme) exclus, doublons éditoriaux (pages dupliquées du même complexe) dédoublonnés par ville+description. La page /location/ du site est périmée (fiches 404, métadonnées croisées) : non utilisée. robots.txt ouvert, sitemap Yoast. | |
| 10 | + | |
| 11 | +- **Site** : https://devcore.ca | |
| 12 | +- **Page des annonces** : https://devcore.ca/wp-json/wp/v2/properties | |
| 13 | +- **Secteurs couverts** : Sept-Îles (555 portes : portail, Complexe JDV, Complexe la Baie) + Gatineau (Domaine de la Baie, Cinq23, Urbania, Place St James), Val-d'Or (Plateau Sabourin), Thurso (1Place), Maniwaki (Le CENTRAL) — Ontario exclu | |
| 14 | +- **Module** : `louka/connectors/devcore.py` — classe `DevcoreConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://devcore.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://devcore.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 14 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Domaine de la Baie | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 7 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 7 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Bienvenue dans votre logement avant-gardiste Joignez-vous à nous et profitez du premier l… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://devcore.ca/wp-content/uploads/2022/09/Domaine-de-la-baie-Gatineau-c… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Unités : 1 chambre", "Unités : 2 chambres", "Unités : 3 chambres", "Unités : Studio"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true}, "elevator": true, "balcony": true, "parking": {"availabl… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://devcore.ca/propriete/domaine-de-la-baie-1/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:22 — 14 trouvées, +0 / ~14 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **14 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 7 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync devcore` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='devcore' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/devimco.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Devimco Appartements — connecteur `devimco` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 480/575 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Devimco Appartements (devimco.com/appartements — St Ann & Hexagone à Griffintown, Alexander & Maestria au centre-ville de Montréal, Éolia / Luméo / Nobel à Brossard, Ostral à Longueuil). Chaque page projet embarque un iframe Planpoint (app.planpoint.io) ; l'inventaire complet s'obtient via l'API JSON de Planpoint : POST https://app.planpoint.io/api/projects/find {namespace, hostName} -> floors[] -> units[] (prix, chambres, photos, disponibilité...). | |
| 10 | + | |
| 11 | +- **Site** : https://devimco.com | |
| 12 | +- **Page des annonces** : https://devimco.com/appartements | |
| 13 | +- **Secteurs couverts** : Griffintown, Brossard (Solar Uniquartier) | |
| 14 | +- **Module** : `louka/connectors/devimco.py` — classe `DevimcoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://devimco.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://app.planpoint.io/api/projects/find · https://devimco.com · https://app.planpoint.io/api/groups/find | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 480 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Alexander Phase 1 Appartements — unité 309 | | |
| 33 | +| `address` | Adresse civique | 100 % | 2255 René-Lévesque Blvd W, Montreal | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Centre-ville | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 130 $ | | |
| 38 | +| `bedrooms` | Chambres | 84 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 619 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.48885054534291 | | |
| 43 | +| `description` | Description | 100 % | Étage 3 — Centre Ville | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 13 photo(s) — https://storage.googleapis.com/planpoint-bucket/Alexander-Piscineinterieur-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["internet", "electricity", "heating", "balcony", "stove", "refrigerator", "dishwasher", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "internet": true}, "appliances": {"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://devimco.com/appartements/a-louer/montreal/centre-ville/alexander-appartements | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:22 — 480 trouvées, +0 / ~480 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 575 au total, **480 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync devimco` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='devimco' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/dma_locago.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# DMA / Locago (Douville, Moffet & Associés) — connecteur `dma_locago` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 118/124 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur DMA / Locago (Douville, Moffet & Associés) locago.ca présente les complexes; les unités (avec prix/disponibilité) sont embarquées dans les pages MapSVG de v1.dma.immo (JSON `data_db.objects` : superficie, étage, orientation, mois/année de disponibilité, prix). La Tour Frontenac a son propre sélecteur JetEngine sur dma.immo (/frontenac-selecteur-pub/ : cartes avec prix, étage, pi², orientation). Une annonce par unité disponible; une annonce « projet » pour les complexes sans sélecteur d'unités (IDOLA, Le Pivot). Luxo Place (Ottawa) est exclu — hors région Québec/Lévis. | |
| 10 | + | |
| 11 | +- **Site** : https://locago.ca | |
| 12 | +- **Page des annonces** : https://locago.ca | |
| 13 | +- **Secteurs couverts** : Ste-Foy, Vanier, Lebourgneuf, Charlesbourg, Beauport | |
| 14 | +- **Module** : `louka/connectors/dma_locago.py` — classe `DMALocagoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.v1.dma.immo | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.v1.dma.immo · https://dma.immo · https://locago.ca · https://lewow.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 118 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le WOW — Unité 016 | | |
| 33 | +| `address` | Adresse civique | 29 % | 930, rue Samuel-King, Québec | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Sainte-Foy | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 98 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 98 % | 1 917 $ | | |
| 38 | +| `bedrooms` | Chambres | 98 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 98 % | 936 | | |
| 41 | +| `availability_date` | Date de disponibilité | 89 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 29 % | 46.7799387 | | |
| 43 | +| `description` | Description | 100 % | 1 chambre — 936 pi² | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 13 photo(s) — https://locago.ca/wp-content/uploads/2024/12/WOW.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 98 % | {"price_from": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.v1.dma.immo/le-wow-unites/#unite-016 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:23 — 118 trouvées, +0 / ~118 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 124 au total, **118 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 29 % · prix 98 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync dma_locago` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='dma_locago' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/duproprio.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# DuProprio (location) — connecteur `duproprio` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 3890/3896 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +DuProprio (duproprio.com) — section LOCATION ~4 200 annonces de particuliers (sans courtier : zéro chevauchement MLS). Découverte par les 21 sitemaps régionaux `sitemaps/fr/<region>-listings.xml.gz` filtrés sur `/fr/location/`. Fiches SSR (Laravel/CloudFront, aucun anti-bot) : JSON-LD `Apartment` (adresse + code postal + chambres/SDB + amenityFeature) et `RealEstateListing` (offers.price + availabilityStarts), lat/lng inline, superficie « 970 pi² », galerie dans un JSON échappé ("photos":[…]). Fiche retirée -> 302 vers la page parente (détectée par l'URL finale sans `/hab-`). Cache détail avec TTL (_detailutil.TtlDetailCache). Respect robots.txt : ne jamais toucher /webservice/, /fr-ca/api, /api-proxy. | |
| 10 | + | |
| 11 | +- **Site** : https://duproprio.com | |
| 12 | +- **Page des annonces** : https://duproprio.com/fr/location/montreal | |
| 13 | +- **Secteurs couverts** : Province entière — location par des particuliers (sans courtier), ~4 200 annonces | |
| 14 | +- **Module** : `louka/connectors/duproprio.py` — classe `DuProprioConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://duproprio.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://duproprio.com · https://photos.duproprio.com/photos/public/for_rent/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3890 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 91, avenue Jacques-Cartier, Matane à louer | | |
| 33 | +| `address` | Adresse civique | 100 % | 91, avenue Jacques-Cartier | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Matane | | |
| 35 | +| `sector` | Secteur / quartier | 20 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 100 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 98 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 61 % | 1100 | | |
| 41 | +| `availability_date` | Date de disponibilité | 86 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.8513 | | |
| 43 | +| `description` | Description | 100 % | "Professionnel, retraité confortable, couple stable, personne en transition, employé relo… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 94 % | ["Stationnement", "Entrée Laveuse-sécheuse", "Ascenseur", "Entrée Lave-vaisselle", "Range… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true, "dishwasher_hookup": true}, "ac": true, "ele… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://duproprio.com/fr/location/bas-saint-laurent/matane/4-1-2-a-louer/hab-91-avenue-ja… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.3 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:23 — 3890 trouvées, +0 / ~3890 / -6 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3896 au total, **3890 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 7, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync duproprio` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='duproprio' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/dynamic.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion immobilière Dynamic — connecteur `dynamic` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 48/53 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion immobilière Dynamic (lesgestionsdynamic.com) — apparts à Sherbrooke, Magog, Granby, East Angus. WordPress + thème immobilier Houzez, même famille que gimcote.py : archive /a-louer/ paginée (cartes div.item-listing-wrap avec prix, galerie data-images, data-listid). Particularité locale : pas d'adresse ni de statut sur la carte — la disponibilité est un suffixe du titre (« IMMÉDIATEMENT », « JUILLET », « 1er AOÛT »…) et l'adresse/ville/GPS viennent de la fiche détail (bloc #property-address-wrap, carte Houzez). Sert de CLASSE DE BASE à la famille Houzez de l'Estrie : Gestimmo Estrie (gestimmo_estrie.py) et Agence de location Sherbrooke / groupe Prestiplex (agence_sherbrooke.py) n'en redéfinissent que les constantes et les crochets carte (statut/étiquette/adresse). | |
| 10 | + | |
| 11 | +- **Site** : https://lesgestionsdynamic.com | |
| 12 | +- **Page des annonces** : https://lesgestionsdynamic.com/a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont, Les Nations), Magog | |
| 14 | +- **Module** : `louka/connectors/dynamic.py` — classe `DynamicConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://lesgestionsdynamic.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lesgestionsdynamic.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 48 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 375, rue Terrill IMMÉDIATEMENT | | |
| 33 | +| `address` | Adresse civique | 100 % | 375 rue terrill | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 92 % | Fleurimont | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 995 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.41418989061 | | |
| 43 | +| `description` | Description | 100 % | 4 1/2 à louer — Disponible dès maintenant PROMO : 1 mois gratuit pour tout bail de 12 moi… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 6 photo(s) — https://lesgestionsdynamic.com/wp-content/uploads/2003/04/cuisine-salon-2.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chambres : 2", "Salle(s) de bain : 1", "Animaux non-acceptés", "Balcon", "Buanderie sur… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true}, "balcony": true, "laundry": true, "pets": "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lesgestionsdynamic.com/property/375-rue-terrill-juillet/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 48 trouvées, +0 / ~48 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 53 au total, **48 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync dynamic` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='dynamic' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/edifia.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Edifia Groupe Immobilier — connecteur `edifia` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 180/185 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Edifia Groupe Immobilier (edifiaimmobilier.com) Le locatif d'Edifia est réparti sur plusieurs plateformes : - Le Vital (levitalappartements.com, Lévis/Desjardins, 230 unités) -> sélecteur Livya : la page « Plans et prix » pointe vers un module app.livya.com dont le HTML (Next.js/RSC) embarque le JSON complet des unités (prix, superficie, chambres, étage, date de libération) - Capella (capellalevis.com, Lévis, résidence pour aînés, 198 unités) -> sélecteur d'étages « sysc » : JSON `units = [[...]]` dans la page - Le Cardinal Sud (appartementscardinal.com/cardinal-sud/) -> même plateforme « sysc » (unités, dates, plans, inclusions) - Le Cardinal Nord + unités Cardinal Sud absentes du micro-site -> portail BuildingStack edifialocation.com (« Trouvez un logement ») : /Listing/Listings embarque `var units = [...]` (prix, pi², chambres, GPS, contact) et les pages /b/<id> donnent dates et commodités Exclus : HUMĀ phases 1-2 (connecteur dédié huma.py), Le Stellar Chicoutimi (Saguenay, hors région), Solis (condos en vente), Riva Ouest (Lavaltrie, en construction — aucune unité affichée nulle part). | |
| 10 | + | |
| 11 | +- **Site** : https://edifiaimmobilier.com | |
| 12 | +- **Page des annonces** : https://edifialocation.com/Listing/Listings | |
| 13 | +- **Secteurs couverts** : Lévis (Desjardins/Umano), Val-Bélair | |
| 14 | +- **Module** : `louka/connectors/edifia.py` — classe `EdifiaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://edifialocation.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://edifialocation.com · https://www.levitalappartements.com · https://capellalevis.com · https://appartementscardinal.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 180 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Vital — Unité 922 | | |
| 33 | +| `address` | Adresse civique | 100 % | 6078 Boulevard Étienne-Dallaire, Lévis, G6V 9M9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Desjardins | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 93 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 450 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-12-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7947 | | |
| 43 | +| `description` | Description | 100 % | Type B13 — Étage 9 — 450 pi² — 1 salle(s) de bain — *Prix sujet à changement sans préavis | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://www.levitalappartements.com/wp-content/uploads/2024/04/vital_social_… | | |
| 45 | +| `amenities` | Commodités (JSON) | 97 % | ["Espace coworking", "Cuisine commune", "Salon de jeux commun", "Espace lounge", "Terrass… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"elevator": true, "balcony": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.levitalappartements.com/plans-et-prix/#unite-922 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:24 — 175 trouvées, +0 / ~175 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 185 au total, **180 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 93 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync edifia` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='edifia' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/elements.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Quartier les Éléments — connecteur `elements` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 2/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Quartier les Éléments (quartierleselements.com — Lévis, secteur Saint-Romuald, 5 phases). Navigation : phase -> étage (plan interactif <area data-available>) -> fiche d'unité (type, superficie, prix). | |
| 10 | + | |
| 11 | +- **Site** : https://www.quartierleselements.com | |
| 12 | +- **Page des annonces** : https://www.quartierleselements.com | |
| 13 | +- **Secteurs couverts** : Lévis (St-Romuald) | |
| 14 | +- **Module** : `louka/connectors/elements.py` — classe `ElementsConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.quartierleselements.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.quartierleselements.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Quartier les Éléments — Phase 3, unité 210 (3½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1432, rue de Jupiter, Lévis | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Romuald | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 470 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 952 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7345302 | | |
| 43 | +| `description` | Description | 100 % | Superficie brute : 952 pi2 \| Superficie terrasse : 126 pi2 \| Superficie totale : 1078 p… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://www.quartierleselements.com/uploads/unit_types/photos/photo_unit_typ… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Avec boudoir", "Terrasse"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true, "contact": {"phone": "581-922-3334", "email": "info@quartierleselements… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.quartierleselements.com/appartements-condos-locatifs-levis/phase-3/etage-2/21… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:24 — 2 trouvées, +0 / ~2 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync elements` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='elements' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/elite.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Elite Immobilier — connecteur `elite` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 12/12 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Elite Immobilier (eliteimmobilier.ca — Gatineau) Gestionnaire de projets locatifs neufs à Gatineau (Complexe Fraser à Aylmer, Desrosiers rue Larabie, Nuvo au Plateau). WordPress/Elementor : le hub /trouver-un-logement/ liste une page par projet, découverte à chaque sync. Chaque page projet publie ses typologies avec prix dans des boutons Elementor (« 1 CHAMBRE À PARTIR DE $1499/MOIS* ») -> une annonce par typologie affichée AVEC prix. Le portail SecureCafe (Yardi) du site est réservé aux résidents : aucune unité individuelle publique — la granularité typologie est donc la donnée la plus fine disponible. Adresses/secteurs : publiés en clair sur chaque page projet ; un mapping des slugs connus fournit l'adresse vérifiée (jamais devinée pour un slug inconnu -> address vide). | |
| 10 | + | |
| 11 | +- **Site** : https://eliteimmobilier.ca | |
| 12 | +- **Page des annonces** : https://eliteimmobilier.ca/trouver-un-logement/ | |
| 13 | +- **Secteurs couverts** : Gatineau (Aylmer, Plateau) | |
| 14 | +- **Module** : `louka/connectors/elite.py` — classe `EliteConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://eliteimmobilier.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://eliteimmobilier.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 12 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Complexe Fraser — Studio | | |
| 33 | +| `address` | Adresse civique | 100 % | 475-515, chemin Fraser, Gatineau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 67 % | Aylmer | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 399 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.38796 | | |
| 43 | +| `description` | Description | 100 % | Studios, 1 et 2 chambres à Aylmer. Électricité, internet et 5 électroménagers inclus. Rés… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://eliteimmobilier.ca/wp-content/uploads/2026/03/cover-fraser.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "internet": true}, "appliances": {"fridge": true}, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://eliteimmobilier.ca/trouver-un-logement/complexe-chemin-fraser/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:24 — 12 trouvées, +0 / ~12 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 12 au total, **12 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync elite` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='elite' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/elk.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# ELK Property Management — connecteur `elk` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur ELK Property Management (elkproperty.com) Gestionnaire du Plateau/Hull à Gatineau. Très vieux site PHP (PinchCMS), HTTP SEULEMENT (pas de HTTPS) : la page residential_new.php?typeID=1 (Ottawa/Gatineau) rend côté serveur un bloc par complexe : - div.results-in : adresse (h2 + code postal), galerie lightbox, description à puces (secteur « Hull District »), contact, note de loyer « Starting from $1050.00/month | Hydro/Gas not included », listes « Building Amenities » / « Apartment Features » ; - div.record-bttm#units_<id> : colonnes parallèles BEDROOMS / FLOORPLAN (PDF) / RENT alignées par index -> une annonce par TYPOLOGIE affichée sous « NOW RENTING / AVAILABLE APARTMENTS ». Les complexes hors Québec (Halifax sous typeID=2, adresses ON) sont exclus : seules les adresses « QC » passent. | |
| 10 | + | |
| 11 | +- **Site** : http://www.elkproperty.com | |
| 12 | +- **Page des annonces** : http://www.elkproperty.com/residential_new.php?typeID=1 | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Plateau) | |
| 14 | +- **Module** : `louka/connectors/elk.py` — classe `ElkConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : http://www.elkproperty.com | |
| 20 | +- **URLs de départ (constantes du module)** : http://www.elkproperty.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 244 Du Plateau Blvd. — 1 bedroom(s) | | |
| 33 | +| `address` | Adresse civique | 100 % | 244 Du Plateau Blvd., Gatineau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Hull | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 050 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 67 % | 45.4365147 | | |
| 43 | +| `description` | Description | 100 % | 244 Du Plateau Blvd. Access via Du Plateau near St. Raymond in Hull District of Gatineau … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 3 photo(s) — http://www.elkproperty.com/_uploads/apartments/112808_Todd Langille-2431.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["On-site management offering excellent service", "Condo style living", "Very large apart… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "hot_water": true}, "appliances": {"washer_dryer": t… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | http://www.elkproperty.com/residential_new.php?typeID=1#units_6 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:24 — 3 trouvées, +0 / ~3 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 67 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync elk` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='elk' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/equinoxe_batimo.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Batimo/EMD — Collection Équinoxe — connecteur `equinoxe_batimo` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 615/662 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Collection Équinoxe (Batimo) (collectionequinoxe.com — Équinoxe Saint-Elzéar / Lévesque / Lévesque O. / Daniel-Johnson à Laval, Bois-Franc à Saint-Laurent (Montréal), Le Carlyle à Mont-Royal, Le Westpark à Pointe-Claire). La page /disponibilites/ affiche un tableau JetEngine paginé (10 unités par page). La pagination passe par l'AJAX JetSmartFilters : POST /wp-admin/admin-ajax.php action=jet_smart_filters, provider=jet-data-table/result, paged=N -> tbody HTML complet (photos de l'unité incluses dans chaque rangée). | |
| 10 | + | |
| 11 | +- **Site** : https://collectionequinoxe.com | |
| 12 | +- **Page des annonces** : https://collectionequinoxe.com/ | |
| 13 | +- **Secteurs couverts** : Laval, Bois-Franc (Saint-Laurent) | |
| 14 | +- **Module** : `louka/connectors/equinoxe_batimo.py` — classe `EquinoxeBatimoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://collectionequinoxe.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://collectionequinoxe.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 615 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Équinoxe Lévesque (phase 1) — unité 1206 | | |
| 33 | +| `address` | Adresse civique | 100 % | 3030, boulevard Lévesque Ouest, Laval | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Laval | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Chomedey | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 530 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 600 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5392503 | | |
| 43 | +| `description` | Description | 100 % | Condo Type 1-06-1206 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://collectionequinoxe.com/wp-content/uploads/2024/04/p1066541_LVQ_1-06_… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Superficie 600 pi²", "1 salle(s) de bain", "Terrasse commune avec BBQ", "Gym équipé", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"pool": true, "gym": true, "storage": true, "pets": "conditions", "parking": {"available… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://collectionequinoxe.com/levesque/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:26 — 583 trouvées, +0 / ~583 / -12 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 662 au total, **615 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync equinoxe_batimo` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='equinoxe_batimo' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/evoludev.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Evoludev — connecteur `evoludev` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Lanaudière · Backend : direct · Annonces actives : 134/134 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Evoludev (location.groupeevoludev.com) Portail locatif maison (Laravel). La page d'accueil liste ~60 immeubles (cartes : nom, adresse+ville, étiquette Disponible/Complet, prix «à partir de»). Les pages projet (cache BD, seulement si l'immeuble est «Disponible») exposent un tableau d'unités (no, type, prix, statut, date, cac/sdb, pi², plan avec id d'appartement stable) + JSON-LD ApartmentComplex (description, GPS, animaux, commodités). | |
| 10 | + | |
| 11 | +- **Site** : https://location.groupeevoludev.com | |
| 12 | +- **Page des annonces** : https://location.groupeevoludev.com/ | |
| 13 | +- **Secteurs couverts** : Joliette, Saint-Charles-Borromée, Saint-Paul, Crabtree, Berthierville, Saint-Sulpice, Sainte-Julienne, Saint-Félix-de-Valois, Saint-Jacques, Saint-Lin, Sainte-Sophie, Rawdon, Laval, Charlemagne | |
| 14 | +- **Module** : `louka/connectors/evoludev.py` — classe `EvoludevConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://location.groupeevoludev.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://location.groupeevoludev.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 134 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Mills I — Unité 10 | | |
| 33 | +| `address` | Adresse civique | 100 % | 53 4 Av | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Crabtree | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 99 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1274 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.961773 | | |
| 43 | +| `description` | Description | 100 % | Premier immeuble de 16 unités d'un projet de 30 unités contemporaines, composé de 4 … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://location.groupeevoludev.com/storage/apartments/1516401318/app10.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Stationnement extérieur", "Internet sans fil illimité", "Air climatisé", "Aspirateur ce… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true}, "appliances": {"washer_dryer_hookup": true, "dishwashe… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://location.groupeevoludev.com/projet/le-mills-i | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:26 — 134 trouvées, +0 / ~134 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 134 au total, **134 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 99 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync evoludev` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='evoludev' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/fb_marketplace.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Facebook Marketplace (location) — connecteur `fb_marketplace` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 2107/5142 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Facebook Marketplace — catégorie location (propertyrentals) par ville du Québec. Annonces de particuliers, fort complément aux gestionnaires. Accès via Scrapfly ASP (render_js + proxy résidentiel CA), SANS compte ni cookie (le scraping public déconnecté est couvert par Meta v. Bright Data 2024). Les données vivent dans des balises <script type="application/json"> (objets marketplace_listing_title). Le scroll infini est bloqué hors connexion (~25 annonces/URL, mur de login) : on pagine par TRANCHES DE PRIX (minPrice/maxPrice), qui renvoient des lots quasi disjoints, et on accumule sur plusieurs synchronisations. Détail (/marketplace/item/<id>) : lat/lng + description (Scrapfly, coûteux) uniquement pour les nouvelles annonces via le cache. Type d'unité et disponibilité déduits du titre/description (pas d'attributs structurés hors connexion). ⚠️ Coût Scrapfly élevé + données personnelles (Loi 25) : ne jamais republier nom/téléphone du vendeur, garder le lien sortant. | |
| 10 | + | |
| 11 | +- **Site** : https://www.facebook.com/marketplace | |
| 12 | +- **Page des annonces** : https://www.facebook.com/marketplace/montreal/propertyrentals | |
| 13 | +- **Secteurs couverts** : Grandes villes QC — annonces de particuliers (Scrapfly) | |
| 14 | +- **Module** : `louka/connectors/fb_marketplace.py` — classe `FacebookMarketplaceConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.facebook.com/marketplace | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.facebook.com/marketplace | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2107 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Chambre privée à louer | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 91 % | Chambre | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 795 $ | | |
| 38 | +| `bedrooms` | Chambres | 91 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 2 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 2 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 15 % | 45.553455200005 | | |
| 43 | +| `description` | Description | 16 % | CHAMBRE EN COLOC DISPONIBLE, HOCHELAGA-MAISONNEUVE, 795 $ TOUT INCLUS. Nous avons une cha… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://scontent.fyvr5-1.fna.fbcdn.net/v/t39.30808-6/772797442_3843100965846… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 15 % | {"inclusions": {"heating": true, "electricity": true, "internet": true}, "appliances": {"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.facebook.com/marketplace/item/2151142982451520/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.4 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 02:58 — 1137 trouvées, +626 / ~511 / -355 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5142 au total, **2107 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 15 % · prix 100 % · photos 100 % · description 16 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 6, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync fb_marketplace` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='fb_marketplace' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/ferrovia.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Ferrovia (condos locatifs Mirabel) — connecteur `ferrovia` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Laurentides · Backend : direct · Annonces actives : 23/24 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Ferrovia (ferroviamirabel.com) Projet de condos locatifs neufs à Mirabel (secteur Saint-Janvier), 4 phases. WordPress + wpDataTables rendues côté serveur : chaque page « Disponibilités » contient un <table.wpDataTable> (UNITÉ, MODÈLE, ÉTAGE, PIÈCES, SUPERFICIE, SALLE D'EAU SUPP., DISPONIBILITÉ, PRIX, STATUT, PLAN). On ne retient que les lignes STATUT = « Disponible » ; external_id = phase + numéro d'unité. Le site précise que les logements sont non-fumeurs et sans animaux. Prix : colonne présente mais vide à ce jour — jamais inventé. | |
| 10 | + | |
| 11 | +- **Site** : https://www.ferroviamirabel.com | |
| 12 | +- **Page des annonces** : https://www.ferroviamirabel.com/disponibilites-phase-4/ | |
| 13 | +- **Secteurs couverts** : Mirabel (Saint-Janvier) — 4 phases, tables wpDataTables par phase (prix non publiés à ce jour) | |
| 14 | +- **Module** : `louka/connectors/ferrovia.py` — classe `FerroviaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.ferroviamirabel.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.ferroviamirabel.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 23 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Ferrovia phase 3 — unité 603 (3 1/2) | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Mirabel | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Janvier | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 950 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Condos neufs à louer du projet Ferrovia, à Mirabel dans le secteur de Saint-Janvier. Les … | | |
| 44 | +| `images` | Photos (JSON) | 0 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 22 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"pets": "non", "smoking": false, "phase": "3", "model": "E’", "floor": "6", "plan_pdf": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.ferroviamirabel.com/disponibilites-phase-3/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:37 — 23 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 24 au total, **23 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 0 % · photos 0 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync ferrovia` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='ferrovia' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/firma.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Firma — connecteur `firma` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 12/12 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Firma (groupefirma.ca) Condos locatifs en Montérégie / banlieue sud-ouest de Montréal (Salaberry-de-Valleyfield, Saint-Zotique, Sainte-Barbe, L'Île-Perrot...). Découverte des immeubles via l'API REST WordPress (post type "housing"), puis parsing des fiches /logement/<slug>/ : unités <li id="unit-NNN"> avec type, disponibilité, étage, superficie, commodités (icônes bjm-active) et images (plan + galerie de l'unité). Le prix est présent dans un commentaire HTML "<!-- - 1380$ / mois -->" (souvent vide). Lachute (Laurentides, hors Grand Montréal) est exclue. | |
| 10 | + | |
| 11 | +- **Site** : https://groupefirma.ca | |
| 12 | +- **Page des annonces** : https://groupefirma.ca/ | |
| 13 | +- **Secteurs couverts** : Montérégie, banlieue sud-ouest | |
| 14 | +- **Module** : `louka/connectors/firma.py` — classe `FirmaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://groupefirma.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://groupefirma.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 12 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Vesta II — 3½ #201 | | |
| 33 | +| `address` | Adresse civique | 100 % | 101 Rue Salaberry O, Salaberry-de-Valleyfield | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Salaberry-de-Valleyfield | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 8 % | 1 380 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 735 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 75 % | — | | |
| 43 | +| `description` | Description | 100 % | Étage : Rez-de-chaussez \| Superficie : 735 pi² — Magnifiques condos locatifs neufs 3 ½ S… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 15 photo(s) — https://groupefirma.ca/wp-content/uploads/cuisine-vesta-1024x1024.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 Stationnement non inclus", "Borne de charge disponible", "Chiens acceptés", "Air clim… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "pets": "oui", "parking": {"available": true, "included": true}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://groupefirma.ca/logement/le-vesta-ii/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:37 — 12 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 12 au total, **12 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 75 % · prix 8 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync firma` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='firma' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/floria.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Floria — connecteur `floria` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 21/21 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Floria (gestionfloria.ca) Condos locatifs neufs à Sherbrooke, Magog (Mont-Orford) et Coaticook. Site WordPress (Avada) : chaque page /immeuble/<slug>/ embarque le module de plans interactifs Livya (app.livya.com, client « gestion-floria », un projet/entité par immeuble). Même patron que somex_saintnicolas/louis14 : la page Next.js du module est rendue serveur et son flux RSC contient l'inventaire JSON complet (numéro, statut, loyer, pièces, superficie, adresse, ville, GPS, photos, plans). Découverte des immeubles via la page /secteurs/. Certains immeubles partagent le même projet Livya (jumelés 52/58 Flanc-Sud, 753/765 Rachel-Hébert…) : dédoublonnage par unitId. Seules les unités AVAILABLE deviennent des annonces ; certains projets ne publient pas le loyer (rentalPrice = 0) -> prix absent, rien d'inventé. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionfloria.ca | |
| 12 | +- **Page des annonces** : https://gestionfloria.ca/secteurs/ | |
| 13 | +- **Secteurs couverts** : Magog (Flanc-Sud/Mont-Orford, Solea), Sherbrooke (Plateau McCrea), Coaticook | |
| 14 | +- **Module** : `louka/connectors/floria.py` — classe `FloriaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionfloria.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionfloria.ca · https://app.livya.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 21 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 52 Rue du Flanc Sud — unité 8 (4½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 52 Rue du Flanc Sud, J1X 0J6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Magog | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 24 % | 1 440 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 10 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.2952 | | |
| 43 | +| `description` | Description | 100 % | Étage 1 \| Modèle B \| 2 chambre(s) \| 1 salle(s) de bain \| Balcon de 65 pi² | | |
| 44 | +| `images` | Photos (JSON) | 95 % | 1 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/33aff699-5fff-443e-80d6-d12eb… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true, "floor": 1} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionfloria.ca/immeuble/52-rue-flanc-sud/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 21 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 21 au total, **21 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 24 % · photos 95 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync floria` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='floria' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/forsa.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion immobilière Forsa — connecteur `forsa` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Lanaudière · Backend : direct · Annonces actives : 13/13 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion immobilière Forsa (gestionforsa.com) Squarespace. La page /logements-disponibles expose toutes les unités en sections « liste » (li.list-item) : titre « 2 1/2, Joliette - MAINTENANT » (type + ville + dispo), description (adresse civique + prix mensuel) et bouton « Détails » vers une page par unité (slug stable = external_id). Fiches détail (cache BD) : description riche + galerie complète. NB : robots.txt interdit /api/ et ?format=json → HTML seulement. | |
| 10 | + | |
| 11 | +- **Site** : https://www.gestionforsa.com | |
| 12 | +- **Page des annonces** : https://www.gestionforsa.com/logements-disponibles | |
| 13 | +- **Secteurs couverts** : Joliette, Saint-Charles-Borromée, Saint-Gabriel, Montréal | |
| 14 | +- **Module** : `louka/connectors/forsa.py` — classe `ForsaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.gestionforsa.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.gestionforsa.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 13 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 2 1/2, Joliette - MAINTENANT | | |
| 33 | +| `address` | Adresse civique | 100 % | 222, rue Lajoie Sud, app. 12 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Joliette | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 2½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 595 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 46 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 92 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 92 % | 46.0216796 | | |
| 43 | +| `description` | Description | 100 % | 222, rue Lajoie Sud, app. 12 2 1/2 595 $ /mois ENVIRONNEMENT À quelques minutes de l’auto… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://images.squarespace-cdn.com/content/v1/62aa0c0ae2002b5a5726b8c2/7450… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "hot_water": true}, "laundry": true, "smoking": fals… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.gestionforsa.com/222-12lajoiesud | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 13 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 13 au total, **13 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 92 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync forsa` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='forsa' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/fournelle.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Appartements Fournelle (Groupe Fournelle) — connecteur `fournelle` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Appartements Fournelle (Groupe Fournelle) (groupefournelle.com/appartements-fournelle/ — Bécancour, Centre-du-Québec). Page-brochure WordPress : des blocs .item par projet (h2 + paragraphes + galerie swiper). Seuls les blocs affichant des lignes de prix par unité (« 2 × 5½ au sous-sol – 1300 $ | 2 × 5½ au RDC – 1525 $ … ») produisent des annonces : une annonce par ligne typologie/étage, prix et disponibilité (« Immeuble neuf disponible à partir du 1er Mai 2026 ») fidèles au texte. external_id = slug du projet + typologie + étage. 1 requête par sync. | |
| 10 | + | |
| 11 | +- **Site** : https://www.groupefournelle.com | |
| 12 | +- **Page des annonces** : https://www.groupefournelle.com/appartements-fournelle/ | |
| 13 | +- **Secteurs couverts** : Bécancour (Domaine de l'Île — 8plex neuf vue sur le fleuve, secteur Sainte-Angèle) | |
| 14 | +- **Module** : `louka/connectors/fournelle.py` — classe `FournelleConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.groupefournelle.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.groupefournelle.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 5½ au sous-sol — Appartement à louer 4½ et 5½ avec vue sur le fleuve | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Bécancour | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 300 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Appartement à louer 4½ et 5½ avec vue sur le fleuve 2ᵉ et 3ᵉ étage avec vue sur le fleuve… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 15 photo(s) — https://www.groupefournelle.com/wp-content/uploads/2025/04/1000002904-group… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Emplacement de choix à proximité de tous les services", "Grande chambre", "Belle lumino… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false}, "ac": true, "balcony": true, "sm… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.groupefournelle.com/appartements-fournelle/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync fournelle` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='fournelle' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/garic.md
+85 −0
@@ -0,0 +1,85 @@ | ||
| 1 | +# Garic Gestion Immobilière — connecteur `garic` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 45/54 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Garic Gestion Immobilière (garic.ca) Gestionnaire de Gatineau (Hull, Vieux-Gatineau, secteur est). WordPress (Oxygen) : la grille filtrable de /a-louer/ se nourrit d'un endpoint admin-ajax MAISON `garic_get_properties` qui renvoie TOUT l'inventaire en JSON structuré : ID, adresse (post_title), prix/mois, type (« 4 ½ »), chambres, salles de bain, superficie, disponibilité, image, URL de la fiche et géocodage complet (lat/lng + quartier OpenStreetMap). Le nonce de sécurité est lu sur la page /a-louer/ à chaque sync. L'unique propriété d'OTTAWA est exclue (périmètre Québec). La fiche /a-louer/<slug> (cache BD) ajoute description, inclusions, « À proximité » et scores de mobilité. | |
| 10 | + | |
| 11 | +- **Site** : https://garic.ca | |
| 12 | +- **Page des annonces** : https://garic.ca/a-louer/ | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Vieux-Gatineau, Aylmer, Masson-Angers, Buckingham, Templeton), Thurso | |
| 14 | +- **Module** : `louka/connectors/garic.py` — classe `GaricConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://garic.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://garic.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 45 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 2-74 Rue Saint-Paul, Gatineau, QC J8P 4V6 | | |
| 33 | +| `address` | Adresse civique | 100 % | 2-74 Rue Saint-Paul, Gatineau, QC J8P 4V6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 93 % | Vieux-Gatineau | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 900 $ | | |
| 38 | +| `bedrooms` | Chambres | 98 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 44 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4792016 | | |
| 43 | +| `description` | Description | 100 % | 🏡 3 ½ à louer – 74 Rue Saint-Paul, Gatineau 🏡 📍 74 Rue Saint-Paul, Gatineau, QC J8P 4V6 B… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://garic.ca/wp-content/uploads/2026/07/IMG_6985.jpeg | | |
| 45 | +| `amenities` | Commodités (JSON) | 96 % | ["🍳 Cuisinière", "🧊 Réfrigérateur"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true, "stove": true}, "parking": {"available": true, "included"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://garic.ca/a-louer/2-74-rue-saint-paul-gatineau-qc-j8p-4v6/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 45 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 54 au total, **45 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 5 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-13 06:46 | 500 Server Error: Internal Server Error for url: https://garic.ca/a-louer/ | | |
| 68 | +| 2026-08-13 04:21 | 500 Server Error: Internal Server Error for url: https://garic.ca/a-louer/ | | |
| 69 | +| 2026-08-13 03:23 | 500 Server Error: Internal Server Error for url: https://garic.ca/a-louer/ | | |
| 70 | +| 2026-08-13 00:49 | 500 Server Error: Internal Server Error for url: https://garic.ca/a-louer/ | | |
| 71 | +| 2026-08-12 22:45 | 500 Server Error: Internal Server Error for url: https://garic.ca/a-louer/ | | |
| 72 | + | |
| 73 | +Rejouer la source seule : `python3 run.py sync garic` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='garic' ORDER BY ts DESC LIMIT 5;`). | |
| 74 | + | |
| 75 | +## Licence, attribution & conditions | |
| 76 | + | |
| 77 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 78 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 79 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 80 | +- Retrait sur demande : contact@spboucher.ai. | |
| 81 | + | |
| 82 | +## Historique | |
| 83 | + | |
| 84 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 85 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gesteco.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gesteco — connecteur `gesteco` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montérégie · Backend : direct · Annonces actives : 10/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gesteco (gesteco.ca) Condos locatifs neufs — Granby (Irwin Nord, Faubourg du Séminaire), Waterloo (Sommets de l'Horizon), Bromont, Cowansville. Umbraco (.NET) + app Vue `homeRentalBrowsingApp` : API JSON publique `/umbraco/api/units?locale=fr&page=N&pageSize=100` (pagination par en-têtes X-Total-Pages). Chaque unité expose id, adresse complète, ville, prix (rawBasePrice), date de disponibilité ISO, superficie (livingArea), chambres/sdb, configuration (« 4 ½ + bureau »), chiens permis, promotion, description HTML, images et l'URL de la fiche (`rentalUrl`). Filtres : status == "Available" ET buildingListingType == 1 (location — le type 0 = achat, prix de vente à 6 chiffres, hors périmètre). Aucune page détail nécessaire : l'API contient tout. | |
| 10 | + | |
| 11 | +- **Site** : https://gesteco.ca | |
| 12 | +- **Page des annonces** : https://gesteco.ca/location | |
| 13 | +- **Secteurs couverts** : Granby (Irwin Nord, Faubourg du Séminaire), Waterloo (Sommets de l'Horizon), Bromont, Cowansville | |
| 14 | +- **Module** : `louka/connectors/gesteco.py` — classe `GestecoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://gesteco.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gesteco.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 10 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 8-32 Chemin de l'Horizon, Waterloo | | |
| 33 | +| `address` | Adresse civique | 100 % | 8-32 Chemin de l'Horizon, Waterloo, J0E 2N0 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Waterloo | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 450 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 90 % | 1125 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.3194045 | | |
| 43 | +| `description` | Description | 100 % | Promotion : * 1ER MOIS GRATUIT* \| **Unité de coin** Caractéristiques principales : Cuisi… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://gesteco.ca/media/tt0jtclm/32hor-face.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["4 ½ + bureau", "2 chambre(s)", "1 salle(s) de bain", "Étage : 1er étage", "Borne de rec… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "storage": true, "pets": "conditions", "smoking": false, "parking": {"availa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gesteco.ca/location/waterloo/sommets-de-lhorizon/batiment-32/1er-etage/unite-8 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 10 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **10 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gesteco` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gesteco' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestimmo_estrie.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestimmo Estrie — connecteur `gestimmo_estrie` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 41/41 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestimmo Estrie (gestimmoestrie.com) Gestionnaire multi-immeubles de Sherbrooke et de l'Estrie. Même plateforme WordPress + thème Houzez que Gestion Dynamic : tout le parsing (cartes, pagination /a-louer/page/N/, fiches détail, cache BD) est hérité de DynamicConnector. Particularités du site : - la disponibilité est l'étiquette de statut de la carte (lien /status/ : « Libre maintenant », « Juillet », « Loué »…) ; - les fiches n'ont pas d'aperçu Houzez : le type d'unité vient du titre (« 4 1/2 Rue de la Sainte-Famille ») ou de la ligne « Grandeur : 4 1/2 » de la description. Les logements « Loué » sont exclus (filtre hérité). | |
| 10 | + | |
| 11 | +- **Site** : https://gestimmoestrie.com | |
| 12 | +- **Page des annonces** : https://gestimmoestrie.com/a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont, Mont-Bellevue), Lennoxville, Coaticook, Magog | |
| 14 | +- **Module** : `louka/connectors/gestimmo_estrie.py` — classe `GestimmoEstrieConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestimmoestrie.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestimmoestrie.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 41 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 🌞 Beau 4 1/2 avec beaucoup de lumière naturelle | | |
| 33 | +| `address` | Adresse civique | 100 % | 1045, Rue de la Sainte-Famille | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 73 % | Fleurimont | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 88 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 275 $ | | |
| 38 | +| `bedrooms` | Chambres | 88 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 2 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4108099 | | |
| 43 | +| `description` | Description | 100 % | 🏠 Adresse : 17-1045 rue Sainte-Famille 📅 Disponible à partir de : Maintenant 💲 Prix : 127… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://gestimmoestrie.com/wp-content/uploads/2026/05/Capture-décran-le-202… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Lits: 2", "Bain: 1", "4 ½", "Chauffage inclus", "Eau chaude incluse", "Électricité incl… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 88 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestimmoestrie.com/property/%f0%9f%8c%9e-beau-4-1-2-avec-beaucoup-de-lumiere-natu… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 41 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 41 au total, **41 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestimmo_estrie` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestimmo_estrie' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_fauvel.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Fauvel — connecteur `gestion_fauvel` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 11/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Fauvel (gestionfauvel.com) WordPress + Elementor + JetEngine. La page /logements-a-louer/ expose une grille .jet-listing-grid__item : data-post-id (id stable), data-url, en-têtes (disponibilité, prix, titre) et terme JetEngine = ville réelle. Fiches détail (cache BD) : adresse civique, description complète (unités dispo + inclusions) et galerie photos (carrousel Elementor). | |
| 10 | + | |
| 11 | +- **Site** : https://gestionfauvel.com | |
| 12 | +- **Page des annonces** : https://gestionfauvel.com/logements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Drummondville, Saint-Léonard-d'Aston, Notre-Dame-du-Bon-Conseil | |
| 14 | +- **Module** : `louka/connectors/gestion_fauvel.py` — classe `GestionFauvelConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionfauvel.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionfauvel.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 11 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Carré Degranpré – Condos locatifs | | |
| 33 | +| `address` | Adresse civique | 91 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Notre-Dame-du-Bon-Conseil | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 91 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 91 % | — | | |
| 38 | +| `bedrooms` | Chambres | 91 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 45 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 91 % | — | | |
| 43 | +| `description` | Description | 100 % | Immeuble de 6 unités construit en 2026, situé dans le charmant village de Notre-Dame-du-B… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://gestionfauvel.com/wp-content/uploads/2021/05/visuel-3D_609-619-Batis… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "pets": "non", "smoking": false, "parking": {"available": true, "included": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionfauvel.com/logements-a-louer/condos-grandpre/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 11 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **11 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 91 % · prix 91 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestion_fauvel` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_fauvel' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_habitation.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Habitation — connecteur `gestion_habitation` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Abitibi-Témiscamingue · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Habitation (gestionhabitation.ca — Abitibi-Témiscamingue : Val-d'Or, Amos, Malartic ; seul gestionnaire structuré couvrant Amos). WordPress + Oxygen Builder + WP Grid Builder, tout rendu serveur. Liste /a-louer/ : cartes `.location-card` (adresse, n° de porte, ville, secteur, disponibilité « DISPONIBLE » / « juin 2026 » / « NON DISPONIBLE », prix « 900$/mois ») — les cartes « NON DISPONIBLE » (logements loués) sont exclues. Fiche détail /logement/<slug>/ (via cache BD) : bloc structuré `.location-data__item` (pièces, chambres, salles de bain, chauffage/électricité/internet, animaux, fumeur, stationnement, disponibilité), description (`.location-more-infos`) et galerie (carrousel Oxygen, liens pleine taille). robots.txt WP standard (Disallow /wp-admin/), sitemap XML. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionhabitation.ca | |
| 12 | +- **Page des annonces** : https://gestionhabitation.ca/a-louer/ | |
| 13 | +- **Secteurs couverts** : Val-d'Or (Centre-ville, Val-des-Bois), Amos (Centre-ville), Malartic — cartes « NON DISPONIBLE » exclues | |
| 14 | +- **Module** : `louka/connectors/gestion_habitation.py` — classe `GestionHabitationConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://gestionhabitation.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionhabitation.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement, 4 chambres pour travailleurs | | |
| 33 | +| `address` | Adresse civique | 75 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Malartic | | |
| 35 | +| `sector` | Secteur / quartier | 75 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 75 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 3 200 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 4 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Complètement meublé Air climatisé avec Thermopompe Bureau et télévision dans tous les cha… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 25 photo(s) — https://gestionhabitation.ca/wp-content/uploads/2023/12/img-1126-scaled.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["4 chambre(s)", "1 salle(s) de bain", "Chauffage : inclus", "Électricité : inclus", "Int… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "internet": true, "cable": true}, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionhabitation.ca/logement/logement-611/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestion_habitation` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_habitation' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_isr.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion ISR — connecteur `gestion_isr` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 20/22 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion ISR (gestion-isr.com) Le site vitrine (SPA Vite/React) renvoie vers le portail public location.gestion-isr.com, propulsé par Supabase. On lit l'URL et la clé anonyme publiques embarquées dans le HTML du portail, puis l'API REST /rest/v1/listings?statut=eq.Actif livre tout le parc actif en JSON structuré (loyer, type, ville, GPS, photos, unités par immeuble). 2 requêtes par sync ; lien profond ?fiche=<id_app> par annonce. | |
| 10 | + | |
| 11 | +- **Site** : https://www.gestion-isr.com | |
| 12 | +- **Page des annonces** : https://location.gestion-isr.com | |
| 13 | +- **Secteurs couverts** : Drummondville, Saint-Nicéphore, Wickham, Notre-Dame-du-Bon-Conseil | |
| 14 | +- **Module** : `louka/connectors/gestion_isr.py` — classe `GestionIsrConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://location.gestion-isr.com/ | |
| 20 | +- **URLs de départ (constantes du module)** : https://location.gestion-isr.com/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 20 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Maison · Rue José Wickham | | |
| 33 | +| `address` | Adresse civique | 100 % | 807 RUE JOSÉ WICKHAM QC J0C 1S0 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Wickham | | |
| 35 | +| `sector` | Secteur / quartier | 55 % | Wickham | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Maison | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 695 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 4 | | |
| 39 | +| `bathrooms` | Salles de bain | 95 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.754425074743025 | | |
| 43 | +| `description` | Description | 100 % | Disponible dès maintenant Prix : 1695 $ 📍 Rue José, Wickham — Disponible dès maintenant 🏢… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 16 photo(s) — https://jfgkriojazaohgjezijj.supabase.co/storage/v1/object/public/listing-p… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"pets": "conditions", "smoking": false, "parking": {"available": true}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://location.gestion-isr.com/?fiche=az201 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 20 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 22 au total, **20 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestion_isr` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_isr' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_jdm.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# JDM Gestion immobilière — connecteur `gestion_jdm` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur JDM Gestion immobilière (gestionjdm.ca — Rivière-du-Loup, Témiscouata-sur-le-Lac, Cacouna ; Bas-Saint-Laurent). WordPress + Elementor (widget UAEL Posts) rendu serveur : - page /logement/ : cartes `.uael-post-wrapper.logement` — badge d'étiquette (« Disponible »), adresse complète en extrait (« 36 rue plourde, Rivière-du-Loup (QC) G5R 1A1 »), photo, lien fiche ; - fiche (/logement-1/…) : sections h4 « Description » (text-editor), « Caractéristiques » et « À proximité » (icon-list), galerie. Granularité IMMEUBLE (« 24 unités de logements sur 3 étages ») — précédent girs/immeubles_guillot : aucun prix ni liste d'unités publiés -> price=None, rien d'inventé. Les cartes étiquetées « loué / indisponible » (si elles apparaissent un jour) sont écartées ; le badge brut alimente availability. Le type n'est retenu que si UN seul est cité (« 3-1/2, 4-1/2 et 5-1/2 » -> vide, la description fait foi). Les pages /chambre/ (maisons de chambres) et /commercial/ ne sont pas visitées. external_id stable : slug de la fiche (logement-1). robots.txt ouvert (Disallow vide), sitemap Yoast public. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionjdm.ca | |
| 12 | +- **Page des annonces** : https://gestionjdm.ca/logement/ | |
| 13 | +- **Secteurs couverts** : Rivière-du-Loup (36 rue Plourde, 24 unités) + Témiscouata-sur-le-Lac (52 rue de l'Anse, 15 unités) — chambres et locaux commerciaux exclus | |
| 14 | +- **Module** : `louka/connectors/gestion_jdm.py` — classe `GestionJdmConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://gestionjdm.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionjdm.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 52 rue de l’Anse, Témiscouata-sur-le-Lac (QC) G0L 1E0 | | |
| 33 | +| `address` | Adresse civique | 100 % | 52 rue de l’Anse, Témiscouata-sur-le-Lac (QC) G0L 1E0 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Témiscouata-sur-le-Lac | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 50 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 50 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 47.6760919 | | |
| 43 | +| `description` | Description | 100 % | 15 unités de logements sur 3 étages Logements de 5-1/2 + pièces Situé dans un secteur en … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://gestionjdm.ca/wp-content/uploads/2022/05/Logement-jdm2.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 50 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 50 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionjdm.ca/logement-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — annonces à granularité immeuble (badge « Disponible », description, caractéristiques, photos) ; prix jamais publiés | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync gestion_jdm` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_jdm' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_laprise.md
+80 −0
@@ -0,0 +1,80 @@ | ||
| 1 | +# Gestion Laprise — connecteur `gestion_laprise` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Côte-Nord · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Laprise (gestionlaprise.com/immobilier — Baie-Comeau et Haute-Côte-Nord, ~70 appartements, location 31 jours et plus). WordPress + thème Inspiry Real Places (plugin inspiry-real-estate), tout rendu serveur. Archive /logement-statut/a-louer/ (paginée) : cartes `article.property-listing-simple` — titre, adresse complète, prix (« $850 Par mois »), meta Bedrooms/ Bathrooms/Type (1½–6½)/Status. Fiche /propriete/<immeuble>/<unité>/ (via cache BD) : description, caractéristiques, GPS (propertyMapData) et galerie pleine taille (envira-gallery) — le carrousel « propriétés similaires » (owl-carousel) est ignoré. Unités hôtelières (statut « Hôtel ») et locaux commerciaux exclus. Pas de robots.txt (= tout permis). | |
| 10 | + | |
| 11 | +- **Site** : https://gestionlaprise.com/immobilier/ | |
| 12 | +- **Page des annonces** : https://gestionlaprise.com/immobilier/logement-statut/a-louer/ | |
| 13 | +- **Secteurs couverts** : Baie-Comeau, Forestville (Haute-Côte-Nord) — location 31 jours et plus ; unités hôtelières (nuitée) et locaux commerciaux exclus | |
| 14 | +- **Module** : `louka/connectors/gestion_laprise.py` — classe `GestionLapriseConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionlaprise.com/immobilier | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionlaprise.com/immobilier | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 112 Legardeur #9 | | |
| 33 | +| `address` | Adresse civique | 100 % | 112 Avenue le Gardeur, Baie-Comeau, QC G4Z 1H8, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Baie-Comeau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 50 % | 850 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 49.2375647 | | |
| 43 | +| `description` | Description | 50 % | À Baie-Comeau, secteur tranquille, face à l’école primaire. Immeuble avec entrée sécurisé… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://gestionlaprise.com/immobilier/wp-content/uploads/2019/03/IMG_2759-sc… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["2 chambre(s)", "1 salle(s) de bain", "Balcon privé", "Eau chaude", "Entrée laveuse / sé… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "appliances": {"washer_dryer_hookup… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionlaprise.com/immobilier/propriete/112-legardeur/112-legardeur-9/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `MAX_PAGES` = 8 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 60 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 61 | +- **Complétude clé (actives)** : GPS 100 % · prix 50 % · photos 100 % · description 50 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 67 | + | |
| 68 | +Rejouer la source seule : `python3 run.py sync gestion_laprise` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_laprise' ORDER BY ts DESC LIMIT 5;`). | |
| 69 | + | |
| 70 | +## Licence, attribution & conditions | |
| 71 | + | |
| 72 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 73 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 74 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 75 | +- Retrait sur demande : contact@spboucher.ai. | |
| 76 | + | |
| 77 | +## Historique | |
| 78 | + | |
| 79 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 80 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_legrand.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Le Grand — connecteur `gestion_legrand` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 5/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Le Grand (gestionlegrand.ca) WordPress + Elementor. Les logements sont des articles de la catégorie « Location » (id 28) : l'API wp-json livre id, lien, titre et contenu complet en 1 requête ; la page /a-louer/ (2e requête) fournit les vignettes (certains médias sont bloqués côté REST). Prix (« Prix : 1 200 $ / mois »), dispo et adresse lus dans le contenu de l'article. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionlegrand.ca | |
| 12 | +- **Page des annonces** : https://gestionlegrand.ca/a-louer/ | |
| 13 | +- **Secteurs couverts** : Drummondville, Saint-Nicéphore | |
| 14 | +- **Module** : `louka/connectors/gestion_legrand.py` — classe `GestionLegrandConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://gestionlegrand.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionlegrand.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3 ½ – Place des Bâtisseurs, Drummondville | | |
| 33 | +| `address` | Adresse civique | 40 % | 140, rue Raymond | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Drummondville | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Nicéphore | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 200 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 40 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 40 % | 45.8372929 | | |
| 43 | +| `description` | Description | 100 % | L’immeuble dispose d’un ascenseur. Appartement à louer Drummondville Disponible maintenan… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://gestionlegrand.ca/wp-content/uploads/ChatGPT-Image-12-juin-2026-12-h… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true}, "appliances": {"washer_dryer": true}, "ac": true, "ele… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionlegrand.ca/3-%c2%bd-place-des-batisseurs/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 5 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **5 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 40 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestion_legrand` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_legrand' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_montreal.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Montréal — connecteur `gestion_montreal` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 22/24 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Montréal (gestion-montreal.com — Montréal, Longueuil, Repentigny, La Prairie). Site immosquare rendu serveur : la page /fr/inscriptions embarque un GeoJSON complet (window.properties_geojson) avec prix, adresse, photos, description, chambres/salles de bain et coordonnées. Les pages détail /fr/inscriptions/<slug> ajoutent les sections structurées « Équipements / Caractéristiques / Services / Animaux » (via self.detail, mises en cache). | |
| 10 | + | |
| 11 | +- **Site** : https://gestion-montreal.com | |
| 12 | +- **Page des annonces** : https://gestion-montreal.com/fr/inscriptions | |
| 13 | +- **Secteurs couverts** : Montréal, Repentigny, La Prairie | |
| 14 | +- **Module** : `louka/connectors/gestion_montreal.py` — classe `GestionMontrealConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestion-montreal.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestion-montreal.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 22 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Studio semi-meublé à louer – Centre-ville de Montréal | | |
| 33 | +| `address` | Adresse civique | 100 % | 1024 Rue Sherbrooke Est, Montréal | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 73 % | Centre-ville | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 950 $ | | |
| 38 | +| `bedrooms` | Chambres | 91 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 14 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 9 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 82 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.521 | | |
| 43 | +| `description` | Description | 100 % | À propos de l’appartement : Studio semi-meublé Prix : 950 $/mois Hydro-Québec et Wi-Fi in… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://static.immosquare.com/shareimmo/production/property_asset/asset/9e70… | | |
| 45 | +| `amenities` | Commodités (JSON) | 95 % | ["Eau chaude", "Chauffage", "Électricité", "Réfrigérateur", "Micro-onde", "Non-fumeur", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestion-montreal.com/fr/inscriptions/studio-a-louer-montreal--5752184 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 22 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 24 au total, **22 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestion_montreal` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_montreal' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_tb.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion TB (portail Appartements TB) — connecteur `gestion_tb` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 31/35 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion TB (Drummondville) Portail d'annonces appartementstb.ca (aussi servi sur gestiontb.ca/logements-a-louer) : page unique Nuxt SSR (constructeur GoHighLevel). Tout le contenu est dans le payload JSON <script id="__NUXT_DATA__"> (format « devalue » : tableau plat dont les valeurs se référencent par index — patron voisin du payload flight Next.js de msi.py). L'arbre de la page contient des sections par typologie (« Section 3 1/2 »…) et une colonne (col) par logement dont le TITRE est l'adresse (« 900-3 RUE ALEXANDRE ») avec des sous-titres (secteur, ville, disponibilité, étage, prix « 900 $ / mois ») et un carrousel de photos (sliderList). Pas de robots.txt (tout permis). Une seule requête HTTP par synchronisation. | |
| 10 | + | |
| 11 | +- **Site** : https://gestiontb.ca | |
| 12 | +- **Page des annonces** : https://appartementstb.ca/ | |
| 13 | +- **Secteurs couverts** : Drummondville (St-Pierre, St-Charles, Centre-Ville, Boul. St-Joseph, Boul. Lemire, Boul. Mercure), Notre-Dame-du-Bon-Conseil, Saint-Léonard-d'Aston, Richmond | |
| 14 | +- **Module** : `louka/connectors/gestion_tb.py` — classe `GestionTBConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://appartementstb.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://appartementstb.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 31 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3 ½ St-Jean à 800$ | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Notre-Dame-du-Bon-Conseil | | |
| 35 | +| `sector` | Secteur / quartier | 94 % | St-Joseph | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 800 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | 3 ½ St-Jean à 800$ — Secteur St-Joseph — Disponible MAINTENANT !! — Chauffage et électric… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://assets.cdn.filesafe.space/9ubT2smip23BapsK3KeE/media/6a7a369d8880872… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "floor_label": "1e étage"} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://appartementstb.ca/#col-5BSbroV8HW | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 31 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 35 au total, **31 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestion_tb` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_tb' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestion_valco.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Valco — connecteur `gestion_valco` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Valco (gestionvalco.ca) WordPress Divi/Elementor, page « Logements à louer » rédigée à la main : chaque logement = une section Elementor « titre » (« 402 Laviolette Trois-Rivières 4 1/2 »), suivie d'un bloc texte (inclusions, dispo…) et de galeries d'images. 1 seule requête par sync ; external_id = data-id Elementor de la section titre (stable tant que la section vit). | |
| 10 | + | |
| 11 | +- **Site** : https://gestionvalco.ca | |
| 12 | +- **Page des annonces** : https://gestionvalco.ca/logements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Trois-Rivières, Shawinigan, Nicolet, Louiseville, Saint-Narcisse | |
| 14 | +- **Module** : `louka/connectors/gestion_valco.py` — classe `GestionValcoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionvalco.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionvalco.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 402 Laviolette Trois-Rivières 4 1/2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 402 Laviolette | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Trois-Rivières | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 50 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.3457226 | | |
| 43 | +| `description` | Description | 50 % | 2 chambres fermées + salon double Laveuse et sécheuse incluses Entrée lave vaisselle Ther… | | |
| 44 | +| `images` | Photos (JSON) | 50 % | 9 photo(s) — https://gestionvalco.ca/wp-content/uploads/2025/03/DSCF3141-scaled.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 50 % | {"inclusions": {"electricity": false}, "appliances": {"washer_dryer": true, "dishwasher_h… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionvalco.ca/elementor-344/logements-a-louer/#e1c3c46 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 50 % · description 50 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestion_valco` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestion_valco' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gestipro.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestipro — connecteur `gestipro` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 98/116 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestipro (gestipro.info) Site WordPress (thème Houzez) : liste paginée /a-louer/ avec fiches « propriete ». Une annonce par unité; pages détail pour la galerie photos. Stationnements, locaux commerciaux et rangements exclus. | |
| 10 | + | |
| 11 | +- **Site** : https://gestipro.info | |
| 12 | +- **Page des annonces** : https://gestipro.info/a-louer | |
| 13 | +- **Secteurs couverts** : Québec + Lévis | |
| 14 | +- **Module** : `louka/connectors/gestipro.py` — classe `GestiproConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestipro.info | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestipro.info | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 98 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 7170 boul. Cloutier – Le Maria-Goretti | | |
| 33 | +| `address` | Adresse civique | 100 % | 7170 Boulevard Cloutier | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Charlesbourg | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 427 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 13 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 18 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 86 % | 2027-07-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8518496 | | |
| 43 | +| `description` | Description | 100 % | Condos locatifs – LE MARIA-GORETTI (Livraison avril 2027) – Unités 5½ situées au 7170 bou… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://gestipro.info/wp-content/uploads/2026/06/Immeuble_7170-boul.-Cloutie… | | |
| 45 | +| `amenities` | Commodités (JSON) | 98 % | ["Air climatisé", "Ascenseur", "Balcon privé", "Eau chaude incluse", "Échangeur d'air", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "hot_water": false, "internet": t… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestipro.info/propriete/7170-boul-cloutier-512/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 98 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 116 au total, **98 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gestipro` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gestipro' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gia_t.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# GIA-T — Gestion Immobilière Abitibi-Témiscamingue — connecteur `gia_t` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Abitibi-Témiscamingue · Backend : direct · Annonces actives : 3/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur GIA-T — Gestion Immobilière Abitibi-Témiscamingue (gia-t.com — Rouyn-Noranda ; gère aussi pour des tiers, inventaire variable). WordPress + Elementor + WP Grid Builder, tout rendu serveur. Liste /location/ : cartes `article.wpgb-card` — prix (« 1500$ »), adresse/titre, secteur (« Vieux Noranda », « Près du Cégep et de l'Université »), catégorie (Résidentiel — le commercial est exclu), « Grandeur : 5½ », extrait et photo pleine taille (lien lightbox). Fiche détail /logements/<slug>/ (via cache BD) : description complète (inclusions/exclusions, animaux, fumeur), chambres et salles de bain (icon-box), étage (icon-list), inclusions résumées et carrousel d'images. robots.txt ouvert (Disallow: vide). | |
| 10 | + | |
| 11 | +- **Site** : https://gia-t.com | |
| 12 | +- **Page des annonces** : https://gia-t.com/location/ | |
| 13 | +- **Secteurs couverts** : Rouyn-Noranda (Vieux Noranda, centre-ville, secteur Cégep/UQAT) — locaux commerciaux exclus | |
| 14 | +- **Module** : `louka/connectors/gia_t.py` — classe `GiaTConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gia-t.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gia-t.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Résidence St-Michel | | |
| 33 | +| `address` | Adresse civique | 67 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rouyn-Noranda | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Près du centre-ville | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 100 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 67 % | — | | |
| 43 | +| `description` | Description | 100 % | Bonjour à tous, Nous avons actuellement un 2 1/2 et un 3½ à louer à la Résidence St-Miche… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://gia-t.com/wp-content/uploads/2026/08/Media-2026-04-14T120122.924.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 chambre(s)", "1 salle(s) de bain", "Inclus : Cable, Chauffage, Internet, Électricité,… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gia-t.com/logements/residence-st-michel/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 3 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 67 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 1 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-14 21:38 | HTTPSConnectionPool(host='gia-t.com', port=443): Read timed out. (read timeout=30) | | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync gia_t` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gia_t' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gimcote.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# GIM Côté — connecteur `gimcote` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 85/89 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur GIM Côté inc. (gimcote.com) WordPress + thème immobilier Houzez. Archive /property-type/appartement paginée : chaque carte contient prix, adresse, statut, type et la galerie complète d'images (attribut data-images). Les fiches détail (via cache BD) ajoutent description, caractéristiques, bloc « Détails » structuré (animaux, meublé, fumeur, stationnement) et coordonnées GPS. | |
| 10 | + | |
| 11 | +- **Site** : https://gimcote.com | |
| 12 | +- **Page des annonces** : https://gimcote.com/property-type/appartement | |
| 13 | +- **Secteurs couverts** : Ste-Foy, Limoilou/Charlesbourg, Lévis | |
| 14 | +- **Module** : `louka/connectors/gimcote.py` — classe `GimCoteConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gimcote.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gimcote.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 85 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Beau studio 1 1/2, St-Roch, WIFI Libre | | |
| 33 | +| `address` | Adresse civique | 100 % | 757, Rue de la Reine | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Roch, La Cité-Limoilou | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 1½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 615 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 1 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 2 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8171235 | | |
| 43 | +| `description` | Description | 100 % | 418-655-8281 À voir au 757 de la Reine appartement #RC2, beau studio 1 1/2 situé au rez d… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 6 photo(s) — https://gimcote.com/wp-content/uploads/2026/08/PXL_20250624_175940590.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Lit: 0", "Bain: 1", "Étage(s): 1", "Stationnement: Non", "Appartement", "Buanderie", "C… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gimcote.com/property/beau-studio-1-1-2-st-roch-wifi-libre-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 85 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 89 au total, **85 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gimcote` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gimcote' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gio.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Immobilière de l'Outaouais (GIO) — connecteur `gio` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 5/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Immobilière de l'Outaouais (gioinc.ca) Gestionnaire du Plateau à Gatineau (boul. du Plateau, av. des Oliviers…). WordPress/Elementor : la page /a-louer/ rend côté serveur une boucle Elementor (e-loop-item-<postid>, CPT « proprietes ») avec prix, ville, adresse, nombre de pièces et lien vers la fiche /proprietes/<slug>/. La fiche détail (via cache BD) ajoute : titre, mention « Toutes les charges comprises », type (Résidentiel/Commercial — le commercial est exclu), salles de bain, description bilingue et le bloc « Aperçu » structuré (stationnement, durée du bail, animaux, meublé, électroménagers, taille) ainsi que la galerie de photos quand elle existe. robots.txt : Crawl-delay 3 (respecté via request_delay) et Disallow /*? — le connecteur ne visite que des URLs sans chaîne de requête. | |
| 10 | + | |
| 11 | +- **Site** : https://gioinc.ca | |
| 12 | +- **Page des annonces** : https://gioinc.ca/a-louer/ | |
| 13 | +- **Secteurs couverts** : Gatineau (Plateau, Hull — boul. du Plateau, av. des Oliviers) | |
| 14 | +- **Module** : `louka/connectors/gio.py` — classe `GioConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gioinc.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gioinc.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 3.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 100-A des Oliviers – 2 chambres | | |
| 33 | +| `address` | Adresse civique | 100 % | 100 des Oliviers, Gatineau, QC J8Y 1P6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 650 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4481648 | | |
| 43 | +| `description` | Description | 100 % | ✨ Magnifique 4 ½ à louer – Soyez les premiers à y emménager ! ✨ À la recherche d’un appar… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://gioinc.ca/wp-content/uploads/2025/10/20250903_132711.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Toutes les charges comprises", "Services inclus : Wi-Fi et plus"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "internet": true}, "appliances": {"fridge": true, "s… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gioinc.ca/proprietes/100-a-des-oliviers-2-chambres/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 5 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 3.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **5 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gio` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gio' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 3.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/girescom.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Girescom gestion immobilière — connecteur `girescom` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 40/41 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Girescom (girescom.com) Site RentSync rendu serveur. Liste /residential : une carte par immeuble (adresse avec ville, prix « À partir de », fourchette de chambres). Page immeuble /residential/<slug> : tableau des unités disponibles (li.unit-table-desktop__units--unit, attributs column-field structurés : numéro, chambres, sdb, prix, pi², photos, plan d'étage, disponibilité), description « À propos de la propriété », commodités (immeuble + unité), téléphone de l'immeuble et galerie. Une annonce Lou-Ka = une unité. Périmètre : tout le portefeuille — Québec/Lévis, proche périphérie (Sainte-Brigitte-de-Laval, Shannon…) et Beauce (Saint-Georges, Sainte-Marie, Vallée-Jonction…) depuis l'expansion provinciale. Fiches immeuble via self.detail() (cache BD, max max_details/sync). | |
| 10 | + | |
| 11 | +- **Site** : https://www.girescom.com | |
| 12 | +- **Page des annonces** : https://www.girescom.com/residential | |
| 13 | +- **Secteurs couverts** : Québec (rue des Métis, Sainte-Foy, Limoilou, Vieux-Québec), Sainte-Brigitte-de-Laval, Shannon — Beauce exclue | |
| 14 | +- **Module** : `louka/connectors/girescom.py` — classe `GirescomConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.girescom.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.girescom.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 40 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 7615 Rue des Métis — unité 203 | | |
| 33 | +| `address` | Adresse civique | 100 % | 7615 Rue des Métis, Quebec, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 299 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 58 % | 452 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.851083 | | |
| 43 | +| `description` | Description | 100 % | Au 7615 Rue des Métis , découvrez des condos locatifs tout inclus où le style loft urbain… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://s3.amazonaws.com/lws_lift/girescom/images/gallery/1152/1776353380_Pr… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 chambre(s)", "1 salle(s) de bain", "Surveillance vidéo", "Ascenseurs", "Piscine intér… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true, "stove": true, "washer_dryer_hookup": true}, "ac": true, … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.girescom.com/residential/7615-rue-des-metis | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 40 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 41 au total, **40 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync girescom` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='girescom' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/girs.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# GIRS — Gestion Immobilière de la Rive Sud — connecteur `girs` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Chaudière-Appalaches · Backend : direct · Annonces actives : 8/8 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur GIRS — Gestion Immobilière de la Rive Sud (girs.ca). Gestionnaire de Sainte-Marie (Beauce) : immeubles locatifs neufs à Scott, Saint-Isidore et La Guadeloupe (Chaudière-Appalaches) + Carleton-sur-Mer et New Richmond (Gaspésie). Site Duda (assets irp.cdn-website.com), rendu CÔTÉ SERVEUR : - le menu « À louer » du hub /location regroupe les immeubles par ville (« Scott, Chaudières-Appalaches » -> /location/scott/rue-amanda-gustave) ; - chaque page d'immeuble est une VITRINE : nom/rue (h1), description, pictogrammes de commodités (BALCON PRIVÉ, CLIMATISATION, « CHAT ET CHIEN ACCEPTÉ (sous conditions) »…), photos — mais AUCUNE liste d'unités, AUCUN prix, AUCUNE disponibilité (location par téléphone / formulaire) -> 1 annonce « catalogue » par immeuble, prix None et availability vide (rien d'inventé) ; - le type d'unités n'est cité qu'en prose (« appartements de type 4 ½ », « 4 ½ et 5 ½ ») : unit_type n'est rempli que si UN seul type est mentionné, sinon la description fait foi. external_id stable : slug du chemin (/location/scott/rue-amanda-gustave -> scott-rue-amanda-gustave). La section « À vendre » du menu est ignorée. robots.txt : permissif (sitemap public). | |
| 10 | + | |
| 11 | +- **Site** : https://www.girs.ca | |
| 12 | +- **Page des annonces** : https://www.girs.ca/location | |
| 13 | +- **Secteurs couverts** : Scott, Saint-Isidore, La Guadeloupe (Chaudière-Appalaches) + Carleton-sur-Mer, New Richmond (Gaspésie) | |
| 14 | +- **Module** : `louka/connectors/girs.py` — classe `GirsConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.girs.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.girs.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 8 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Rue Amanda-Gustave — Scott | | |
| 33 | +| `address` | Adresse civique | 100 % | Rue Amanda-Gustave | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Scott | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 38 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 38 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.5086399 | | |
| 43 | +| `description` | Description | 100 % | Situé dans la charmante municipalité de Scott, au cœur de la région de Chaudière-Appalach… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://irp.cdn-website.com/6d6b044d/dms3rep/multi/Place+%C3%89vo+1920x1080.… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["BALCON PRIVÉ", "UNITÉ SPACIEUSE", "CLIMATISATION", "CUISINE AVEC ILOT", "ENVIRONNEMENT … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true}, "ac": true, "balcony": true, "pets": "conditions", "pa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.girs.ca/location/scott/rue-amanda-gustave | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:38 — 8 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 8 au total, **8 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — annonces « catalogue » (1 par immeuble) : la source ne publie ni prix, ni disponibilités, ni liste d'unités (location par téléphone/formulaire) | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync girs` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='girs' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/gparadis.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# GParadis — connecteur `gparadis` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 22/22 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur GParadis (gparadis.com) Secteurs : Montcalm, St-Sauveur, St-Roch, Limoilou, Vieux-Québec, Ste-Foy, Duberger, Lévis. Les pages de secteurs (WordPress) décrivent chaque immeuble (bloc wp-block-group + h5) avec adresses, disponibilités (« 4 1/2 disponible MAINTENANT »), commodités et galeries de photos. Une annonce par immeuble ayant des unités disponibles. | |
| 10 | + | |
| 11 | +- **Site** : https://gparadis.com | |
| 12 | +- **Page des annonces** : https://gparadis.com | |
| 13 | +- **Secteurs couverts** : Montcalm, St-Sauveur, St-Roch, Limoilou, Vieux-Québec, Ste-Foy, Duberger, Lévis | |
| 14 | +- **Module** : `louka/connectors/gparadis.py` — classe `GParadisConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gparadis.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gparadis.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 22 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 940 Av. Belvédère, Québec, QC | | |
| 33 | +| `address` | Adresse civique | 100 % | 940 Av. Belvédère, Québec, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Montcalm | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 5 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 82 % | 46.7974915 | | |
| 43 | +| `description` | Description | 100 % | 940 Av. Belvédère, Québec, QC 4 1/2 disponible le 1 er juillet Entrée laveuse-sécheuse Pl… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 3 photo(s) — https://i0.wp.com/gparadis.com/wp-content/uploads/2025/11/1-7.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 95 % | ["Entrée laveuse-sécheuse", "Planchers de bois franc", "Espace de rangement (« locker »)"… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false}, "appliances": {"washer_dryer_hoo… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gparadis.com/montcalm/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:39 — 22 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 22 au total, **22 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 82 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync gparadis` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='gparadis' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/groupe_dallaire.md
+88 −0
@@ -0,0 +1,88 @@ | ||
| 1 | +# Groupe Dallaire (Faubourg du Moulin) — connecteur `groupe_dallaire` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif (dégradé)** · Région : Québec · Backend : Scrapfly · Annonces actives : 255/259 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Dallaire — Faubourg du Moulin (faubourgdumoulin.ca). Complexes Alizé, Noroît (I-II), Sirocco, Sonora, Zéphyr (I-II) — rue Lionel-Audet, Québec (Beauport). La page /disponibilite charge les unités via JetEngine (admin-ajax.php) : on rejoue l'appel `get_listing` (lazy-load) puis la pagination `jet_smart_filters` pour récupérer toutes les unités disponibles (numéro, étage, prix, date de disponibilité, plan). Les fiches d'unité (via cache BD) ajoutent type d'unité, superficie nette (« Pieds carrés ») et inclusions réelles (« Incluant »). 2026-08-18 : le pare-feu du site bloque l'IP du serveur Lou-Ka (timeout TCP sur TOUT le domaine, même la page d'accueil — vérifié : OK depuis une autre IP). On tente d'abord la voie directe avec un timeout court (8 s), puis on bascule automatiquement sur Scrapfly en proxy simple (asp=False, render_js=False — 1 crédit/appel) pour rejouer les mêmes requêtes. | |
| 10 | + | |
| 11 | +- **Site** : https://faubourgdumoulin.ca | |
| 12 | +- **Page des annonces** : https://faubourgdumoulin.ca/disponibilite | |
| 13 | +- **Secteurs couverts** : Québec (Alizé I-II) | |
| 14 | +- **Module** : `louka/connectors/groupe_dallaire.py` — classe `GroupeDallaireConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://faubourgdumoulin.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://faubourgdumoulin.ca | |
| 21 | +- **Authentification** : aucune — contenu public (clé Scrapfly côté Lou-Ka) | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) ; Scrapfly (asp + render_js — contournement anti-bot) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 8 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (Scrapfly, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 255 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Faubourg du Moulin (Sonora) — Unité 101 (5½) | | |
| 33 | +| `address` | Adresse civique | 100 % | rue Lionel-Audet, Québec (Faubourg du Moulin) | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Beauport | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 475 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1098 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.867479301768 | | |
| 43 | +| `description` | Description | 100 % | Complexe Sonora \| Étage 1 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://faubourgdumoulin.ca/wp-content/uploads/2025/09/Sonora_101_5.5.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Stationnement extérieur ou intérieur", "Eau chaude", "Internet haute vitesse", "Forfait… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "appliances": {"washer_dryer_hookup… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://faubourgdumoulin.ca/unites/sonora-101/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:44 — 255 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 259 au total, **255 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 33 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-18 01:39 | HTTPSConnectionPool(host='faubourgdumoulin.ca', port=443): Max retries exceeded with url: /wp-admin/admin-ajax.php (Caused by ConnectTimeoutError(<HTTPSConnect… | | |
| 68 | +| 2026-08-18 01:30 | admin-ajax via proxy Scrapfly : HTTP 0 | | |
| 69 | +| 2026-08-17 22:21 | HTTPSConnectionPool(host='faubourgdumoulin.ca', port=443): Max retries exceeded with url: /wp-admin/admin-ajax.php (Caused by ConnectTimeoutError(<HTTPSConnect… | | |
| 70 | +| 2026-08-17 18:57 | HTTPSConnectionPool(host='faubourgdumoulin.ca', port=443): Max retries exceeded with url: /wp-admin/admin-ajax.php (Caused by ConnectTimeoutError(<HTTPSConnect… | | |
| 71 | +| 2026-08-17 15:20 | HTTPSConnectionPool(host='faubourgdumoulin.ca', port=443): Max retries exceeded with url: /wp-admin/admin-ajax.php (Caused by ConnectTimeoutError(<HTTPSConnect… | | |
| 72 | + | |
| 73 | +**Note du registre** : actif (dégradé) — le pare-feu de faubourgdumoulin.ca bloque l'IP du serveur Lou-Ka depuis ~2026-08-17 : repli automatique sur proxy Scrapfly (timeout direct 8 s) | |
| 74 | + | |
| 75 | +Rejouer la source seule : `python3 run.py sync groupe_dallaire` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='groupe_dallaire' ORDER BY ts DESC LIMIT 5;`). | |
| 76 | + | |
| 77 | +## Licence, attribution & conditions | |
| 78 | + | |
| 79 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 80 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 81 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 82 | +- Retrait sur demande : contact@spboucher.ai. | |
| 83 | + | |
| 84 | +## Historique | |
| 85 | + | |
| 86 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 87 | +- 2026-08-17 — mention au registre : « …ctif (dégradé) — le pare-feu de faubourgdumoulin.ca bloque l'IP du serveur Lou-Ka depuis ~2026-08-17 : repli automatique sur proxy Scrapfly (timeout direct 8 s)… » | |
| 88 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/groupe_jacques.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Jacques — connecteur `groupe_jacques` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 10/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Jacques (groupejacques.com) Promoteur-gestionnaire de Victoriaville. CMS custom (arborescence /fr/, blocs « grid-stack ») : les pages projet /fr/condos-locatifs/* et /fr/appartements/* exposent des cartes par type d'unité (h2 « 4½ - Disponible / Complet », superficie « 1024 à 1479 pi² », « À partir de 1522 $ /mois ») — les types « Complet » sont sautés. La page /fr/appartements/appartements-a-louer/ ajoute 4 immeubles (L'Éden, Terrasses De Coursol, De Bigarré, De la Paix) avec adresse, description et GPS (lien Google Maps). Le volet « résidences pour aînés » est EXCLU. | |
| 10 | + | |
| 11 | +- **Site** : https://www.groupejacques.com | |
| 12 | +- **Page des annonces** : https://www.groupejacques.com/fr/appartements/appartements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Victoriaville | |
| 14 | +- **Module** : `louka/connectors/groupe_jacques.py` — classe `GroupeJacquesConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.groupejacques.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.groupejacques.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 10 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | L'Éden : 155, rue St-Georges, Victoriaville | | |
| 33 | +| `address` | Adresse civique | 100 % | 155, rue St-Georges, Victoriaville | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Victoriaville | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 80 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 60 % | — | | |
| 38 | +| `bedrooms` | Chambres | 80 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 60 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 20 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.0594204 | | |
| 43 | +| `description` | Description | 100 % | Les appartements de l'Eden sont situés au centre-ville de Victoriaville près de la rue de… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://www.groupejacques.com/fichiersUploadOpt/0-0-0-0-1500-750-b877287b8a0… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 70 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.groupejacques.com/fr/appartements/appartements-a-louer/#155-rue-st-georges-vi… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:39 — 10 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **10 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 60 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync groupe_jacques` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='groupe_jacques' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/groupe_maurice.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Le Groupe Maurice — connecteur `groupe_maurice` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 203/203 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Le Groupe Maurice — 37 résidences pour aînés (RPA) au Québec (Montréal, Laval, Rive-Sud/Nord, Québec, Gatineau…). WordPress avec API REST maison : /wp-json/api/v1/residences retourne les 37 résidences géolocalisées (adresse, lat/lng, ville, url, vignette). Chaque page résidence (SSR) expose la grille des types d'unités dans des <article class="y-bordered"> : « Studio | 408 pi.ca à 628 pi.ca | À partir de 2 286 $ par mois ». Une annonce Lou-Ka par type × résidence, prix plancher « à partir de », étiquetée Résidence pour aînés. | |
| 10 | + | |
| 11 | +- **Site** : https://www.legroupemaurice.com | |
| 12 | +- **Page des annonces** : https://www.legroupemaurice.com/residences/ | |
| 13 | +- **Secteurs couverts** : 37 résidences pour aînés (RPA) — Montréal, Laval, Rive-Sud/Nord, Québec, Gatineau | |
| 14 | +- **Module** : `louka/connectors/groupe_maurice.py` — classe `GroupeMauriceConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://www.legroupemaurice.com/wp-json/api/v1/residences | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.legroupemaurice.com/wp-json/api/v1/residences | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 203 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Studio — Résidence Cornelius | | |
| 33 | +| `address` | Adresse civique | 100 % | 6235, avenue de Darlington | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 286 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 408 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5093975 | | |
| 43 | +| `description` | Description | 100 % | Vos envies prennent vie à Cornelius ! Cette magnifique résidence pour aînés, située dans … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://groupemaurice.tor1.digitaloceanspaces.com/app/uploads/2022/07/LGM_Co… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"price_from": true, "Résidence pour aînés": "oui"} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.legroupemaurice.com/residences/cornelius/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.5 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:40 — 203 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 203 au total, **203 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 5, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync groupe_maurice` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='groupe_maurice' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/groupe_robin.md
+80 −0
@@ -0,0 +1,80 @@ | ||
| 1 | +# Groupe Robin — connecteur `groupe_robin` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 72/74 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Robin (grouperobin.com) WordPress Elementor multi-lignes d'affaires. La page /appartement/ charge ses immeubles via admin-ajax.php (action get_list_immeubles_ajx, explicitement permis par robots.txt) : JSON riche par immeuble (adresse + GPS, photos, descriptions, résumé par grandeur avec loyer « à partir de », superficie, statut et dates de disponibilité). On ne garde que la catégorie 126 = appartements locatifs résidentiels ; 1 annonce = 1 immeuble × grandeur (le grain affiché par le site). ~2 requêtes/sync. | |
| 10 | + | |
| 11 | +- **Site** : https://grouperobin.com | |
| 12 | +- **Page des annonces** : https://grouperobin.com/appartement/ | |
| 13 | +- **Secteurs couverts** : Trois-Rivières (District 55), Saint-Hyacinthe | |
| 14 | +- **Module** : `louka/connectors/groupe_robin.py` — classe `GroupeRobinConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://grouperobin.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://grouperobin.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par offset | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 72 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 5 ½ — Le 2285 des Grandes-Orgues, St-Hyacinthe | | |
| 33 | +| `address` | Adresse civique | 100 % | 2285 Av. des Grandes-Orgues | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saint-Hyacinthe | | |
| 35 | +| `sector` | Secteur / quartier | 22 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 625 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 97 % | 1455 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-12-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.64212320000001 | | |
| 43 | +| `description` | Description | 96 % | Cet immeuble de style « maison de ville » saura vous charmer avec son intérieur au goût d… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://grouperobin.com/wp-content/uploads/2022/09/Des-Grandes-Orgues-2101-2… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Stationnement"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"parking": {"available": true}, "price_from": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://grouperobin.com/immeubles/2285-av-des-grandes-orgues-st-hyacinthe-quebec-1-36-228… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:40 — 72 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `PER_PAGE` = 40 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 74 au total, **72 actives** | |
| 60 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 61 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 96 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 67 | + | |
| 68 | +Rejouer la source seule : `python3 run.py sync groupe_robin` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='groupe_robin' ORDER BY ts DESC LIMIT 5;`). | |
| 69 | + | |
| 70 | +## Licence, attribution & conditions | |
| 71 | + | |
| 72 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 73 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 74 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 75 | +- Retrait sur demande : contact@spboucher.ai. | |
| 76 | + | |
| 77 | +## Historique | |
| 78 | + | |
| 79 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 80 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/groupe_theoret.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Théorêt (Gestion Immobilière) — connecteur `groupe_theoret` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 24/24 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Théorêt (locationappartement.ca) GoDaddy Website Builder. La page « Appartements à louer » expose un widget « menu » : une section par immeuble (adresse + ville) et un item par unité (type, prix/mois, disponibilité) ; le lien « Plus d'informations » porte un UUID stable (data-section-jump) qui sert d'external_id. Les pages immeuble (cache BD) ajoutent l'adresse complète et les services inclus. | |
| 10 | + | |
| 11 | +- **Site** : https://locationappartement.ca | |
| 12 | +- **Page des annonces** : https://locationappartement.ca/appartements-%C3%A0-louer | |
| 13 | +- **Secteurs couverts** : Shawinigan, Grand-Mère, Terrebonne, Charlemagne, Laval, Montréal, Sainte-Thérèse | |
| 14 | +- **Module** : `louka/connectors/groupe_theoret.py` — classe `GroupeTheoretConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://locationappartement.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://locationappartement.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 24 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3 1/2 au 5080 Pie-IX, Montréal | | |
| 33 | +| `address` | Adresse civique | 100 % | 5080 Pie-IX | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 050 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 83 % | 45.5573626 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 0 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 88 % | ["Eau chaude (Inclus)", "Chauffage (Inclus)", "Concierge (Inclus)"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 88 % | {"inclusions": {"heating": true, "hot_water": true}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://locationappartement.ca/5080-5100-pie-ix#5f15a6f5-ac50-4019-ae2a-f5a6ca5eeadf | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:40 — 24 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 24 au total, **24 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 83 % · prix 100 % · photos 0 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync groupe_theoret` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='groupe_theoret' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/habitations_jeanne.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Habitations Jeanne — connecteur `habitations_jeanne` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Côte-Nord · Backend : direct · Annonces actives : 14/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Habitations Jeanne inc. (leshabitationsjeanne.com — Baie-Comeau, Côte-Nord, 200+ appartements). Site Wix rendu serveur : la page /appartements-meubles présente des cartes d'unités réelles (adresse civique, numéro d'appartement « App. 12 », type « appartement 5 ½ », galerie de photos Wix) — location mensuelle, meublé. La page /appartements-non-meubles est une vitrine (texte + adresses du parc, aucune carte d'unité) : elle est parcourue avec le même parseur et contribuera des annonces si des cartes y apparaissent un jour. Aucun prix ni disponibilité publiés (granularité vitrine assumée, comme immeubles_guillot) ; les photos et types sont réels, unité par unité. robots.txt Wix ouvert (Disallow *?lightbox= seulement), sitemap XML. | |
| 10 | + | |
| 11 | +- **Site** : https://www.leshabitationsjeanne.com | |
| 12 | +- **Page des annonces** : https://www.leshabitationsjeanne.com/appartements-meubles | |
| 13 | +- **Secteurs couverts** : Baie-Comeau (av. Père-Arnaud, av. du Parc, av. Le Gardeur, av. Taché, av. Roberval, rue Anticosti) — unités meublées affichées sans prix (vitrine unité par unité) ; page non-meublés sans cartes | |
| 14 | +- **Module** : `louka/connectors/habitations_jeanne.py` — classe `HabitationsJeanneConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.leshabitationsjeanne.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.leshabitationsjeanne.com · https://static.wixstatic.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 14 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3, avenue du Père-Arnaud — App. 12 (5 ½ meublé) | | |
| 33 | +| `address` | Adresse civique | 100 % | 3, avenue du Père-Arnaud | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Baie-Comeau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 49.2162739 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 4 photo(s) — https://static.wixstatic.com/media/ba2cd3_8a36e5626f544094bf8cc525e9310eba~m… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"furnished": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.leshabitationsjeanne.com/appartements-meubles | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:40 — 14 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **14 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync habitations_jeanne` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='habitations_jeanne' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/habitations_sf.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Habitations SF (S&F Gestion) — connecteur `habitations_sf` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Lanaudière · Backend : direct · Annonces actives : 7/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Habitations SF (S&F Gestion) (leshabitationssf.com — Saint-Charles-Borromée/Joliette, Lanaudière). Site Wix : les annonces sont des pages dynamiques /copy-of-location/<slug> (collection Wix), rendues côté serveur — le HTML contient le titre, le statut (« Disponible »/« Loué »), chambres/sdb/pi², le prix « … $ / mois », la description riche (ligne « Adresse: … ») et la galerie wixstatic. Index = liens du répéteur de la page d'accueil ; external_id = slug ; fiches détail via cache BD (clé = hash du répéteur : tout changement d'accueil déclenche la relecture des fiches). | |
| 10 | + | |
| 11 | +- **Site** : https://www.leshabitationssf.com | |
| 12 | +- **Page des annonces** : https://www.leshabitationssf.com/ | |
| 13 | +- **Secteurs couverts** : Saint-Charles-Borromée/Joliette, Saint-Félix-de-Valois, Piedmont | |
| 14 | +- **Module** : `louka/connectors/habitations_sf.py` — classe `HabitationsSFConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.leshabitationssf.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.leshabitationssf.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 7 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3 1/2 4 1/2 5 1/2 NEUF SAINT-CHARLES-BORROMEE | | |
| 33 | +| `address` | Adresse civique | 43 % | Flavie-Poirier | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saint-Charles-Borromée | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 86 % | 1 150 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 43 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 43 % | 46.0404281 | | |
| 43 | +| `description` | Description | 86 % | 3 1/2 À PARTIR DE 1150$ 4 1/2 À PARTIR DE 1250$ 5 1/2 À PARTIR DE 1500$ Ces prix sont suj… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://static.wixstatic.com/media/0df8bb_206b69b69ffc4b23b0763a9ff69506b1~m… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1-3 chambre(s)", "1 salle(s) de bain"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 86 % | {"contact": {"phone": "450-499-7978", "email": "info@leshabitationssf.com"}, "price_from"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.leshabitationssf.com/copy-of-location/3-1%2F2-4-1%2F2-5-1%2F2-neuf-saint-char… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:40 — 7 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **7 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 43 % · prix 86 % · photos 100 % · description 86 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync habitations_sf` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='habitations_sf' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/halfred.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Halfred — connecteur `halfred` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 164/169 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Halfred (halfred.ca — Outaouais) Application React Router rendue CÔTÉ SERVEUR : /listings redirige vers /listings/list dont le HTML contient déjà toutes les cartes d'annonces (aucun JavaScript requis). Chaque carte porte, en éléments structurés : - le lien /listings/<slug>/details (ou /listings/project/<uuid>/details pour les projets locatifs) -> external_id stable ; - l'adresse civique (h1), le secteur « Gatineau (Hull) » (icône map-pin), le nombre de chambres, de salles de bain, la superficie, la date de disponibilité (icônes lucide) et le prix (« À partir de 1 650$ », ancien prix barré quand il y a une promotion). La fiche /details ajoute la description longue rédigée par l'agence, la galerie de photos, les scores de mobilité/vélo et le contact du bureau. Elle passe par self.detail(...) (cache BD) avec un plafond par sync : le robots.txt du site impose « Crawl-delay: 10 » — request_delay = 10 s. Le site est bilingue : en-tête Accept-Language fr-CA pour obtenir le français (« 2 chambres », « Disponible maintenant »). | |
| 10 | + | |
| 11 | +- **Site** : https://www.halfred.ca | |
| 12 | +- **Page des annonces** : https://www.halfred.ca/listings | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer, Plateau, Templeton, Touraine, Pointe-Gatineau, Buckingham, Masson-Angers), Chelsea, Saint-Jérôme | |
| 14 | +- **Module** : `louka/connectors/halfred.py` — classe `HalfredConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.halfred.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.halfred.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 10.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 164 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | PURE | | |
| 33 | +| `address` | Adresse civique | 93 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 56 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 525 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 99 % | 583 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 93 % | — | | |
| 43 | +| `description` | Description | 100 % | 1 - 2 chambres — 1 salle de bain — 583 - 1257 pieds carrés — PROMO · Dernières unités — P… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://www.halfred.ca/storage/v1/render/image/public/halfred/buildings/c46… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 98 % | {"price_from": true, "contact": {"email": "info@halfred.ca", "phone": "819-593-3304"}, "w… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.halfred.ca/listings/project/61746f76-2212-43c5-b807-2ba59073c831/details | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:41 — 164 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 10.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 169 au total, **164 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 93 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync halfred` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='halfred' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 10.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/hazelview.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Hazelview Properties — connecteur `hazelview` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 6/6 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Hazelview Properties (hazelviewproperties.com — ex-Timbercreek). Le site est rendu côté client via l'API RentSync/LiftSystem (lift-api.rentsync.com/v2, client_id 497, jeton public embarqué dans le JS du site). On interroge /v2/cities pour les villes QC (toutes dans le Grand Montréal : Montréal, Verdun, Côte-Saint-Luc, Pointe-Claire, Longueuil...), puis /v2/search par ville et par nombre de chambres pour obtenir les types d'unités disponibles et leur loyer. Une annonce par immeuble et par type d'unité. La page immeuble du site (via cache BD) embarque un JSON complet (attribut data-locations de la carte) : commodités, galerie photos, animaux détaillés, suites. | |
| 10 | + | |
| 11 | +- **Site** : https://www.hazelviewproperties.com | |
| 12 | +- **Page des annonces** : https://www.hazelviewproperties.com/cities/montreal | |
| 13 | +- **Secteurs couverts** : Centre-ville, Vieux-Port, Plateau | |
| 14 | +- **Module** : `louka/connectors/hazelview.py` — classe `HazelviewConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://lift-api.rentsync.com/v2 | |
| 20 | +- **URLs de départ (constantes du module)** : https://assets.rentsync.com/timbercreek_communities/images/gallery/full/ · https://lift-api.rentsync.com/v2 | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1405 Bishop — Studio | | |
| 33 | +| `address` | Adresse civique | 100 % | 1405 rue Bishop, Montréal, H4G 2E4 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 425 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 83 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4968177 | | |
| 43 | +| `description` | Description | 100 % | Located in a lively, high pedestrian area at the corner of Saint Catherine Street, in pro… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 14 photo(s) — https://assets.rentsync.com/timbercreek_communities/images/gallery/full/168… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["24/7 emergency service", "Air conditioner", "AirConditioning", "Bike Friendly", "Certif… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true, "dishwasher": true}, "elevator": true, "laundry": true, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.hazelviewproperties.com/properties/1405-bishop | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:41 — 6 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 6 au total, **6 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync hazelview` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='hazelview' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/headway.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# La Corporation Headway — connecteur `headway` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 7/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur La Corporation Headway (headwayltee.com) Site vitrine Wix (rendu serveur) sans liste d'unités individuelles : une annonce par complexe immobilier (Place Prévert à Vanier, Place Versant Nord / Place l'Heureux / Domaine Versant Nord à Ste-Foy, Complexe Renaissance à Charlesbourg, Thibault et Curé-Pelletier à Lévis). Le Domaine Anjou (Montréal) est exclu (hors Québec/Lévis). | |
| 10 | + | |
| 11 | +- **Site** : https://www.headwayltee.com | |
| 12 | +- **Page des annonces** : https://www.headwayltee.com/logements-a-louer/levis | |
| 13 | +- **Secteurs couverts** : Vanier, Ste-Foy, Charlesbourg, Lévis | |
| 14 | +- **Module** : `louka/connectors/headway.py` — classe `HeadwayConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.headwayltee.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.headwayltee.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 7 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Place Prévert | | |
| 33 | +| `address` | Adresse civique | 100 % | 249, avenue du Pont-Scott, bureau 105, Vanier (Québec) G1M 1Z2 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Vanier | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 86 % | 46.8093361 | | |
| 43 | +| `description` | Description | 100 % | Composition de l'immeuble : 1½, 2½, 3½, 4½. À moins de 5 minutes à pied : Arrêts d'autobu… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 13 photo(s) — https://static.wixstatic.com/media/ba2cd3_d93ae32018574ed3886df6992da1ede8~… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chauffé, éclairé, eau chaude fournie", "Ascenseur", "Buanderie", "Espace de rangement",… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true}, "elevator": tru… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.headwayltee.com/logements-a-louer/appartement-quebec | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:41 — 7 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **7 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 86 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync headway` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='headway' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/heafey.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Heafey (Le We 2, Le We 3, Loggia sur le Parc) — connecteur `heafey` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 246/255 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Heafey (Gatineau, secteur Hull) Le résidentiel du groupe vit sur un micro-site WordPress par projet, comme Immostar (immostar.py) : - Le We 2 et Le We 3 (lewe2.ca) -> sélecteur d'unités « Resimo » - Loggia sur le Parc (loggiasurleparc.com) -> même sélecteur Resimo La page /plans/ de chaque site intègre en iframe l'application Resimo (allinone-corsim-*.prod.resimo.io) dont la configuration publique donne l'URL d'inventaire, le jeton d'intégration et la liste des immeubles ; cet endpoint renvoie un JSON par immeuble : n° d'unité, superficie (pi²), nombre de chambres, statut (available / reserved / sold) et, avec additional_fields, le plan d'étage (pdf_url) et le lien de location. La découverte se fait à chaque sync (aucun jeton codé en dur) : 1 requête /plans/ + 1 requête app + 1 requête inventaire par site. Une annonce = une unité DISPONIBLE. ⚠ Le paramètre Resimo `showPrice` est à false sur les trois projets : AUCUN prix n'est publié par unité (les pages « unités vedettes » n'affichent des prix que par typologie type) — price reste donc None, rien n'est inventé. | |
| 10 | + | |
| 11 | +- **Site** : https://groupeheafey.com | |
| 12 | +- **Page des annonces** : https://lewe2.ca/plans/ | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull — centre-ville : rue Eddy, rue Champlain) | |
| 14 | +- **Module** : `louka/connectors/heafey.py` — classe `HeafeyConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://lewe2.ca/ | |
| 20 | +- **URLs de départ (constantes du module)** : https://lewe2.ca/ · https://loggiasurleparc.com/ · https://[a-z0-9.-]*resimo | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 246 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le We 2 — Unité 0418 | | |
| 33 | +| `address` | Adresse civique | 15 % | 45, rue Eddy, Gatineau, QC J8X 2V8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Hull | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1055 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 15 % | 45.4264562 | | |
| 43 | +| `description` | Description | 100 % | 2 chambre(s) — 1055 pi² — Le We 2 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 11 photo(s) — https://dashqblobstorage.blob.core.windows.net/dq-building-photos/heafey/fl… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["5 électroménagers", "Internet", "chauffage", "électricité", "air climatisé central", "e… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lewe2.ca/plans/#unite-0418 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:41 — 246 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 255 au total, **246 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 15 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync heafey` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='heafey' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/hestia.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Hestia Groupe immobilier — connecteur `hestia` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Hestia Groupe immobilier (gestionhestia.com) WordPress Elementor, CPT « apartments » non exposé en REST : la page /location/ liste des cartes <article class="apartment-single"> (type, secteur, prix/mois, photo, lien fiche). Les fiches détail (cache BD) ajoutent titre, adresse civique complète, description, caractéristiques (dont « Animaux interdits »), services de proximité et galerie. | |
| 10 | + | |
| 11 | +- **Site** : https://www.gestionhestia.com | |
| 12 | +- **Page des annonces** : https://www.gestionhestia.com/location/ | |
| 13 | +- **Secteurs couverts** : Trois-Rivières | |
| 14 | +- **Module** : `louka/connectors/hestia.py` — classe `HestiaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.gestionhestia.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.gestionhestia.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | BOISÉ NATURE 3R – 5 1/2 avec Garage | | |
| 33 | +| `address` | Adresse civique | 100 % | 1890 rue Flamand | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Trois-Rivières | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 700 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.3755109 | | |
| 43 | +| `description` | Description | 100 % | Le projet résidentiel Boisé Nature 3R situé près de la piste cyclable et des services off… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://www.gestionhestia.com/wp-content/uploads/2025/05/Gestion-Hestia-186… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Air climatisé mural", "Animaux interdits", "Bain", "Balcon", "Buanderie", "Construction… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "internet": true}, "appliances": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.gestionhestia.com/apartments/boise-nature-3r-5-1-2-avec-garage/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:41 — 3 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync hestia` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='hestia' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/huma.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# HUMĀ Condos locatifs — connecteur `huma` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 38/38 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur HUMĀ Condos locatifs (humalevis.com) Deux phases de 130/132 unités à Lévis (Saint-Romuald). Plans d'étages interactifs (<area data-color-scheme="disponible">) -> fiches d'unités (type, superficies, date de disponibilité, plan). Les pages de phases listent les services/inclusions ; la page contact donne l'adresse civique de chaque phase, le contact et le marqueur GPS. Aucun prix sur le site. | |
| 10 | + | |
| 11 | +- **Site** : https://humalevis.com | |
| 12 | +- **Page des annonces** : https://humalevis.com | |
| 13 | +- **Secteurs couverts** : Lévis (St-Romuald) | |
| 14 | +- **Module** : `louka/connectors/huma.py` — classe `HumaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://humalevis.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://humalevis.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 38 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | HUMĀ phase 1 — Condo locatif N°311 (3½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1221, rue de Courchevel, Lévis (Québec) G6W 0V8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Romuald | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 876 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 26 % | 46.73317544859536 | | |
| 43 | +| `description` | Description | 100 % | Étage 3 \| Modèle K \| Superficie du logement : 876 pi² \| Superficie du balcon : 65 pi² … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://humalevis.com/wp-content/uploads/2021/06/plan-type-k.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Ascenseurs", "Lave-auto", "Chute à déchet sur chaque étage", "Système de sécurité intég… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true}, "ac": true, "elevator": true, "balcony": true, "stora… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://humalevis.com/unite-phase-1/condo-n-311 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 38 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 38 au total, **38 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 26 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync huma` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='huma' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_aeb.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immeubles AEB — connecteur `immeubles_aeb` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 26/26 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immeubles AEB (immeublesaeb.com — Saguenay : Chicoutimi, Jonquière, Arvida, La Baie, Laterrière + St-Honoré ; filiale du Groupe Boudreault). Site custom statique (Bootstrap), tout rendu serveur. Liste /logements : cartes `.housing-block` (nom, type « Appartement 4 1/2 »/« Loft »/« Chambre », prix « 1380.00$ / mois », secteur, texte de disponibilité, photo de couverture en background). Fiche /logements/<slug> (via cache BD) : adresse civique (« Coût et localisation »), blocs Description structurés (étage, durée du bail, chambres, salles de bain), caractéristiques/commodités, « À proximité de » et galerie complète. robots.txt géré par Cloudflare : `User-agent: *` → Allow: / avec Content-Signal search=yes (l'usage index/agrégateur est permis ; seuls des bots d'entraînement IA nommés — ClaudeBot, GPTBot… — sont bloqués, LouKaBot n'est pas visé). La page /logement-etudiant est une vitrine sans annonces. | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesaeb.com | |
| 12 | +- **Page des annonces** : https://immeublesaeb.com/logements | |
| 13 | +- **Secteurs couverts** : Saguenay (Chicoutimi, Jonquière, Arvida, La Baie, Laterrière) + St-Honoré — lofts, chambres et 2½–6½, volet logement étudiant | |
| 14 | +- **Module** : `louka/connectors/immeubles_aeb.py` — classe `ImmeublesAEBConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesaeb.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesaeb.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 26 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Loft Sydenham | | |
| 33 | +| `address` | Adresse civique | 100 % | 680 Ch. Sydenham, Chicoutimi | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saguenay | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Chicoutimi | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 92 % | Loft | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 980 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.4215518 | | |
| 43 | +| `description` | Description | 27 % | Près de l'Université, du cegep et du CIUSS de Chicoutimi. | | |
| 44 | +| `images` | Photos (JSON) | 81 % | 2 photo(s) — https://immeublesaeb.com/uploads/me-dia-2-bbfdf151-f38c-4963-9020-720dd02805… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Étage : Sous-sol", "Durée minimale du bail : 12 Mois", "1 chambre(s)", "1 salle(s) de b… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesaeb.com/logements/loft-sydenham | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 26 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 26 au total, **26 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 81 % · description 27 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immeubles_aeb` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_aeb' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_bc.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Immeubles Beaulieu et Collin — connecteur `immeubles_bc` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 20/26 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Beaulieu et Collin (immeublesbc.com — Rimouski, 900+ appartements, plus gros gestionnaire du Bas-Saint-Laurent). WordPress + thème immobilier Houzez, tout rendu serveur. Page /appartements/ : toutes les unités actuellement disponibles (cartes Houzez : prix, adresse complète avec code postal, statut, chambres/sdb, galerie dans l'attribut data-images). Fiche détail /property/<slug>/ (via cache BD) : description, commodités et coordonnées GPS (carte Houzez). robots.txt ouvert (Disallow /wp-admin/ seulement), sitemap XML. | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesbc.com | |
| 12 | +- **Page des annonces** : https://immeublesbc.com/appartements/ | |
| 13 | +- **Secteurs couverts** : Rimouski (centre-ville : avenue de la Cathédrale, St-Jean-Baptiste, St-Laurent, Ross…) | |
| 14 | +- **Module** : `louka/connectors/immeubles_bc.py` — classe `ImmeublesBCConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://immeublesbc.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesbc.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 20 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 20 Rue St Laurent E | | |
| 33 | +| `address` | Adresse civique | 95 % | 20 Rue St Laurent E, Rimouski, QC G5L 2C4 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rimouski | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 410 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.447829977608 | | |
| 43 | +| `description` | Description | 20 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 11 photo(s) — https://immeublesbc.com/wp-content/uploads/2026/06/logement-a-louer-rimousk… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["3 chambre(s)", "2 salle(s) de bain", "Buanderie dans l'immeuble", "Cuisinière", "Déneig… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"stove": true}, "laundry": true, "parking": {"available": true, "type": "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesbc.com/property/20-rue-st-laurent-e-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 20 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 26 au total, **20 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 20 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immeubles_bc` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_bc' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_bois.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Les Immeubles Bois — connecteur `immeubles_bois` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 23/23 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Bois (immeublesbois.ca — Rimouski, Bas-Saint-Laurent ; 320+ logements, 26 immeubles, 1½–5½). WordPress + Elementor rendu serveur : la page /residentiel/ liste un loop-item par immeuble (adresse en h6 + photo aérienne + lien fiche). Les fiches d'immeuble ne publient RIEN de plus (titre + « Demander une visite » + vignettes d'AUTRES immeubles) : elles ne sont pas visitées — 1 seule requête par sync. Granularité IMMEUBLE assumée (précédent girs / immeubles_guillot) : aucun prix, aucune unité, aucune disponibilité publiés -> price=None, availability vide, rien d'inventé. Tout le parc affiché est à Rimouski (coordonnées du siège : 40 rue Saint-Germain Est). external_id stable : slug de la fiche (/157-159-rue-hudon/). robots.txt : Allow / pour les agents génériques (blocage ciblé de bots d'entraînement IA ; Content-Signal search=yes, use=reference — usage agrégateur/référence avec lien retour cohérent, précédent place_florimay). | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesbois.ca | |
| 12 | +- **Page des annonces** : https://immeublesbois.ca/residentiel/ | |
| 13 | +- **Secteurs couverts** : Rimouski (23 immeubles affichés, 320+ logements 1½–5½) — commercial exclu | |
| 14 | +- **Module** : `louka/connectors/immeubles_bois.py` — classe `ImmeublesBoisConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesbois.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesbois.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 23 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 157, rue Hudon | | |
| 33 | +| `address` | Adresse civique | 100 % | 157, rue Hudon, Rimouski | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rimouski | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 83 % | 48.4576312 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://immeublesbois.ca/wp-content/uploads/2025/04/DJI_20250604105320_0073_… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 0 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesbois.ca/157-159-rue-hudon/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 23 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 23 au total, **23 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 83 % · prix 0 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — annonces « catalogue » (1 par immeuble : adresse + photo) : la source ne publie ni prix, ni disponibilités, ni typologies (location par téléphone) | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync immeubles_bois` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_bois' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_db.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Immeubles D.B. Busque-Massé — connecteur `immeubles_db` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 13/13 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles D.B. Busque-Massé (immeublesdb.com) — 12 immeubles / ~400 apparts à Sherbrooke, 4 secteurs. Site custom PHP (« pm_editor », derrière Cloudflare — le UA de base.py passe) : 4 pages statiques /logements-a-louer/secteur-{nord,est, centre-ville,ouest}/. Chaque logement offert = une section .container avec une cellule galerie (photos /modules/upload/…) et une cellule texte (h3 = adresse civique, liste <li> = type, prix « … $ par mois », inclusions). Aucun identifiant publié : external_id = empreinte stable (secteur + adresse + ligne de type). Les logements loués sont simplement retirés de la page (aucun marqueur « complet » à filtrer). | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesdb.com | |
| 12 | +- **Page des annonces** : https://immeublesdb.com/logements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (secteurs Nord, Est, Centre-ville, Ouest) | |
| 14 | +- **Module** : `louka/connectors/immeubles_db.py` — classe `ImmeublesDbConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesdb.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesdb.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 13 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 fraichement rénové — 265, rue de Candiac, Sherbrooke | | |
| 33 | +| `address` | Adresse civique | 100 % | 265, rue de Candiac, Sherbrooke | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Nord | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 125 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 31 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4029805 | | |
| 43 | +| `description` | Description | 100 % | 4 1/2 fraichement rénové \| Libre juillet 2026 \| À partir de 1125$ par mois \| Incluant … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://immeublesdb.com/modules/upload/275-candiac-sherbrooke-immeubles-DB-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true, "internet": true}, "appliances": {"wa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesdb.com/logements-a-louer/secteur-nord/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 13 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 13 au total, **13 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immeubles_db` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_db' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_dcl.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Immeubles DCL — connecteur `immeubles_dcl` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Abitibi-Témiscamingue · Backend : direct · Annonces actives : 8/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles DCL (lesimmeublesdcl.com — Rouyn-Noranda, Val-d'Or, Malartic ; volet logements abordables). Site Laravel + **FleetCart** (catalogue e-commerce détourné en vitrine locative, Vue.js côté client) : la page /logements-a-louer est vide côté serveur, mais son API interne répond en JSON structuré — POST /logements-a-louer (X-CSRF-TOKEN lu dans `window.FleetCart`, session Laravel du GET initial) -> products.data : adresse, ville, code postal, **GPS (lat_lng)**, prix, catégorie (typologie « 1 ½ »… -> unit_type) et attributs (Ameublement -> meublé, Animaux -> pets, Pièces, Chambres, Salle de bain, Commodités, Inclusions, Secteurs, Disponibilité). Fiche /logements-a-louer/<slug> (via cache BD) : description et galerie complète (images S3 `img.popup-img`). Les logements loués vivent dans un catalogue séparé (/logements-loues) : jamais mélangés. robots.txt ouvert. | |
| 10 | + | |
| 11 | +- **Site** : https://www.lesimmeublesdcl.com | |
| 12 | +- **Page des annonces** : https://www.lesimmeublesdcl.com/logements-a-louer | |
| 13 | +- **Secteurs couverts** : Rouyn-Noranda (Monseigneur Rhéaume, Perreault Est), Val-d'Or (3e Avenue), Malartic (rue des Prospecteurs, logements abordables) — catalogue « logements loués » séparé, jamais inclus | |
| 14 | +- **Module** : `louka/connectors/immeubles_dcl.py` — classe `ImmeublesDCLConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.lesimmeublesdcl.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lesimmeublesdcl.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 8 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 911 3e Avenue (#201) Val-D'or | | |
| 33 | +| `address` | Adresse civique | 100 % | 911 3e Avenue, Val-D'or, J9P 2T1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Val-D'or | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Val-d'Or | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 1½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 900 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.1033621 | | |
| 43 | +| `description` | Description | 100 % | 1 1/2 situé au 1er étage, disponible dès maintenant. Pour planifier une visite, contactez… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 6 photo(s) — https://immeubles-dcl.s3.ca-central-1.amazonaws.com/media/MoyLohLMQ5y1HgwcCd… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 pièce(s)", "1 chambre(s)", "WiFi", "Éclairé", "Chauffé", "Frigidaire", "Cuisinière", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "internet": true}, "appliances": {"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lesimmeublesdcl.com/logements-a-louer/911-3e-avenue-201-val-dor | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 8 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **8 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immeubles_dcl` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_dcl' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_guillot.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Les Immeubles Guillot — connecteur `immeubles_guillot` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 7/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Guillot (immeublesguillot.com) — 3 immeubles / 61 unités à Québec : - Ader (Beauport, 7 unités, 7½) - Boul. Ste-Anne (Beauport, 28 unités, 1½/3½/4½) - des Cyprès (Charlesbourg, 26 unités, 3½/4½/5½) Site WordPress rendu serveur : une page par immeuble avec l'adresse, les types offerts (« Types d'appartements dans cet immeuble »), un tableau de commodités (colonnes Logement / Immeuble / Quartier) et des galeries « Appartement modèle » par type. Aucun prix ni disponibilité affichés -> price=None, availability vide (rien d'inventé). Granularité = immeuble × type d'appartement (comme utile.py). | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesguillot.com | |
| 12 | +- **Page des annonces** : https://immeublesguillot.com/appartements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Beauport, Charlesbourg | |
| 14 | +- **Module** : `louka/connectors/immeubles_guillot.py` — classe `ImmeublesGuillotConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesguillot.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesguillot.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 7 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Immeubles Guillot — Beauport / Ader (7 1/2) | | |
| 33 | +| `address` | Adresse civique | 100 % | 349 à 361 rue Ader, Québec, G1C 5N6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Beauport | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 6½+ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 4 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 57 % | 46.8819686 | | |
| 43 | +| `description` | Description | 100 % | Nichés dans un quartier résidentiel calme et verdoyant de Beauport, les appartements Ader… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://immeublesguillot.com/wp-content/uploads/2022/05/IMG_20210610_1939113… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Cour privée clôturée", "Semi-détaché sur 2 étages", "Deux stationnements", "7 unités", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"smoking": false, "parking": {"available": true}, "floor": 2} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesguillot.com/appartements-a-louer/beauport-ader/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 7 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **7 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 57 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 1 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-16 20:39 | HTTPSConnectionPool(host='immeublesguillot.com', port=443): Read timed out. (read timeout=30) | | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync immeubles_guillot` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_guillot' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_ouellet.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Les Immeubles Vianney Ouellet & Fils — connecteur `immeubles_ouellet` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 1/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Vianney Ouellet & Fils (immeublesouellet.com — Rimouski, 300+ unités, 40+ ans). Site PHP artisanal (hébergeur PQM.net). La page /location/ n'affiche RIEN en GET ; le moteur de recherche (POST quartier/grandeur/prix « tous ») renvoie la grille complète : un bloc par immeuble (adresse en h4, photo PQM, lien detail.php?id=N) avec une rangée par unité « 4 1/2 : Complet » ou « 4 1/2 : 1 x libre à partir du 2025-12-15 ». Le connecteur ne visite que les immeubles ayant au moins une rangée non « Complet » et émet une annonce par bloc d'unité libre de la fiche detail.php?id=N : prix propre au bloc (« 995$ », « --- » quand loué), description, services inclus, ameublement, date de disponibilité, galerie. Parc quasi plein en région : 0-2 annonces est un état normal. Les textes saisis en base par l'agence sont en UTF-8 doublement encodé (« Meublé ») alors que le gabarit est sain : correction chaîne par chaîne. robots.txt : 404 (= tout permis). | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesouellet.com | |
| 12 | +- **Page des annonces** : https://immeublesouellet.com/location/ | |
| 13 | +- **Secteurs couverts** : Rimouski (secteurs Cégep/Institut Maritime/Hôpital, Paul-Hubert, UQAR, résidentiel — 28 immeubles) — commercial exclu | |
| 14 | +- **Module** : `louka/connectors/immeubles_ouellet.py` — classe `ImmeublesOuelletConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesouellet.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesouellet.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 — 483, de la Cathédrale | | |
| 33 | +| `address` | Adresse civique | 100 % | 483, de la Cathédrale | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rimouski | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 995 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.4452403 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://ssl.pqm.net/gestion/files/1828490542cfd7b96a46356ee8cb2bc1/immeubles… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Stationnement déneigé", "Entrée laveuse & sécheuse"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true}, "parking": {"available": true}, "furnished"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesouellet.com/location/detail.php?id=13 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 1 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — parc quasi plein : 1 unité libre sur 81 le 2026-08-09, volume normalement faible | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync immeubles_ouellet` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_ouellet' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-09 — mention au registre : « …actif — parc quasi plein : 1 unité libre sur 81 le 2026-08-09, volume normalement faible… » | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immeubles_pm.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Immeubles PM — connecteur `immeubles_pm` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles PM (lesimmeublespm.com) Parc familial de Sherbrooke (Fleurimont, Sherbrooke Est) — 6 immeubles. Plateforme « plogg solutions » (même famille que appartementsgranby.com / godbout, resté non connectable faute d'unités libres) : la page d'accueil rend côté serveur le bloc #listing-appart — une carte .box par immeuble AVEC UNITÉS LIBRES seulement, contenant un tableau Grandeur / Loyer (« à partir de 1475$ ») / Disponible + lien « Consulter la fiche ». La recherche (form-manager.php) est fermée aux robots, mais les fiches /appartement/<slug>/ restent servies : self.detail (cache BD) y lit le tableau complet (rue, ville, quartier, superficie, étage, salles de bain, état), la description (div.extrait) et la galerie. external_id = slug de la fiche (stable, un par unité-type d'immeuble). | |
| 10 | + | |
| 11 | +- **Site** : https://www.lesimmeublespm.com | |
| 12 | +- **Page des annonces** : https://www.lesimmeublespm.com/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont – Quatre Saisons et King Est, Sherbrooke Est – Bowen Sud) | |
| 14 | +- **Module** : `louka/connectors/immeubles_pm.py` — classe `ImmeublesPMConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.lesimmeublespm.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lesimmeublespm.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 — 2035 André-Breton | | |
| 33 | +| `address` | Adresse civique | 100 % | 2035 André-Breton | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Fleurimont | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 475 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1510 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4127173 | | |
| 43 | +| `description` | Description | 100 % | À partir de 1425$ par mois Immense 1510 p2 Air climatisé, thermopompe Walk-in (dans les 2… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://www.lesimmeublespm.com/wp-content/uploads/2018/01/1-Les-immeubles-PM… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Superficie : 1510 pi²", "Étage : 2e étage", "Salle(s) de bain : 2"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "laundry": true, "storage": true, "floor": 2, "price_from": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lesimmeublespm.com/appartement/2035-andre-breton-4-demi/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immeubles_pm` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immeubles_pm' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immnasr.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Les Immeubles Michel Nazair — connecteur `immnasr` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Michel Nazair (immnasr.com) Petit gestionnaire de Gatineau (Mont-Fleuri, Val-Tétreau…). Vieux site « SiteBuilder » (Website.com) rendu serveur : la section À LOUER de l'accueil aligne, pour chaque logement, un bloc texte structuré (« Loyer: 1 325 $/mois », « Disponibilité: 1er octobre 2026 », « Nombre de chambres à coucher », « Surface », « Prises laveuse et sécheuse », « Coût approx. électricité/énergie », « Description: » bilingue) suivi d'un bloc adresse (« 183, du Mont-Fleuri, Gatineau QC »). Les carrousels de photos (CDN dotezcdn.com) précèdent les blocs : chaque galerie est rattachée à son logement par le numéro civique en tête des attributs alt (« 183_Facade… », « 31-2 Salon… », « 8_H-Dupuis… »). external_id = adresse en slug (le site n'expose aucun identifiant). | |
| 10 | + | |
| 11 | +- **Site** : https://www.immnasr.com | |
| 12 | +- **Page des annonces** : https://www.immnasr.com/ (section À LOUER en accueil) | |
| 13 | +- **Secteurs couverts** : Gatineau (Mont-Fleuri, Val-Tétreau, Côte d'Azur) | |
| 14 | +- **Module** : `louka/connectors/immnasr.py` — classe `ImmnasrConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.immnasr.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.immnasr.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 183, du Mont-Fleuri, Gatineau QC | | |
| 33 | +| `address` | Adresse civique | 100 % | 183, du Mont-Fleuri, Gatineau QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 325 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1026 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 67 % | 45.506552 | | |
| 43 | +| `description` | Description | 100 % | Près de la rue Main et Davidson. Logement de 1,026 pi. ca. situé au semi sous-sol d’un tr… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://site-nngjg8kd.dewsecdn1.dotezcdn.com/uploads/r/373-497-373-332-0-82/… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Prises laveuse et sécheuse"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true}, "parking": {"available": true}, "bedrooms":… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.immnasr.com/#183-du-mont-fleuri-gatineau-qc | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 3 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 67 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — très petit parc (3 fiches le 2026-08-09), mais fiches complètes (loyer, dispo, chambres, surface, photos) | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync immnasr` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immnasr' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-09 — mention au registre : « …actif — très petit parc (3 fiches le 2026-08-09), mais fiches complètes (loyer, dispo, chambres, surface, photos)… » | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immobilia.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immobilia Rimouski — connecteur `immobilia` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 1/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immobilia Rimouski (immobiliarimouski.com) Gestionnaire du centre-ville de Rimouski (ex-Immeubles MT, ~100 logements). Site WordPress (Bedrock) + plugin « building-stack-sync » : l'inventaire Building Stack est synchronisé dans le CPT WordPress `bss_property` et rendu côté serveur — famille Building Stack (edifia, urban_services) mais via le DOM WP plutôt que le portail hébergé. - /logements/ : une carte par unité disponible (a.bss-property-item : titre, adresse complète, type (4½/Loft…), sdb, prix, date de dispo) ; - fiche /proprietes/<slug>/ : statut (« Disponible à partir du: … »), bloc infos (prix « X$ par mois », type, sdb, pi², plan PDF), description complète, commodités (feature-list), galerie d'images, lien Google Maps (adresse seulement, pas de GPS). Une annonce Lou-Ka = une unité. Fiches via self.detail() (cache BD, invalidé quand la carte de la liste change), max max_details/sync. | |
| 10 | + | |
| 11 | +- **Site** : https://immobiliarimouski.com | |
| 12 | +- **Page des annonces** : https://immobiliarimouski.com/logements/ | |
| 13 | +- **Secteurs couverts** : Rimouski (centre-ville) | |
| 14 | +- **Module** : `louka/connectors/immobilia.py` — classe `ImmobiliaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immobiliarimouski.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immobiliarimouski.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Superbe 4½ au centre-ville | | |
| 33 | +| `address` | Adresse civique | 100 % | 173-2 - 171 Rue St André, Rimouski, QC, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rimouski | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 255 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.4462645 | | |
| 43 | +| `description` | Description | 100 % | Caractéristiques de l'espace de vie : 1 stationnement extérieur Unité situé au 2e étage U… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://immobiliarimouski.com/app/uploads/2026/07/image1785782600-772x1024.j… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 salle(s) de bain", "Balcon"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "hot_water": false}, "appliances"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immobiliarimouski.com/proprietes/superbe-4%c2%bd-au-centre-ville/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 1 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immobilia` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immobilia' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immogex.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immogex — connecteur `immogex` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immogex (immogex.com) GoDaddy Website Builder 8. La page « À louer » expose chaque logement en bloc ABOUT_* (data-aid) : HEADLINE = « Nom - prix$ », DESCRIPTION = texte brut (Disponible…, Grandeur : 3 ½, Adresse : …, caractéristiques), IMAGE (data-srclazy, img1.wsimg.com). 1 seule requête par sync ; ville fixe Drummondville (tout le parc Immogex y est — voir rapport). | |
| 10 | + | |
| 11 | +- **Site** : https://immogex.com | |
| 12 | +- **Page des annonces** : https://immogex.com/%C3%A0-louer | |
| 13 | +- **Secteurs couverts** : Drummondville | |
| 14 | +- **Module** : `louka/connectors/immogex.py` — classe `ImmogexConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immogex.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immogex.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Jardins de la Rivia I - 1355$ | | |
| 33 | +| `address` | Adresse civique | 100 % | 1900, rue Montplaisir | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Drummondville | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 355 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.888598 | | |
| 43 | +| `description` | Description | 100 % | Disponible dès le 1er septembre Grandeur : 3 ½ Adresse : 1900, rue Montplaisir Caractéris… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://img1.wsimg.com/isteam/ip/fad224da-757e-4636-b327-0a4cabc9cc8c/1-%20S… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 67 % | {"inclusions": {"hot_water": true}, "appliances": {"fridge": true, "stove": true, "washer… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immogex.com/%C3%A0-louer#jardins-de-la-rivia-i-1900 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:42 — 3 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immogex` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immogex' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immomarketing.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# IMMOMARKETING (Immoappart) — connecteur `immomarketing` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 84/90 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur IMMOMARKETING / Immoappart (immoappart.ca). Le portail couvre la région de Québec ET le Grand Montréal (île de Montréal, Laval, Longueuil/Rive-Sud) : on crawle les pages de secteurs (les plus précises d'abord pour un meilleur secteur). Une annonce par unité (fiche /appartement/<slug>/) ; les fiches passent par le cache BD self.detail() (clé = hash de la carte liste) : seules les fiches nouvelles ou modifiées sont re-téléchargées. | |
| 10 | + | |
| 11 | +- **Site** : https://immoappart.ca | |
| 12 | +- **Page des annonces** : https://immoappart.ca/appartements-a-louer | |
| 13 | +- **Secteurs couverts** : Lebourgneuf, Saint-Roch | |
| 14 | +- **Module** : `louka/connectors/immomarketing.py` — classe `ImmomarketingConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immoappart.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://immoappart.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 84 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | CITÉ M - 4½ à louer | | |
| 33 | +| `address` | Adresse civique | 99 % | 1750 Rue Claire-Bonenfant, Québec, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 74 % | Lebourgneuf | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 095 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 96 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.83891 | | |
| 43 | +| `description` | Description | 100 % | UNE VIE D’EXCEPTION À LA CITÉ M, LEBOURGNEUF 4 ½ – Confort, espace et vue piscine Promoti… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 17 photo(s) — https://immoappart.ca/wp-content/uploads/2025/06/cite-m_app800_hd-13-scaled… | | |
| 45 | +| `amenities` | Commodités (JSON) | 99 % | ["Ascenseur", "Chute à recyclage", "Chutes à déchets", "Échangeur d'air", "Espace d'entre… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"elevator": true, "pool": true, "gym": true, "pets": "non", "smoking": false, "contact":… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immoappart.ca/appartement/1750-rue-claire-bonenfant-quebec-4-1-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:43 — 83 trouvées, +0 / ~1 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 90 au total, **84 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immomarketing` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immomarketing' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/immostar.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immostar — connecteur `immostar` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 156/165 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immostar (immostar.ca / immostaralouer.ca) Le résidentiel d'Immostar vit sur un micro-site par projet : - MU (habitermu.ca) et Le Huppé (lehuppe.ca) -> JSON `var fiches` - Kwayaweh (kwayaweh.ca) -> SVG + REST do-selecteur - Le 1070 Cap-Rouge (le1070.ca) -> SVG + REST do-selecteur - Le Maguire (lemaguire.ca) -> cartes .fiche_unite - Loges Saint-Nicolas (loges.ca, Lévis) -> cartes .fiche_unite Tous les micro-sites partagent la même plateforme : les pages /aires-de-vie/ et /votre-espace/ listent les commodités du projet. Exclus : Alo Ste-Foy (livraison 2028, rien à louer), Le Florent (Trois-Rivières, hors région Québec/Lévis), immostaralouer.ca (commercial). | |
| 10 | + | |
| 11 | +- **Site** : https://immostar.ca | |
| 12 | +- **Page des annonces** : https://immostaralouer.ca | |
| 13 | +- **Secteurs couverts** : Ste-Foy/blvd Laurier, Cap-Rouge, Lévis (Loges St-Nicolas), Wendake | |
| 14 | +- **Module** : `louka/connectors/immostar.py` — classe `ImmostarConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://habitermu.ca/ | |
| 20 | +- **URLs de départ (constantes du module)** : https://habitermu.ca/ · https://habitermu.ca/plans/ · https://lehuppe.ca/ · https://lehuppe.ca/plans/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 156 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | MU — Unité 115 | | |
| 33 | +| `address` | Adresse civique | 100 % | 2605, boulevard Laurier, Québec | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Sainte-Foy | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 99 % | 1 655 $ | | |
| 38 | +| `bedrooms` | Chambres | 97 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 630 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-12-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 72 % | 46.7704016 | | |
| 43 | +| `description` | Description | 100 % | 1 chambre — 630 pi² — étage 1 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 4 photo(s) — https://habitermu.ca/wp-content/uploads/2023/11/MU-Drone-544_courNuit-scaled… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Grand gym à la fine pointe", "Piscine intérieure", "Studio de yoga ou de cour de groupe… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"elevator": true, "balcony": true, "pool": true, "gym": true, "storage": true, "parking"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://habitermu.ca/plans/#unite-115 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:43 — 156 trouvées, +0 / ~8 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 165 au total, **156 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 72 % · prix 99 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync immostar` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='immostar' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/info_logement.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Info-Logement — connecteur `info_logement` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Lanaudière · Backend : direct · Annonces actives : 50/56 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Info-Logement (info-logement.com) Gestionnaire locatif de Lanaudière (Joliette, St-Charles-Borromée, Notre-Dame-des-Prairies, Berthierville…). Site custom : la liste /logements/tous (paginée ?page=N, filtre gardé en session) expose des cartes <a class="result"> avec data-logid stable, adresse (h2), tableau Dimensions/Ville/Disponibilité, loyer et badge « En rénovation ». Les fiches détail (via cache BD) ajoutent description, commodités, proximités, adresse complète, galerie et GPS (LatLng de la carte). robots.txt : « Disallow: » vide (tout permis). | |
| 10 | + | |
| 11 | +- **Site** : https://www.info-logement.com | |
| 12 | +- **Page des annonces** : https://www.info-logement.com/logements/tous | |
| 13 | +- **Secteurs couverts** : Joliette, Saint-Charles-Borromée, Notre-Dame-des-Prairies, Berthierville | |
| 14 | +- **Module** : `louka/connectors/info_logement.py` — classe `InfoLogementConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.info-logement.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.info-logement.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 50 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1400, Line-Rainville, app. 201 | | |
| 33 | +| `address` | Adresse civique | 100 % | 1400, Line-Rainville, app. 201, Joliette QC J6E | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Joliette | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 525 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 8 % | 1250 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.0551 | | |
| 43 | +| `description` | Description | 100 % | CONSTRUCTION AVRIL 2023 Immeuble de 6 logements STYLE CONDO FAMILLIALE 5 1/2 au deuxième … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 19 photo(s) — https://www.info-logement.com/medias/2022/09/4-3-2-1-220384-1a3-high-std.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Air climatisé", "Stationnement", "Remise", "Parc ou espace vert", "Arrêt d’autobus", "C… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true, "dishwasher_hookup": true}, "ac": true, "bal… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.info-logement.com/logements/joliette/condo/5-12/1538 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:43 — 50 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 56 au total, **50 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync info_logement` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='info_logement' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/interrent.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# InterRent REIT (CLV Group) — connecteur `interrent` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 200/211 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur InterRent REIT (irent.com) Site Next.js (app router) : la page « communities/city/montreal » embarque dans son flux RSC (self.__next_f.push) le JSON complet des communautés (adresse, quartier, photos, commodités Amenities/Utilities, animaux PetFriendly*, stationnement, contact, description via référence $NN) avec leurs suites disponibles (type, chambres, sdb, pi², loyer, date). Une seule requête suffit. REIT pancanadien : filtre strict sur les villes du Grand Montréal. | |
| 10 | + | |
| 11 | +- **Site** : https://www.irent.com | |
| 12 | +- **Page des annonces** : https://www.irent.com/communities/city/montreal | |
| 13 | +- **Secteurs couverts** : Centre-ville, CDN, Côte Saint-Luc | |
| 14 | +- **Module** : `louka/connectors/interrent.py` — classe `InterrentConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.irent.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.irent.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 200 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Trent & Kingsley — 7460 Ch. Kingsley - Plan E (app. 803) | | |
| 33 | +| `address` | Adresse civique | 100 % | 5550 Trent Ave, Côte-Saint-Luc, H4W 1P3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Côte-Saint-Luc | | |
| 35 | +| `sector` | Secteur / quartier | 76 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 339 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 578 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4611828 | | |
| 43 | +| `description` | Description | 100 % | 578 pi² — 1 sdb — plan 7460 Ch. Kingsley - Plan E — Promotion : Two Months Free* — *E & O… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 14 photo(s) — https://assets.rentsync.com/interrent_reit/images/floorplans/1772095886_746… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Laundry facilities", "Freshly Painted", "Convenient Location", "Courtyard/Gardens", "Sm… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true}, "appliances": {"fridge": true}, "elevator": true, "balc… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.irent.com/communities/place-kingsley | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:43 — 200 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 211 au total, **200 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync interrent` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='interrent' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/jutras.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Habitations Jutras — connecteur `jutras` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 35/35 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Habitations Jutras (jutras.com) Promoteur-gestionnaire au Centre-du-Québec et en Estrie. WordPress + Avada (Fusion Builder) : /condos-a-louer/ liste les projets locatifs (/condo/<slug>/) ; chaque page projet expose une section « LES UNITÉS » (ancre id="prix") avec, par type d'unité (3½/4½/5½) : superficie, chambres, stationnements et « À partir de X$/mois ». Une annonce par (projet, type). Ville réelle tirée du <title> ou de la phrase « situé à/dans … » de la page projet. Le projet Prisme (page spéciale /condos-a-louer/drummondville/prisme/) est parsé par regex type+prix. Exclu : Huit Cents (immeuble 50 ans et plus). robots.txt permissif. | |
| 10 | + | |
| 11 | +- **Site** : https://jutras.com | |
| 12 | +- **Page des annonces** : https://jutras.com/condos-a-louer/ | |
| 13 | +- **Secteurs couverts** : Drummondville, Nicolet, Notre-Dame-du-Bon-Conseil, Sherbrooke, East Angus | |
| 14 | +- **Module** : `louka/connectors/jutras.py` — classe `JutrasConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://jutras.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://jutras.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 35 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | L’Atelier — 3 ½ | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Drummondville | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 54 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 91 % | 960 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 91 % | Déménagez chez vous dès juin 2026 ! · 960 pi 2 · 1 chambre · 1 ou 2 stationnements* *S el… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://jutras.com/wp-content/uploads/2025/11/LAtelier_Drummondville.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"parking": {"available": true}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://jutras.com/condo/atelier/#prix | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:44 — 35 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 35 au total, **35 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 54 % · photos 100 % · description 91 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync jutras` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='jutras' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/kangalou.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Kangalou — connecteur `kangalou` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 7916/7916 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Kangalou (kangalou.com) — portail locatif québécois géré (Solutions Kangalou, ~8 700 annonces province entière). Découverte en UNE requête : l'endpoint carte `POST /fr/recherche/ajax/search-map/` (pinsOnly=true) renvoie tous les pins JSON — id, URL de fiche, GPS, ville, type (ti/tn ; 10=Commercial et 11=Garage exclus), « n ½ » (an), prix (mc), photo et l'état loué (ir, exclu). La fiche /fr/annonce/<slug>/<id>/ (SSR, aucun anti-bot) complète : adresse civique, chambres/salles de bain, loyer, étage, superficie, disponibilité, description, inclusions/caractéristiques et galerie (slider--gallery, images glide) — via TtlDetailCache (budget/TTL). L'API de liste HTML (POST /fr/api/search) existe aussi mais pagine par 29 et masque l'état loué (CSS) : les pins sont la source fiable. | |
| 10 | + | |
| 11 | +- **Site** : https://www.kangalou.com | |
| 12 | +- **Page des annonces** : https://www.kangalou.com/fr/recherche/ | |
| 13 | +- **Secteurs couverts** : Province entière — portail locatif géré (Solutions Kangalou), ~8 500 annonces actives (pins carte, loués exclus) | |
| 14 | +- **Module** : `louka/connectors/kangalou.py` — classe `KangalouConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://www.kangalou.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.kangalou.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 7916 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4300 Rue St-Ambroise | | |
| 33 | +| `address` | Adresse civique | 5 % | 4300 Rue St-Ambroise | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 6½+ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 250 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 5 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 4 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 5 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4734 | | |
| 43 | +| `description` | Description | 3 % | Quai des Eclusiers! Très belle unité extrémement lumineuse au rez-de-chaussée avec une te… | | |
| 44 | +| `images` | Photos (JSON) | 99 % | 6 photo(s) — https://s3.amazonaws.com/shareimmo/production/property_asset/asset/4a54f592-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 5 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 5 % | {"appliances": {"stove": true, "dishwasher": true}, "balcony": true, "pool": true, "smoki… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.kangalou.com/fr/annonce/appartement-a-louer-6-1-2-le-sud-ouest-4300-rue-st-am… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : — | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:09 — 7916 trouvées, +7916 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7916 au total, **7916 actives** | |
| 59 | +- **Première ingestion** : 2026-08-18 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 99 % · description 3 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 1, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync kangalou` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='kangalou' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-18 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/kass.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# KASS Property Management — connecteur `kass` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur KASS Property Management (kassproperties.com) Gestionnaire Ottawa-Gatineau. WordPress + thème immobilier Houzez (même famille que gimcote.py) : l'archive /city/gatineau/ liste les cartes du parc québécois — prix, ville, lits/sdb/pi², galerie (data-images), étiquettes de statut. Les cartes « Rented » sont sautées, de même que le widget « propriétés similaires » d'Ottawa (cartes SANS étiquette de statut) : les villes ontariennes sont exclues du périmètre Lou-Ka. La fiche détail (cache BD) ajoute la description, le bloc « Details » structuré (Move-in Date, Pet Friendly, Smoking, superficie, type), les commodités et l'adresse civique complète. | |
| 10 | + | |
| 11 | +- **Site** : https://kassproperties.com | |
| 12 | +- **Page des annonces** : https://kassproperties.com/city/gatineau/ | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer) | |
| 14 | +- **Module** : `louka/connectors/kass.py` — classe `KassConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://kassproperties.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://kassproperties.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | FOR RENT 1 bedroom, 1 bathroom unit at Rue Saint-Onge, Gatineau, QC J8Y 5T5 | | |
| 33 | +| `address` | Adresse civique | 100 % | Rue Saint-Onge, Gatineau, QC J8Y 5T5 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 50 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 500 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 25 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1500 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4515521 | | |
| 43 | +| `description` | Description | 100 % | A newly built, large furnished basement full unit with one-bedroom, one bathroom is avail… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 4 photo(s) — https://kassproperties.com/wp-content/uploads/2024/09/a6865a63-ce4a-4636-b7b… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["AC", "Dishwasher", "Fridge / Freezer", "Furnished", "Heat Included", "Hydro Included", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "appliances": {"fridge": true, "di… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://kassproperties.com/property/for-rent-1-bedroom-1-bathroom-unit-at-rue-saint-onge-… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:44 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync kass` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='kass' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/katasa.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Katasa — connecteur `katasa` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Katasa (katasa.ca — Gatineau) Développeur-gestionnaire basé à Gatineau. WordPress « portfolio » : une page brochure par immeuble, classée par catégorie. Seules les catégories RÉSIDENTIELLES LOCATIVES sont crawleés (/portfolio_cat/apartments/ et /portfolio_cat/apartment50/ — 50+ actifs sans soins) ; les résidences de retraite (RPA), le commercial, les entrepôts et le parc de maisons mobiles (location de terrain, pas de logement) sont exclus. Donnée exploitable : le tableau « Rates » de la page (typologies en en-tête, « From $ 2,075 » en dessous) -> une annonce par typologie AVEC prix publié. Les brochures sans prix ni disponibilité (ex. Le Chambord) ne produisent aucune annonce — rien n'est inventé. | |
| 10 | + | |
| 11 | +- **Site** : https://katasa.ca | |
| 12 | +- **Page des annonces** : https://katasa.ca/portfolio_cat/apartments/ | |
| 13 | +- **Secteurs couverts** : Gatineau (Aylmer) | |
| 14 | +- **Module** : `louka/connectors/katasa.py` — classe `KatasaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://katasa.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://katasa.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le District — 1 Bedroom | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Aylmer | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 075 $ | | |
| 38 | +| `bedrooms` | Chambres | 75 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Welcome to a place where wellness, freedom, and vibrant living come together. Le District… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://katasa.ca/wp-content/uploads/2023/01/LD_IMG_1-scaled.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Cable TV, internet, and landline", "Air conditioning, heating, and electricity", "Stora… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "internet": true, "cable": true}, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://katasa.ca/portfolio/ledistrict/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:44 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync katasa` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='katasa' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/kijiji.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Kijiji Québec (location) — connecteur `kijiji` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 5276/7407 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Kijiji (kijiji.ca) — petites annonces de LOCATION UNIQUEMENT les catégories logement À LOUER, UNIQUEMENT le Québec (l9001) : c37 appartements & condos à louer · c36 chambres à louer & colocation Les pages listent 40+ annonces dans __NEXT_DATA__ (Apollo state) avec titre, prix, GPS, adresse, date de disponibilité et attributs (meublé, animaux, inclusions…) — aucune API privée nécessaire. Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://www.kijiji.ca | |
| 12 | +- **Page des annonces** : https://www.kijiji.ca/b-appartement-condo/quebec/c37l9001 | |
| 13 | +- **Secteurs couverts** : Province entière — appartements/condos (c37) + chambres & colocation (c36), particuliers et gestionnaires | |
| 14 | +- **Module** : `louka/connectors/kijiji.py` — classe `KijijiConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.kijiji.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.kijiji.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.2 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5276 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 4.5, 2,chambres,bedrooms,louer, Cartierville, metro Sauvé | | |
| 33 | +| `address` | Adresse civique | 45 % | 10150 Lajeunesse | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 97 % | 1 495 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 78 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 64 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 68 % | 2026-08-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.55274 | | |
| 43 | +| `description` | Description | 100 % | <p data-start="191" data-end="358"><strong data-start="191" data-end="260">PROMOTION 2 MO… | | |
| 44 | +| `images` | Photos (JSON) | 99 % | 9 photo(s) — https://media.kijiji.ca/api/v1/ca-prod-dealer-ads/images/c7/c77f45e6-d45a-41… | | |
| 45 | +| `amenities` | Commodités (JSON) | 73 % | ["Chauffage inclus", "Balcon", "Buanderie dans l'immeuble", "Réfrigérateur/congélateur", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 99 % | {"inclusions": {"heating": true, "hot_water": true}, "appliances": {"fridge": true, "stov… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.kijiji.ca/v-apartments-condos/ville-de-montreal/4-1-2-4-5-2-chambres-bedrooms… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:53 — 5246 trouvées, +30 / ~4 / -96 | |
| 53 | +- **Throttling** : 1.2 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7407 au total, **5276 actives** | |
| 59 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 97 % · photos 99 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync kijiji` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='kijiji' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.2 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/la_cour.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# La Cour Appartements — connecteur `la_cour` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 20/21 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur La Cour Appartements (lacourappartements.com) 155, rue du Prince-Édouard, Saint-Roch (Québec) — 159 unités sur 8 étages. Site WordPress avec le plugin « do-selecteur-plans » (même plateforme que le1070.ca / kwayaweh.ca côté Immostar, et que AULA Lévis) : - page /plans/ : polygones SVG par unité (class disponible/indisponible, data-nom = n° d'unité, data-etage, data-type, data-prix, data-promotion) - REST /wp-json/do-selecteur-plans/v1/unite?id=<data-numero> : montant, superficie habitable/terrasse, date de libération, inclusions par unité, plan (galerie PNG + PDF) La carte SVG (attributs data-*) sert de clé de cache BD (self.detail) : le REST n'est re-frappé que si l'unité a changé depuis la dernière sync. La classe est PARTAGÉE : AulaConnector (aula.py) en hérite et ne change que les constantes du projet — le parsing est identique. | |
| 10 | + | |
| 11 | +- **Site** : https://lacourappartements.com | |
| 12 | +- **Page des annonces** : https://lacourappartements.com/plans/ | |
| 13 | +- **Secteurs couverts** : Saint-Roch (Québec) | |
| 14 | +- **Module** : `louka/connectors/la_cour.py` — classe `LaCourConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://lacourappartements.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lacourappartements.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 20 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | La Cour Appartements — Unité 104 | | |
| 33 | +| `address` | Adresse civique | 100 % | 155, rue du Prince-Édouard, Québec, G1K 5V6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Roch | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 2½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 453 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 777 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2027-01-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8170743 | | |
| 43 | +| `description` | Description | 100 % | 2½ + bureau — 777 pi² — étage 1 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://lacourappartements.com/wp-content/uploads/2024/08/Plan-dunite_A2_104… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chat ou chien admis*", "Accès aux aires communes", "Eau chaude", "Électricité", "Air cl… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "hot_water": true}, "appliances": {"washer_dryer_hoo… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lacourappartements.com/plans/#unite-104 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:15 — 20 trouvées, +0 / ~20 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 21 au total, **20 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync la_cour` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='la_cour' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/laberge.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Laberge — connecteur `laberge` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 55/58 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion immobilière Laberge (laberge.qc.ca) Site rendu serveur. La page /recherche liste tous les complexes avec, pour chacun, un tableau des types d'unités ; les lignes cliquables (data-href="/complexe/{slug}/appartement/{code}") sont les unités disponibles. Une annonce par unité disponible ; la fiche unité fournit les photos, le secteur, la superficie, la description et les inclusions. Région retenue : Québec / Lévis / L'Ancienne-Lorette (les complexes de la région de Montréal — Côte St-Luc, LaSalle, Pierrefonds, etc. — sont exclus). Les fiches unités sont visitées via self.detail() (cache BD, max max_details nouveaux fetchs par synchronisation). | |
| 10 | + | |
| 11 | +- **Site** : https://www.laberge.qc.ca | |
| 12 | +- **Page des annonces** : https://www.laberge.qc.ca/recherche | |
| 13 | +- **Secteurs couverts** : Ste-Foy, Beauport, Vanier, L'Ancienne-Lorette, Limoilou | |
| 14 | +- **Module** : `louka/connectors/laberge.py` — classe `LabergeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.laberge.qc.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.laberge.qc.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 55 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le 224 — 3½ (#1-0614) | | |
| 33 | +| `address` | Adresse civique | 100 % | 224 rue seigneuriale, Québec, G1E 0M8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Beauport | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 490 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 7 % | 742 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 93 % | 46.8725363 | | |
| 43 | +| `description` | Description | 100 % | Le 224 est un immeuble de 90 appartements modernes et raffinés et réponds aux besoins des… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 17 photo(s) — https://www.laberge.qc.ca/image/8218/950/le-224--1-0614-1.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Eau chaude", "Poêle et réfrigérateur", "Entrée laveuse-sécheuse", "Lave-vaisselle", "Mi… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true}, "appliances": {"fridge": true, "stove": true, "dishwa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.laberge.qc.ca/complexe/le-224/appartement/1-0614 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:53 — 55 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 58 au total, **55 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 93 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync laberge` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='laberge' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/labonte.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Labonté — connecteur `labonte` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 18/18 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Labonté (gestionlabonte.com) Gestionnaire établi de Sherbrooke (66 ans). Site Wix : la page /logements est rendue serveur — répéteur Wix dont chaque item (div id="comp-…__<guid>") porte le prix (« À partir de N $/mois »), l'adresse (h2), le nombre de pièces, le secteur, la photo et le lien vers la page dynamique /logements/<guid> (le GUID du CMS Wix = external_id stable). Les fiches détail (via self.detail, cache BD) ajoutent la description, les paires « Détails du logement » (secteur, pièces, chambres, étage) et l'adresse complète du bloc « Emplacement ». La galerie photos des fiches est chargée côté client (pro-gallery, non SSR) : seule la photo de la carte est disponible. Aucun statut « loué » affiché — la liste ne montre que l'inventaire courant. | |
| 10 | + | |
| 11 | +- **Site** : https://www.gestionlabonte.com | |
| 12 | +- **Page des annonces** : https://www.gestionlabonte.com/logements | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Centre-ville, Est, Ouest) | |
| 14 | +- **Module** : `louka/connectors/labonte.py` — classe `LabonteConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.gestionlabonte.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.gestionlabonte.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 18 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 40 rue St-François | | |
| 33 | +| `address` | Adresse civique | 100 % | 40 Rue Saint-François N, Sherbrooke | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Centre-ville | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 94 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 150 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4728655 | | |
| 43 | +| `description` | Description | 100 % | 3½ – 1150$/mois 🏙️ Grand 3½ à louer – Centre-ville de Sherbrooke \| 1150$/mois À la reche… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://static.wixstatic.com/media/394d67_575dbf1a8b0043208a1d988c9d471734~m… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true}, "price_from": true, "bedrooms": 1, "floor":… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.gestionlabonte.com/logements/1e2deab9-375e-49d2-adae-cce59e7e8eeb | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:53 — 18 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 18 au total, **18 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync labonte` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='labonte' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lachance.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Entreprises Lachance — connecteur `lachance` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 65/86 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Entreprises Lachance (lachance.qc.ca) Constructeur-gestionnaire de l'Estrie : Sherbrooke (Fleurimont, Brompton, Rock-Forest/St-Élie, Université), Magog, Orford, East Angus, Waterville. Craft CMS (SEOmatic) : découverte par le sitemap sectionnel dédié `forRentBuildingEntry` (une page par immeuble), chaque page immeuble liste TOUTES ses unités en cartes `a.card-for-rent` : prix (avec promo barrée), date de disponibilité (`.available-notice` — « Loué » quand non offert), adresse, étage, superficie/chambres/sdb (icônes), type (h3.size-title). Fiches unité visitées via self.detail() (cache BD, plafond max_details) : description riche + galerie complète (img.img-swiper). | |
| 10 | + | |
| 11 | +- **Site** : https://lachance.qc.ca | |
| 12 | +- **Page des annonces** : https://lachance.qc.ca/logements-a-louer | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont, Brompton, Rock-Forest/St-Élie, Université), Magog, Orford, East Angus, Waterville | |
| 14 | +- **Module** : `louka/connectors/lachance.py` — classe `LachanceConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://lachance.qc.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://lachance.qc.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 65 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1331, rue Quatre-Saisons, Sherbrooke (Fleurimont) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1331, rue Quatre-Saisons, Sherbrooke (Fleurimont) | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 71 % | Fleurimont | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 350 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 18 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 650 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-12-18 | | |
| 42 | +| `lat` | GPS (lat/lng) | 95 % | 45.4228717 | | |
| 43 | +| `description` | Description | 100 % | Situé dans un secteur recherché de Sherbrooke, le quartier de la rue des Quatre-Saisons o… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://images.lachance.qc.ca/a-louer/_1300x1300_fit_center-center_none/Ext… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Étage : Rez-de-jardin", "1 chambre(s)", "1 salle(s) de bain"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "contact": {"phone": "819-820-1545"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lachance.qc.ca/logements-a-louer/1331-rue-quatre-saisons-sherbrooke-fleurimont | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:54 — 65 trouvées, +0 / ~1 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 86 au total, **65 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 95 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lachance` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lachance' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lacite.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# La Cité Gatineau (Adam Real Estate) — connecteur `lacite` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 6/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur La Cité Gatineau (lacitegatineau.com) Tour de 200+ condos locatifs au 700, boulevard du Carrefour, Gatineau (Adam Real Estate). WordPress/Elementor + Toolset Views : la page /plans-des-appartements/ liste 14 TYPES d'unités (nom, chambres, superficie, plan) et chaque fiche /type-unite/<slug>/ publie les salles de bain, les superficies (unité/balcon/totale) et surtout la liste « APPARTEMENT(S) SIMILAIRE(S) » = numéros d'appartements actuellement offerts (« A – 702 ») ou « Aucun appartement disponible ». -> une annonce par APPARTEMENT LISTÉ DISPONIBLE (uid = numéro d'unité). AUCUN prix n'est publié nulle part -> price None, rien d'inventé. ⚠ robots.txt : « Crawl-delay: 10 » -> request_delay = 10 s ; une sync = 1 + 14 requêtes ≈ 2,5 min. Pas de cache détail : la disponibilité vit sur les fiches type et doit rester fraîche. | |
| 10 | + | |
| 11 | +- **Site** : https://lacitegatineau.com | |
| 12 | +- **Page des annonces** : https://lacitegatineau.com/plans-des-appartements/ | |
| 13 | +- **Secteurs couverts** : Gatineau | |
| 14 | +- **Module** : `louka/connectors/lacite.py` — classe `LaCiteConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://lacitegatineau.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lacitegatineau.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 10.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | La Cité Gatineau — A – 910 | | |
| 33 | +| `address` | Adresse civique | 100 % | 700, boulevard du Carrefour, Gatineau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 762 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Type A-Type 310·510·710·910·1110·1310·1510·1710 — balcon 222 pi² — superficie totale 984 … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://lacitegatineau.com/wp-content/uploads/2023/10/310-510-710-910-1110-1… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true, "bathrooms": 1, "floorplan_pdf": "https://lacitegatineau.com/wp-content… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lacitegatineau.com/type-unite/a-type-310-510-710-910-1110-1310-1510-1710/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:57 — 6 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 10.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **6 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 1 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-12 23:11 | HTTPSConnectionPool(host='lacitegatineau.com', port=443): Read timed out. (read timeout=30) | | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync lacite` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lacite' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 10.0 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lafrance_mathieu.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Lafrance & Mathieu — connecteur `lafrance_mathieu` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 37/40 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Lafrance & Mathieu (lafrance-mathieu.com — Québec, Lévis, Val-Bélair, Beauport, etc.) Page liste /louer-appartement-quebec (+ filtres ?boroughs=N), une annonce par immeuble. La page détail /logement/<id> expose : adresse complète avec code postal, lat/lng (script JSON building-coordinates), commodités et caractéristiques (p.attribute-description : chat accepté, balcon, entrées laveuse-sécheuse/lave-vaisselle…), unités individuelles (numéro, étage, disponibilité, prix), année de construction, téléphone de l'immeuble. Fiches visitées via self.detail() (cache BD, max max_details/sync). | |
| 10 | + | |
| 11 | +- **Site** : https://lafrance-mathieu.com | |
| 12 | +- **Page des annonces** : https://lafrance-mathieu.com/louer-appartement-quebec | |
| 13 | +- **Secteurs couverts** : Beauport, Charlesbourg, Limoilou, St-Roch, Lévis, Val-Bélair, Loretteville, L'Ancienne-Lorette, St-Augustin | |
| 14 | +- **Module** : `louka/connectors/lafrance_mathieu.py` — classe `LafranceMathieuConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://lafrance-mathieu.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lafrance-mathieu.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 37 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1573, rue Pierre-Corneille | | |
| 33 | +| `address` | Adresse civique | 100 % | 1573, rue Pierre-Corneille, Québec, Québec, G2E4W9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Neufchatel | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 250 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.820519 | | |
| 43 | +| `description` | Description | 100 % | Immeuble construit en 1978, 6 unités \| Unité 5 · 2e étage — disponibilité : Libre immédi… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 20 photo(s) — https://gilm-site-vitrine-production.s3.amazonaws.com/media/real_estate/PPD… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Équipe de maintenance 24h", "Stationnement", "Grand espace gazonné", "Eau Chaude", "Sta… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true}, "appliances": {"washer_dryer_hookup": true, "dishwash… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lafrance-mathieu.com/logement/160 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:57 — 37 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 40 au total, **37 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lafrance_mathieu` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lafrance_mathieu' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lakle.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# La Klé — connecteur `lakle` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 45/49 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur La Klé (lakle.ca) Complexe de 559 appartements locatifs (4 phases) dans la Cité Verte (Québec, secteur Saint-Sacrement). La page « disponibilité » expose : 1) le sélecteur de plans WordPress de la tour la plus récente (phase 4) : unités en <polygon class="disponible" data-numero=...> + API REST /wp-json/do-selecteur-plans/v1/unite?id=N (prix, type, superficie habitable/terrasse, étage, style, date libre, plan) ; 2) des cartes <li> « Unité B16 - Phase 3 » pour les unités disponibles des phases 2 et 3 (superficie, chambres, description, plan — sans prix). La page /contact fournit l'adresse civique et le lat/lng de chaque phase (marqueurs Google Map structurés). | |
| 10 | + | |
| 11 | +- **Site** : https://lakle.ca | |
| 12 | +- **Page des annonces** : https://lakle.ca | |
| 13 | +- **Secteurs couverts** : Québec (Cité Verte) | |
| 14 | +- **Module** : `louka/connectors/lakle.py` — classe `LaKleConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://lakle.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://lakle.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 45 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | La Klé — Unité 103 (3½) | | |
| 33 | +| `address` | Adresse civique | 100 % | Av. Ernest-Gagnon, Québec, G1S 0E4 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Cité Verte (Saint-Sacrement) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 56 % | 1 845 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 4 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 682 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.798431 | | |
| 43 | +| `description` | Description | 100 % | Étage 1 \| 1 chambre(s) \| Superficie 682 pi² \| Balcon 161 pi² \| Style Classique \| Pla… | | |
| 44 | +| `images` | Photos (JSON) | 96 % | 1 photo(s) — https://lakle.ca/wp-content/uploads/2025/02/LaKle4-D3.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Électroménagers inclus", "Électricité incluse", "Chauffage et climatisation centrale", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "appliances": {"fridge": true}, "a… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lakle.ca/phase-1-occupation-immediate/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 45 trouvées, +0 / ~25 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 49 au total, **45 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 56 % · photos 96 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lakle` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lakle' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lambert.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Société Immobilière Lambert — connecteur `lambert` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Société Immobilière Lambert (lambertimmobilier.com — Louiseville, Yamachiche, Mauricie). WordPress avec thème custom « cognitif-starter » : la page /logements-disponibles/ liste des <article class="apartment"> (type h2, prix, <address>, photo en background-image). On ne garde que la section « Nos logements à louer » (les <article> suivant le titre « Projets à venir » = terrains, exclus). Aucune page détail ; external_id = slug de l'adresse. 1 requête par sync. | |
| 10 | + | |
| 11 | +- **Site** : https://lambertimmobilier.com | |
| 12 | +- **Page des annonces** : https://lambertimmobilier.com/logements-disponibles/ | |
| 13 | +- **Secteurs couverts** : Louiseville, Yamachiche — petit parc, cartes sans dispo | |
| 14 | +- **Module** : `louka/connectors/lambert.py` — classe `LambertConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://lambertimmobilier.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lambertimmobilier.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 — 131 St-Ubald Louiseville | | |
| 33 | +| `address` | Adresse civique | 100 % | 131 St-Ubald | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Louiseville | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 50 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 50 % | 1 250 $ | | |
| 38 | +| `bedrooms` | Chambres | 50 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.2495731 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://lambertimmobilier.com/wp-content/uploads/2024/02/Photos-devant-jour-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 0 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lambertimmobilier.com/logements-disponibles/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 50 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lambert` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lambert' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/laureat_richard.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Logements Lauréat Richard — connecteur `laureat_richard` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 23/23 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Logements Lauréat Richard (laureatrichard.com — Sherbrooke, quartier Nord, 700+ appartements gérés). WordPress + thème Avada (fusion) + plugin WP-Property : page /nos-immeubles-a-logements/ -> 8 pages immeuble (Le Plateau Richard, Complexe Lunik, Carré McGregor…), chacune listant ses modèles de logements offerts (`.property_div` : titre + lien + plan). Fiches /proprietes/<slug> via self.detail() (cache BD) : bloc structuré `#wpp_property_stats` (Grandeur, Inclus dans le logement, Adresse), description et plans. LE SITE NE PUBLIE NI PRIX NI DATE DE DISPONIBILITÉ : ces champs restent vides (jamais de valeur inventée) — contact par téléphone/visite. | |
| 10 | + | |
| 11 | +- **Site** : https://laureatrichard.com | |
| 12 | +- **Page des annonces** : https://laureatrichard.com/nos-immeubles-a-logements/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (quartier Nord : rues Richard, McGregor, de Candiac, des Chênes) | |
| 14 | +- **Module** : `louka/connectors/laureat_richard.py` — classe `LaureatRichardConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://laureatrichard.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://laureatrichard.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 23 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 165 rue candiac 1 1 2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 165, rue de Candiac, Sherbrooke, QC J1L 1J6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 1½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4015066 | | |
| 43 | +| `description` | Description | 100 % | L’appartement est vaste et lumineux avec planchers de bois, de céramique et un grand balc… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://laureatrichard.com/wp-content/uploads/2016/08/Plan-165-1-1-2-App11-1… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chauffage", "Eau chaude", "Stationnement", "Ascenseur", "Ascenseurs", "Armoires de cuis… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true}, "elevator": true, "balcony": true, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://laureatrichard.com/proprietes/165-rue-candiac-1-1-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 23 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 23 au total, **23 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync laureat_richard` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='laureat_richard' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/le_baronet.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Le Baronet — connecteur `le_baronet` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Chaudière-Appalaches · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le Baronet (lebaronet.com) Angle rue Notre-Dame Sud / rue Baronet, Sainte-Marie (Beauce, Chaudière-Appalaches) — 87 condos locatifs en 2 phases (phase 1 : 64 unités sur 4 étages, 2021 ; phase 2 : 23 unités sur 4 étages, 2023). Site WordPress (Yoast) « one-pager » + pages d'étage rendues CÔTÉ SERVEUR : - phase 1 : /etage-1 … /etage-4 ; phase 2 : /phase2-etages/niveau-1 … 4 ; - chaque page contient un plan SVG dont les ancres `a.c-app` portent data-app-no (n° d'unité), data-app-disponible (« dispo » / « louee ») et un <foreignobject> avec « Grandeur : 4 1/2 » et « Tarif : 1300 $ /mois » ; seules les unités « dispo » sont retenues (légende du site : Disponible / Réservé / Loué) ; - ⚠ un popup (`div.c-popUp`) répète en fin de page une copie PÉRIMÉE du plan de l'étage 1 : on ne parse que le SVG de `main.l-etages` ; - fiche unité (/appartements/<no> ou /phase2/<no>, via cache BD) : plan/photo, « DISPONIBLE 1ER JUILLET 2026 » et description. Les numéros d'unités se répètent d'une phase à l'autre (101…, 201…) → external_id préfixé par le chemin de la fiche (appartements-106, phase2-305), stable car issu des slugs WordPress. Aucune adresse civique n'est publiée (« à l'angle de la rue Notre-Dame Sud et de la rue Baronet ») → adresse laissée vide, rien d'inventé. robots.txt : `Disallow:` (vide) → tout est permis ; sitemap Yoast public. | |
| 10 | + | |
| 11 | +- **Site** : https://lebaronet.com | |
| 12 | +- **Page des annonces** : https://lebaronet.com/etage-1/ | |
| 13 | +- **Secteurs couverts** : Sainte-Marie (angle rue Notre-Dame Sud / rue Baronet — 87 condos locatifs en 2 phases) | |
| 14 | +- **Module** : `louka/connectors/le_baronet.py` — classe `LeBaronetConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://lebaronet.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lebaronet.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Baronet — Appartement 106 | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sainte-Marie | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 335 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Phase 1 — Étage 1 Découvrez ce superbe et spacieux 4 1/2 situé au 1er étage d’un immeuble… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 11 photo(s) — https://lebaronet.com/wp-content/uploads/2020/09/@106-1-scaled.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Stationnements intérieurs et extérieurs disponibles", "Lockers intérieurs et extérieurs… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "elevator": true, "pool": true, "parking": {"available": true, "type": "inté… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lebaronet.com/appartements/106 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 3 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync le_baronet` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='le_baronet' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/le_st_georges.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Le St-Georges — connecteur `le_st_georges` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Chaudière-Appalaches · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le St-Georges (lestgeorges.ca) 11 295, 1re Avenue, Saint-Georges (Beauce, Chaudière-Appalaches) — 56 unités locatives sur 7 étages habités (3½ à 5½). Même plateforme WordPress « do-selecteur-plans » que La Cour Appartements et AULA Lévis : sélecteur SVG d'unités (polygones data-nom / data-etage / data-type / data-prix, classes disponible / indisponible « Loué ») + REST /wp-json/do-selecteur-plans/v1/unite (montant, superficies habitable et balcon, plan PDF, libellé « Libre le … »). Tout le parsing et le cache BD sont hérités de LaCourConnector ; seules changent les constantes du projet et deux particularités du thème : - le sélecteur est sur la PAGE D'ACCUEIL (PLANS_PATH vide) ; - les photos du projet sont des PNG (le motif partagé ne retient que jpg/webp) et les commodités sont des blocs `.sc_icons_item_title` -> _site_images() et _project_amenities() sont redéfinies. Les unités louées sont exclues (classe « indisponible », état REST). | |
| 10 | + | |
| 11 | +- **Site** : https://lestgeorges.ca | |
| 12 | +- **Page des annonces** : https://lestgeorges.ca | |
| 13 | +- **Secteurs couverts** : Saint-Georges (centre-ville, 1re Avenue) | |
| 14 | +- **Module** : `louka/connectors/le_st_georges.py` — classe `LeStGeorgesConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://lestgeorges.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://lestgeorges.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le St-Georges — Unité 207 | | |
| 33 | +| `address` | Adresse civique | 100 % | 11 295, 1re Avenue, Saint-Georges, QC G5Y 2C2 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saint-Georges | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Centre-ville | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 925 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1145 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.1155021 | | |
| 43 | +| `description` | Description | 100 % | 4½ — 1145 pi² — terrasse 94 pi² — étage 2 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 11 photo(s) — https://lestgeorges.ca/wp-content/uploads/2024/12/modele-7-Plan-unite-st-ge… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Bâtiment sécurisé et en béton", "2 ascenseurs", "Salon commun", "Hall d'entrée luxueux"… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true}, "elevator": true, "balcony": true, "storage": true, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lestgeorges.ca/#unite-207 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync le_st_georges` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='le_st_georges' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/leclif.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Le Clif — connecteur `leclif` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 9/9 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le Clif (leclif.ca) Projet mono-immeuble de 151 condos locatifs à Charlesbourg (Québec). Toutes les unités sont dans la page d'accueil (overlays « is-overlay-N »); les unités louées sont marquées par un script jQuery addClass('non-dispo'). La page fournit aussi la liste des avantages de l'immeuble (ul.liste-icones : inclusions, piscine, gym, politique animaux…) et le lien Google Maps (lat/lng). | |
| 10 | + | |
| 11 | +- **Site** : https://leclif.ca | |
| 12 | +- **Page des annonces** : https://leclif.ca | |
| 13 | +- **Secteurs couverts** : Charlesbourg | |
| 14 | +- **Module** : `louka/connectors/leclif.py` — classe `LeClifConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://leclif.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://leclif.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 9 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Clif — Unité 115 (5½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 19700, boul. Henri-Bourassa, Québec, G1G 0L1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Charlesbourg | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 366 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1156 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8934679 | | |
| 43 | +| `description` | Description | 100 % | Modèle C1.1 \| Superficie : 1 156 pi 2 \| Terrasse : 176 pi 2 | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://leclif.ca/wp-content/uploads/2022/10/apercu-modele-c1-1-clif-scaled.… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chiens et chats acceptés (sous conditions)", "Eau chaude fournie", "Internet inclus (à … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "ac": true, "balcony": true, "pool"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://leclif.ca/#unite-115 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 9 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 9 au total, **9 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync leclif` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='leclif' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/ledomaine.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Habitations Le Domaine — connecteur `ledomaine` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 5/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Habitations Le Domaine (ledomaine.ca — grand ensemble locatif du quartier Mercier, arrondissement Mercier–Hochelaga-Maisonneuve, Montréal). Site WordPress rendu serveur : une page par typologie (/appartement/appartement-3-et-demi/, etc.) avec prix « à partir de », description, galerie photos et plan. Une annonce par typologie. Les alias (ex. /appartement-2/) sont dédupliqués via <link rel=canonical>. | |
| 10 | + | |
| 11 | +- **Site** : https://www.ledomaine.ca | |
| 12 | +- **Page des annonces** : https://www.ledomaine.ca/ | |
| 13 | +- **Secteurs couverts** : Mercier/Hochelaga | |
| 14 | +- **Module** : `louka/connectors/ledomaine.py` — classe `LeDomaineConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.ledomaine.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.ledomaine.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement 2 et demi — Les Habitations Le Domaine | | |
| 33 | +| `address` | Adresse civique | 100 % | 2990, Avenue de Granby, Montréal | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Mercier | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 2½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 660 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5800459 | | |
| 43 | +| `description` | Description | 100 % | 2 1/2 à partir de 660 $ par mois, rien d’inclus . Entrée laveuse/sécheuse. Planchers de b… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://www.ledomaine.ca/wp-content/uploads/2016/04/12043780_101539800688716… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "hot_water": false}, "appliances"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.ledomaine.ca/appartement/appartement-2-et-demi/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 5 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **5 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync ledomaine` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='ledomaine' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lelaureat.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Résidences Le Lauréat — connecteur `lelaureat` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 5/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Résidences Le Lauréat (residences-lelaureat.com) — 107 studios étudiants tout inclus rénovés au 2145, rue Galt Ouest, Sherbrooke (bail Régie du logement, non-fumeur, occupation simple). Site WordPress WPBakery d'une seule page : la section « Dimensions des studios » publie 5 TYPES d'unités (Studio Type, Centre Arrière, Coin Est, Coin Ouest, Loft) avec dimensions et prix par variante (étage / demi-sous-sol). Granularité = type d'unité (aucune unité individuelle publiée), comme sig.py. Les inclusions communes (« Notre service tout inclus englobe ») sont reprises en commodités. 1 requête. | |
| 10 | + | |
| 11 | +- **Site** : https://www.residences-lelaureat.com | |
| 12 | +- **Page des annonces** : https://www.residences-lelaureat.com/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (quartier Université — 2145, Galt Ouest) | |
| 14 | +- **Module** : `louka/connectors/lelaureat.py` — classe `LelaureatConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.residences-lelaureat.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.residences-lelaureat.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Résidences Le Lauréat — Studio Type (étudiant tout inclus) | | |
| 33 | +| `address` | Adresse civique | 100 % | 2145 Galt Ouest, Sherbrooke, J1K 3A8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 810 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 20 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.3875496 | | |
| 43 | +| `description` | Description | 100 % | Dimensions : 12' x 20' \| $855 /$825 \| appartements à l'étage \| $810 \| appartements en… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://www.residences-lelaureat.com/wp-content/uploads/2021/03/Un-logement… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Dimensions : 12' x 20'", "Studio type", "Studio centre arrière", "Studio coin est", "St… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 20 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.residences-lelaureat.com/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 5 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **5 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lelaureat` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lelaureat' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lequerre.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Habitations L'Équerre — connecteur `lequerre` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 1/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Habitations L'Équerre (habitationslequerre.com) — OBNL d'habitation de Sherbrooke (34 immeubles abordables, logement locatif privé consultable, pas du HLM). WordPress, mais la page /immeubles/ est un gabarit maison (Tailwind) rendu serveur : une <section class="building-section"> par immeuble vedette, dont le data-category vaut « disponibles » quand l'immeuble a des unités à louer — badge « DISPONIBLE MAINTENANT - 735$ / mois », h2 (type de logements), h3 (adresse civique), paragraphe descriptif et visuel en arrière-plan. Seules les sections « disponibles » deviennent des annonces (granularité immeuble : le site ne publie pas d'unités individuelles datées). external_id = version normalisée de l'adresse (stable). | |
| 10 | + | |
| 11 | +- **Site** : https://habitationslequerre.com | |
| 12 | +- **Page des annonces** : https://habitationslequerre.com/immeubles/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (centre-ville et quartiers — 34 immeubles abordables, OBNL) | |
| 14 | +- **Module** : `louka/connectors/lequerre.py` — classe `LequerreConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://habitationslequerre.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://habitationslequerre.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Studios meublés et tout inclus | | |
| 33 | +| `address` | Adresse civique | 100 % | 14, rue Jean-Maurice | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 735 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.3977378 | | |
| 43 | +| `description` | Description | 100 % | Notre Immeuble offre 57 studios , au centre-ville de Sherbrooke. Avec un accès presque di… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://habitationslequerre.com/wp-content/uploads/2026/03/studio_espace-sca… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true, "laundry": true, "furnished": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://habitationslequerre.com/immeubles/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:58 — 1 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lequerre` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lequerre' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lespac.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# LesPAC (location) — connecteur `lespac` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 2253/2566 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +LesPAC (lespac.com) — petites annonces du Québec UNIQUEMENT l'immobilier LOCATION résidentielle : b457 logements · b458 chambres & colocation · b460 résidences pour aînés Les pages « /montreal/…_b{cat}g17567k{page}R2.jsa » embarquent `var searchResponse = {…}` côté serveur : 20-24 annonces/page + totalPages. Le site force une ville d'ancrage (g17567 = Montréal) mais le jeu de résultats couvre TOUTE la province, simplement trié par distance — vérifié : l'ancre Québec (g15398) donne le même totalPages. Adapté du connecteur « achat-vente » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://www.lespac.com | |
| 12 | +- **Page des annonces** : https://www.lespac.com/montreal/immobilier-location-logements_b457g17567k1R2.jsa | |
| 13 | +- **Secteurs couverts** : Province entière — logements (b457), chambres & colocation (b458), résidences pour aînés (b460) | |
| 14 | +- **Module** : `louka/connectors/lespac.py` — classe `LesPacConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.lespac.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lespac.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.9 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2253 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 St-Georges de Beauce, logement à louer, Disponible dès maintenant | | |
| 33 | +| `address` | Adresse civique | 84 % | 13063 24e Avenue | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saint-Georges | | |
| 35 | +| `sector` | Secteur / quartier | 34 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 97 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 87 % | 995 $ | | |
| 38 | +| `bedrooms` | Chambres | 98 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 9 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 22 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 47 % | 46.125801079 | | |
| 43 | +| `description` | Description | 99 % | Appartement agréable et lumineux Très grand logements de 1 130' carré Cage escalier intér… | | |
| 44 | +| `images` | Photos (JSON) | 93 % | 10 photo(s) — https://cdn.lespac.com/binary/basephoto/2896124268.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Adresse : 13063 24e Avenue, Saint-Georges, QC, Canada", "Type de location : Location lo… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true}, "ac": true, "balcony": true, "storage": true, "pets": "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lespac.com/autres-provinces/immobilier-location-logements/4-1-2-st-georges-de… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:44 — 2245 trouvées, +7 / ~4 / -45 | |
| 53 | +- **Throttling** : 0.9 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2566 au total, **2253 actives** | |
| 59 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 47 % · prix 87 % · photos 93 % · description 99 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 59, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lespac` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lespac' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.9 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/leviu.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Le VIU / VIU2 (Groupe Heafey) — connecteur `leviu` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le VIU / VIU2 (leviu.ca — Groupe Heafey) Tours de condos locatifs du centre-ville de Gatineau (199, rue Laurier, secteur Hull). Le site vitrine leviu.ca renvoie « Voir les condos à louer » vers le portail Proprio Expert de Magex Technologies : https://peweb.magextechnologies.com/RentalListings/Lsae1/Groupe-Heafey Page ASP.NET WebForms ENTIÈREMENT rendue serveur : une carte par unité disponible (« VIU2 Opérations Inc. — n condominiums à louer ») avec prix (« 2 045,00 $ / mois »), adresse complète, taille (« 3 ½ (6 Étages, 890,00 pi²) »), animaux, code d'unité + note, date « Disponible: … » et photo (ImageDownloadHandler). La navigation de fiche est un __doPostBack sans URL propre : l'URL d'annonce pointe sur le portail avec un fragment. external_id = adresse en slug (aucun identifiant public stable exposé). NB : distinct du connecteur heafey (We 2/We 3/Loggia via Resimo, qui ne publie pas les unités du VIU) — aucun doublon entre les deux sources. | |
| 10 | + | |
| 11 | +- **Site** : https://www.leviu.ca | |
| 12 | +- **Page des annonces** : https://peweb.magextechnologies.com/RentalListings/Lsae1/Groupe-Heafey | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, centre-ville — 199, rue Laurier) | |
| 14 | +- **Module** : `louka/connectors/leviu.py` — classe `LeViuConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.leviu.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://peweb.magextechnologies.com/RentalListings/Lsae1/Groupe-Heafey · https://peweb.magextechnologies.com · https://www.leviu.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 199 rue Laurier Unité 602 | | |
| 33 | +| `address` | Adresse civique | 100 % | 199 rue Laurier Unité 602, Gatineau | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Hull | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 045 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 890 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | B-01_Arriere centre gauche Contactez le 819-744-8482 ou info@leviu.ca pour assistance imm… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://peweb.magextechnologies.com/Handlers/ImageDownloadHandler.ashx?dID=3… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"contact": {"phone": "819-744-8482", "email": "info@leviu.ca"}, "building_floors": 6, "u… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://peweb.magextechnologies.com/RentalListings/Lsae1/Groupe-Heafey#199-rue-laurier-un… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:44 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — inventaire des unités disponibles via le portail Proprio Expert (Magex) ; distinct du connecteur heafey (Resimo, We 2/We 3/Loggia) | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync leviu` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='leviu' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/location_di.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Location DI (Groupe Sphère DI) — connecteur `location_di` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie / Lanaudière · Backend : direct · Annonces actives : 9/12 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Location DI / Groupe Sphère DI (locationdi.com) — +750 logements : Trois-Rivières, Bécancour, MRC de Joliette (Saint-Charles-Borromée, Saint-Félix-de-Valois…), Berthierville, Lachute, Montréal. Site SSR (Astro) très propre : la page /logements affiche toutes les unités disponibles sous forme de cartes avec ATTRIBUTS DE DONNÉES structurés (data-slug, data-ville, data-region, data-type, data-etage, data-prix, data-date). Chaque fiche embarque un JSON-LD schema.org « Apartment » (adresse, superficie, chambres, photos, description). Les pages régionales /logements/region/<r> sont aussi balayées (filet). robots.txt : pas de bloc User-agent générique ni de crawl-delay ; les bots IA « live fetch » sont explicitement autorisés, seuls les bots d'ENTRAÎNEMENT sont bloqués — notre usage (indexation d'annonces avec lien vers la source, UA transparent LouKaBot) est conforme. | |
| 10 | + | |
| 11 | +- **Site** : https://locationdi.com | |
| 12 | +- **Page des annonces** : https://locationdi.com/logements | |
| 13 | +- **Secteurs couverts** : Trois-Rivières, Bécancour, Berthierville, Saint-Ambroise-de-Kildare, Saint-Charles-Borromée, Saint-Félix-de-Valois, Saint-Gabriel-de-Brandon, Lachute, Montréal | |
| 14 | +- **Module** : `louka/connectors/location_di.py` — classe `LocationDIConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://locationdi.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://locationdi.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 9 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3½ — 261 Rue Beauvilliers, Saint-Gabriel-de-Brandon | | |
| 33 | +| `address` | Adresse civique | 100 % | 261 Rue Beauvilliers | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saint-Gabriel-de-Brandon | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Lanaudière | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 950 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 89 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 750 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.295955 | | |
| 43 | +| `description` | Description | 100 % | Logement 3½ situé à Saint-Gabriel-de-Brandon. 1 chambre, 1 salle de bain, 750 pi², 1er ét… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://cdn.sanity.io/images/4ae0mkdu/production/52e052a8c456e330f4d0d501051… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Insonorisation supérieure", "Thermopompe", "Échangeur d’air (VRC)", "Animaux acceptés",… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "storage": true, "pets": "oui", "parking": {"available": true, "included": t… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://locationdi.com/logements/3-261-rue-beauvilliers-003-626595 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:44 — 9 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 12 au total, **9 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync location_di` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='location_di' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/location_saguenay.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Location Saguenay — connecteur `location_saguenay` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 21/21 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Location Saguenay (locationsaguenay.com — Saguenay : Chicoutimi près de l'UQAC/Cégep et Jonquière près du Cégep ; propriétaire-gestionnaire, formule de base ou tout inclus). WordPress classique (thème Davis), tout rendu serveur : le menu « Logements disponibles » liste TOUTES les fiches, groupées par « Appartements N chambres » (les pages villes /appartement-a-louer- chicoutimi|jonquiere/ sont des vitrines SEO sans cartes). Une fiche WP par immeuble/type d'unité (granularité immeuble, précédent immeubles_guillot) : description libre et galerie photoswipe ; prix « sur demande » (aucun prix publié -> price = None) et pas de dates de disponibilité. ⚠️ robots.txt : Crawl-delay: 10 -> request_delay = 10 s et budget de fiches réduit (max_details = 12, complété au fil des syncs par le cache BD). | |
| 10 | + | |
| 11 | +- **Site** : https://locationsaguenay.com | |
| 12 | +- **Page des annonces** : https://locationsaguenay.com/appartement-a-louer-chicoutimi/ | |
| 13 | +- **Secteurs couverts** : Saguenay (Chicoutimi — UQAC/Cégep/Hôpital, Jonquière — Cégep : rues Bécard, Sydenham, des Hospitalières, d'Alma, Massenet, de la Lorraine, St-Hubert) — 1 à 6 chambres et lofts, base ou tout inclus ; prix sur demande | |
| 14 | +- **Module** : `louka/connectors/location_saguenay.py` — classe `LocationSaguenayConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://locationsaguenay.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://locationsaguenay.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 10.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 21 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Lofts neufs près de l’UQAC | | |
| 33 | +| `address` | Adresse civique | 86 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saguenay | | |
| 35 | +| `sector` | Secteur / quartier | 95 % | Chicoutimi | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Loft | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 10 % | 300 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 76 % | — | | |
| 43 | +| `description` | Description | 100 % | Immenses appartements neufs où chacun des 4 colocataires a un immense espace privé de 300… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://locationsaguenay.com/wp-content/uploads/2021/05/01-Chambre.jpeg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 chambre(s)"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"furnished": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://locationsaguenay.com/logements-disponibles-a-saguenay/457-rue-becard-lofts-neufs/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 21 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 10.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 21 au total, **21 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 76 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync location_saguenay` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='location_saguenay' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 10.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/loftsmtl.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Lofts MTL — connecteur `loftsmtl` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 9/9 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Lofts MTL (loftsmtl.com) Lofts et appartements — Mile End, Plateau, Vieux-Montréal, Ville Mont-Royal. Plateforme Rentsync/LiftSystem : l'inventaire des immeubles vient de l'API publique api.theliftsystem.com (client_id 773, jeton public embarqué dans le site), puis chaque page immeuble (rendu serveur) expose les unités disponibles (div.suite : type, prix, pi², photos, disponibilité) et la section « Amenities » (commodités de l'unité et de l'immeuble). L'API fournit aussi lat/lng, code postal, pet_friendly (booléen) et le téléphone du gestionnaire. | |
| 10 | + | |
| 11 | +- **Site** : https://www.loftsmtl.com | |
| 12 | +- **Page des annonces** : https://www.loftsmtl.com/ | |
| 13 | +- **Secteurs couverts** : Vieux-Montréal, Mile-End, NDG, VMR | |
| 14 | +- **Module** : `louka/connectors/loftsmtl.py` — classe `LoftsMtlConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://api.theliftsystem.com/v2/search?locale=en&client_id=773&auth_token=sswpREkUtyeYjeoahA2i&show_all_properties=true&limit=200 | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.loftsmtl.com · https://api.theliftsystem.com/v2/search | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 9 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Lofts du Main — unité 200 | | |
| 33 | +| `address` | Adresse civique | 100 % | 3827 Boulevard Saint-Laurent, H2W 1X9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 56 % | Plateau Mont-Royal | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 295 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 89 % | 614 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.51573399999999 | | |
| 43 | +| `description` | Description | 100 % | Situé sur le boulevard Saint-Laurent, Lofts Du Main propose une approche minimaliste de M… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://assets.rentsync.com/lofts/images/gallery/512/1692901081569_158014023… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 salle(s) de bain", "614 pi²", "Balconies", "Concrete floors", "Dishwasher available",… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true, "stove": true, "dishwasher": true, "washer_dryer": true},… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.loftsmtl.com/apartments/loft-du-main | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 9 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 9 au total, **9 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync loftsmtl` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='loftsmtl' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/logement_mauricie.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Logement Mauricie (regroupement de propriétaires) — connecteur `logement_mauricie` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 1/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Logement Mauricie (logementmauricie.com) — regroupement de propriétaires (+200 logements). Builder type WebSelf : 4 pages secteur (Trois-Rivières, Cap-de-la- Madeleine, Shawinigan, Shawinigan-Sud), chaque immeuble = un widget texte (id GUID stable) avec champs libellés « Type / Actuellement disponible / Date / Chauffé éclairé / Combien $ / Contact… ». On ne retient que les immeubles avec une disponibilité réelle (≠ Complet). | |
| 10 | + | |
| 11 | +- **Site** : http://logementmauricie.com | |
| 12 | +- **Page des annonces** : http://logementmauricie.com/trois-rivieres/ | |
| 13 | +- **Secteurs couverts** : Trois-Rivières, Cap-de-la-Madeleine, Shawinigan, Shawinigan-Sud | |
| 14 | +- **Module** : `louka/connectors/logement_mauricie.py` — classe `LogementMauricieConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : http://logementmauricie.com | |
| 20 | +- **URLs de départ (constantes du module)** : http://logementmauricie.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : multi-racines (4 pages de départ : PAGES) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 2 1/2 — 3170 rue Louis Pasteur | | |
| 33 | +| `address` | Adresse civique | 100 % | 3170 rue Louis Pasteur | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Trois-Rivières | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 2½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 695 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.3548858 | | |
| 43 | +| `description` | Description | 100 % | Rue Louis Pasteur - Trois-Rivières Type : 2 1/2 Actuellement disponible: 2 1/2 Date : Mai… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — http://logementmauricie.com/attachments/Image/Logement-exterieur_2.jpg?templ… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "internet": true}, "appliances": {"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | http://logementmauricie.com/trois-rivieres/#widget-4cf84820-8dfd-f2fc-68cf-c97b0e2b187c | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 1 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync logement_mauricie` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='logement_mauricie' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/logis_experts.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Logis-Experts — connecteur `logis_experts` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 498/517 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Logis-Experts (logis-experts.com) Gestionnaire-constructeur, centre-ville de Québec + Lévis (~190 immeubles). Site Laravel/Alpine avec API JSON propre : GET /api/search -> {"buildings": [{address{lat,lng,zipcode}, all_images, apartments: [{number, type, price, available_type}]}]} La page détail d'une unité (/immeuble/<handle>/appartement/<n>) ajoute superficie, date de disponibilité, frais d'énergie et commodités — visitée via le cache self.detail() (seulement si l'unité est nouvelle/modifiée). | |
| 10 | + | |
| 11 | +- **Site** : https://logis-experts.com | |
| 12 | +- **Page des annonces** : https://logis-experts.com/appartements | |
| 13 | +- **Secteurs couverts** : Saint-Sauveur, Saint-Roch, Limoilou, Vieux-Québec, Sainte-Foy, Lévis | |
| 14 | +- **Module** : `louka/connectors/logis_experts.py` — classe `LogisExpertsConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://logis-experts.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://logis-experts.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 498 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 508 Rue Saint-Vallier Ouest - Le Saint-Sô — app. 411 | | |
| 33 | +| `address` | Adresse civique | 100 % | 508 Rue Saint-Vallier Ouest, Québec, G1N 0C3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Sauveur | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 901 $ | | |
| 38 | +| `bedrooms` | Chambres | 99 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 98 % | 788 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8111676 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 39 % | 6 photo(s) — https://dkkmxhlt20gis.cloudfront.net/dev/uploads/logis-experts-dsc-4023-abf9… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chauffé & Éclairé", "Contrôle Accès (Puces)", "Lounge", "Terrasse", "Gym", "Garage Sout… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "internet": true}, "elevator": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://logis-experts.com/immeuble/508-rue-saint-vallier-ouest-le-saint-s/appartement/411 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 498 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 517 au total, **498 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 39 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync logis_experts` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='logis_experts' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/logisbourg.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Logisbourg — connecteur `logisbourg` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 11/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Logisbourg (logisbourg.com) Site ASP classique : tableau des disponibilités par immeuble (Le Bourgarde, Les Terrasses du Bourg, Le Bourg du Maizerets, Le Bourg du Fleuve) + fiche appartement.asp pour adresse (avec no d'unité), lat/lng (carte Google), superficie (encadré dédié), images, caractéristiques de l'appartement et de l'immeuble, services optionnels et téléphone du bureau de location. Fiches mises en cache via self.detail() : re-visitées seulement quand la ligne du tableau change. | |
| 10 | + | |
| 11 | +- **Site** : https://www.logisbourg.com | |
| 12 | +- **Page des annonces** : https://www.logisbourg.com/appartements-disponibles.asp | |
| 13 | +- **Secteurs couverts** : Charlesbourg, Lebourgneuf, Beauport, Cité-Limoilou, Ste-Foy | |
| 14 | +- **Module** : `louka/connectors/logisbourg.py` — classe `LogisbourgConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.logisbourg.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.logisbourg.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 11 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4755, 6e Avenue Ouest #15 — 4½ | | |
| 33 | +| `address` | Adresse civique | 100 % | 4755, 6e Avenue Ouest #15 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Charlesbourg / Lebourgneuf | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 240 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 940 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.840618 | | |
| 43 | +| `description` | Description | 100 % | Érigés par Logisbourg à l'angle des autoroutes Laurentienne et Félix-Leclerc, les 8 immeu… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 6 photo(s) — https://www.logisbourg.com/charlesbourg/le_bourgarde/images/charlesbourg-le_… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Eau chaude incluse", "Étage : 3e étage", "Ensoleillement am et pm", "2 espaces de range… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "cable": true}, "appliances": {"washer_dryer": false, … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.logisbourg.com/appartement.asp?SID=1&CID=4&LID=74&Secteur=Charlesbourg/Lebour… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 11 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **11 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync logisbourg` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='logisbourg' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/logisco.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Logisco — connecteur `logisco` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 157/174 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Logisco (logisco.com) Site rendu serveur. Crawl : page liste principale (+ pages villes) pour découvrir les pages projets, puis extraction des unités disponibles (cartes .unitCard) sur chaque page projet. Une annonce par unité. Chaque page unité (mise en cache via self.detail, plafond 150 vraies requêtes/sync) apporte : JSON-LD (adresse avec no d'unité + code postal, étage, téléphone, plan de l'unité), superficie/étage/dispo structurés (sommaire .unitHeader) et les 4 sections de commodités (Inclusions, Particularités, Services offerts, Espaces communs). Villes retenues : Québec, Lévis, Saint-Augustin-de-Desmaures (Donnacona et autres villes hors région exclues). | |
| 10 | + | |
| 11 | +- **Site** : https://logisco.com/fr | |
| 12 | +- **Page des annonces** : https://logisco.com/fr/appartements-a-louer | |
| 13 | +- **Secteurs couverts** : Québec (Ste-Foy, Val-Bélair, Loretteville, Vanier, St-Augustin) + Lévis (St-Romuald, St-David, St-Nicolas, Desjardins) | |
| 14 | +- **Module** : `louka/connectors/logisco.py` — classe `LogiscoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://logisco.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://logisco.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 157 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | L'AMALGAM — Appartement 310 | | |
| 33 | +| `address` | Adresse civique | 100 % | 310-931 Rue de l’École, Lévis, G6W 0T4 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Romuald | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 860 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1167 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 99 % | 46.7358587 | | |
| 43 | +| `description` | Description | 100 % | Projet L'AMALGAM — 1167 pi², Étage 3 — 12 unité(s) disponible(s) dans le projet | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 17 photo(s) — https://logisco.com/static/vb/3414-475/appartement-310-amalgam-logisco.webp | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Deux stationnements extérieurs", "Climatisation", "Entrée indépendante", "Entrée laveus… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true, "dishwasher_hookup": true}, "ac": true, "ele… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://logisco.com/fr/appartements-a-louer/levis/saint-romuald/amalgam/931-appartement-3… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 157 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 174 au total, **157 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 99 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync logisco` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='logisco' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/logisma.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Logisma — connecteur `logisma` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 15/19 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Logisma (logisma.ca) Page de recherche /appartements-a-louer/ (boucle Elementor) : une carte par unité disponible. Pages détail pour disponibilité, description, promotion, liste « Détails : » (inclusions/animaux/fumeur), téléphone (lien tel:) et toutes les images. L'API REST WP (/wp-json/wp/v2/location) existe mais n'expose ni contenu ni ACF -> HTML seulement. La section commerciale/industrielle est exclue. | |
| 10 | + | |
| 11 | +- **Site** : https://logisma.ca | |
| 12 | +- **Page des annonces** : https://logisma.ca | |
| 13 | +- **Secteurs couverts** : Ville de Québec | |
| 14 | +- **Module** : `louka/connectors/logisma.py` — classe `LogismaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://logisma.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://logisma.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 15 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 2 1/2 – 89 Place de Versailles #02, Lévis | | |
| 33 | +| `address` | Adresse civique | 100 % | 89 Place de Versailles #02 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Lévis | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 2½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 843 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 80 % | 46.803338 | | |
| 43 | +| `description` | Description | 100 % | 2 1/2 dans un grand complexe résidentiel. Secteur résidentiel calme et recherché, Place d… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://logisma.ca/wp-content/uploads/2026/01/77-6_Versailles_00050.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Prix de base : 920$/mois", "843$ avec le mois gratuit"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"contact": {"phone": "418-652-0377"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://logisma.ca/appartements-a-louer/4-1-2-89-place-de-versailles-06-levis-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 15 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 19 au total, **15 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 80 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync logisma` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='logisma' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/logispro.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# LogisPro Rimouski — connecteur `logispro` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur LogisPro Rimouski (logisprorimouski.com — Rimouski, parc de 110 logements, 30+ ans). WordPress + Elementor + WP Rocket, tout rendu serveur. La page /nos-logements/ (« Logements disponibles ») liste les unités en location : cartes Elementor (adresse, type, photo, bouton « Voir la fiche » vers une page WP par unité). La fiche unité /<slug>/ fait foi : h1 = type (« 4 1/2 pièces »), h4 = adresse, widget statut (« Disponible » / « Non disponible » -> exclu), widget prix nu (« 850.00 », parfois « 600.00$ 655.00$ »), description en listes (inclusions, AUCUN ANIMAL, « Disponible Juillet 2026 ») + section « À proximité », galerie complète. Fiches via cache BD. Quand aucun logement n'est libre la page n'a plus de cartes -> [] (marché plein = normal). robots.txt Yoast ouvert, sitemap XML. | |
| 10 | + | |
| 11 | +- **Site** : https://logisprorimouski.com | |
| 12 | +- **Page des annonces** : https://logisprorimouski.com/nos-logements/ | |
| 13 | +- **Secteurs couverts** : Rimouski (rue William-Price/parc Beauséjour, rue St-Laurent Ouest, rue Saint-Jean-Baptiste Est) | |
| 14 | +- **Module** : `louka/connectors/logispro.py` — classe `LogisproConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://logisprorimouski.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://logisprorimouski.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 pièces — 366-368, rue William-Price | | |
| 33 | +| `address` | Adresse civique | 100 % | 366-368, rue William-Price | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Rimouski | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 75 % | 850 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.4389796 | | |
| 43 | +| `description` | Description | 100 % | Description 418-318-0058 Bel appartement offrant confort, sécurité et nature de 2 chambre… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 11 photo(s) — https://logisprorimouski.com/wp-content/uploads/2025/02/IMG_8086-1-1024x768… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "hot_water": true}, "appliances":… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://logisprorimouski.com/5-12/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 22:45 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 75 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync logispro` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='logispro' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/logisquebec.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# LogisQuébec — connecteur `logisquebec` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 6393/6396 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +LogisQuébec (logisquebec.com) — portail locatif québécois (Réglisse Média). ~9 800 fiches location, province entière. Découverte par les sitemaps (99,7 % du parc vérifié vs compteurs des pages liste) : URLs de fiche « {type}-a-louer-{ville}-l###### ». Chaque fiche (SSR, Cloudflare tolérant) expose un JSON-LD complet : SingleFamilyResidence (adresse + code postal + GPS + téléphone) et Product (nom, description, offers.price, sku = id). Galerie lightGallery, disponibilité et caractéristiques actives (span .caracteristique-texte) dans le HTML. Fiche expirée -> HTTP 410 Gone (retrait immédiat). Cache détail avec TTL (les prix changent) via _detailutil.TtlDetailCache. Superficie : la fiche n'a AUCUN champ structuré (ni JSON-LD floorSize, ni caractéristique dédiée — vérifié 2026-08-18) ; seule l'extraction texte de finalize() (description/commodités) s'applique, ~26 % du parc en donne une. | |
| 10 | + | |
| 11 | +- **Site** : https://www.logisquebec.com | |
| 12 | +- **Page des annonces** : https://www.logisquebec.com/appartement-a-louer-montreal | |
| 13 | +- **Secteurs couverts** : Province entière — portail locatif (Réglisse Média), ~9 800 annonces | |
| 14 | +- **Module** : `louka/connectors/logisquebec.py` — classe `LogisQuebecConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.logisquebec.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.logisquebec.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6393 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Un Beau 5 1/2 Completement Renové | | |
| 33 | +| `address` | Adresse civique | 100 % | 80B rue Sylvio Langlois | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saint-Félix-de-Dalquier | | |
| 35 | +| `sector` | Secteur / quartier | 45 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 92 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 900 $ | | |
| 38 | +| `bedrooms` | Chambres | 94 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 85 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 31 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 68 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.6738344 | | |
| 43 | +| `description` | Description | 100 % | Un beau 5 ½ au cœur du village St-Félix-de-Dalquier. Rue Sylvio Langlois # 80-A. En face … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 6 photo(s) — https://i.logisquebec.com/i-a-louer/83855/318750/20220708_110422_jpg_68fac7d… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["3 chambres", "Stationnement privé"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true}, "appliances": {"washer_dryer_hookup": true, "dishwasher… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.logisquebec.com/appartement-a-louer-saint-felix-de-dalquier-l318750 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.4 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 02:51 — 6393 trouvées, +397 / ~5996 / -3 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 6396 au total, **6393 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 6, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync logisquebec` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='logisquebec' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lokalia.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Espaces Lokalia — connecteur `lokalia` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 131/135 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Espaces Lokalia (espaceslokalia.ca) Le gestionnaire couvre plusieurs régions (Québec/Lévis + Grand Montréal : Laval, Longueuil/Rive-Sud, Montérégie, Rive-Nord proche...) -> on interroge l'endpoint AJAX WordPress `get_immeubles_map_data` région par région (slugs découverts dans le filtre du site), ce qui donne la ville par défaut ET les lat/lng structurés de chaque immeuble. Page immeuble : adresse structurée (lien Google Maps sous le H1), accordéons Inclusions / Équipements & sécurité / Aires communes, description (paragraphes réels + promotion + « N unités • N étages »), téléphone du bureau de location, grille « Prix et types d'unités ». Une annonce par type d'unité offert dans chaque immeuble (les variantes « + DEN » ou avec parenthèse gardent leur propre annonce). Ni disponibilité ni superficie ne sont publiées par la source. | |
| 10 | + | |
| 11 | +- **Site** : https://www.espaceslokalia.ca | |
| 12 | +- **Page des annonces** : https://www.espaceslokalia.ca/immeuble/vivaxces-le-nicolas | |
| 13 | +- **Secteurs couverts** : Lévis (Vivaxcès Le Nicolas) | |
| 14 | +- **Module** : `louka/connectors/lokalia.py` — classe `LokaliaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://www.espaceslokalia.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.espaceslokalia.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 131 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Dézie — Studio | | |
| 33 | +| `address` | Adresse civique | 100 % | 421 Rue Dorimène-Desjardins, Lévis, QC, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 10 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 82 % | 1 100 $ | | |
| 38 | +| `bedrooms` | Chambres | 96 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8050687 | | |
| 43 | +| `description` | Description | 100 % | Promotion : Jusqu'à 2 mois gratuits* + 500 $ de rabais pour tout emménagement d'ici le 1e… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://www.espaceslokalia.ca/wp-content/uploads/2025/08/Appartements-a-loue… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Appareil de climatisation (Sans utilisation)", "Câblodistribution", "Eau chaude", "Élec… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "appliances": {"fridge": true}, "el… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.espaceslokalia.ca/immeuble/le-dezie/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:06 — 131 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 135 au total, **131 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 82 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lokalia` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lokalia' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/louer_ca.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Louer.ca — connecteur `louer_ca` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 4370/5321 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Louer.ca — portail locatif 100 % Québec du réseau Rentals.ca. Accès par l'API GraphQL interne (https://louer.ca/graphql), rétro-conçue : clé publique `rentalsGqlKey` lue dans window.appconf de la page d'accueil, mutation `acquireAuthInfo` -> JWT (scalaire JSON contenant accessToken ~1 h + refreshToken), en-tête `Authorization: Bearer <access>`. La recherche passe par la ville : typeahead -> City.id, puis `node(id){... on City{ rentalListings(first,after) }}` (curseur Relay ; le champ rentalListings top-level renvoie 0). Le détail `node(id)` fournit adresse, description, galerie (images.rentals.ca) et les floorPlans (un type/prix par plan) -> une annonce Lou-Ka par plan d'étage. ⚠️ Réseau Rentals.ca : CGU interdisant l'extraction sans accord écrit. | |
| 10 | + | |
| 11 | +- **Site** : https://louer.ca | |
| 12 | +- **Page des annonces** : https://louer.ca/montreal | |
| 13 | +- **Secteurs couverts** : Province entière — portail locatif (réseau Rentals.ca), API GraphQL | |
| 14 | +- **Module** : `louka/connectors/louer_ca.py` — classe `LouerCaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API GraphQL interne | |
| 19 | +- **Endpoint de base** : https://louer.ca/graphql | |
| 20 | +- **URLs de départ (constantes du module)** : https://louer.ca/graphql · https://louer.ca/ · https://louer.ca · https://my.matterport.com/show/?m={ref} | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : multi-racines (15 pages de départ : CITIES) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API GraphQL interne) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4370 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1225 Saint Marc Street | | |
| 33 | +| `address` | Adresse civique | 100 % | 1225 Saint Marc Street | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 14 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 450 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 16 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 82 % | 400 | | |
| 41 | +| `availability_date` | Date de disponibilité | 98 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.492189 | | |
| 43 | +| `description` | Description | 100 % | Le Marco Situé au 1225, rue Saint Marc, à proximité du métro Guy-Concordia, ce quartier o… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://images.rentals.ca/property-pictures/large/montreal-qc/809380/apartm… | | |
| 45 | +| `amenities` | Commodités (JSON) | 94 % | ["Cuisinière", "Non-fumeur", "Balcon", "Réfrigérateur", "Électricité incluse", "Chauffage… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "appliances": {"fridge": true, "st… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://louer.ca/montreal/le-marco-1225-st-marc-st | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.5 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 4613 trouvées, +203 / ~0 / -477 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5321 au total, **4370 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 4, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync louer_ca` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='louer_ca' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/louer_saguenay.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Louer Saguenay — connecteur `louer_saguenay` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 5/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Louer Saguenay (louersaguenay.com — centre-ville de Jonquière, ville de Saguenay ; 9128-0768 Québec inc.). Petit parc de lofts et d'appartements au-dessus de locaux commerciaux de la rue Saint-Dominique. WordPress + Elementor rendu serveur : - page /location-loft-appartement-jonquiere/ : boucle Elementor — un item `.e-loop-item.category-location-loft-appartement-jonquiere` par annonce (titre h2 + lien, extrait « DISPONIBLE AU 1-6-2026 », photo) ; la section « NOS ESPACES COMMERCIALES » (articles `ee-post`, catégorie location-espaces-commercials-saguenay) est ignorée ; - fiche : description (« Informations »), « Prix mensuel : » suivi des tarifs « 1395.00$ (Non meublé) / 1495.00$ (Meublé) » -> price = le plus bas, price_label = texte original complet, galerie de photos. Fiches visitées via self.detail (cache BD, re-fetch seulement si l'extrait ou le titre change) — parc ~5 unités résidentielles. external_id stable : slug de la fiche. city=Saguenay, sector=Jonquière (convention des connecteurs SLSJ existants). robots.txt ouvert (Disallow /imunify-bot-check seulement), sitemap Yoast. | |
| 10 | + | |
| 11 | +- **Site** : https://louersaguenay.com | |
| 12 | +- **Page des annonces** : https://louersaguenay.com/location-loft-appartement-jonquiere/ | |
| 13 | +- **Secteurs couverts** : Saguenay / centre-ville de Jonquière (rue Saint-Dominique) — lofts et appartements ; locaux commerciaux exclus | |
| 14 | +- **Module** : `louka/connectors/louer_saguenay.py` — classe `LouerSaguenayConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://louersaguenay.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://louersaguenay.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement 4 ½ à louer 2345 rue Saint-Dominique Suite 201 | | |
| 33 | +| `address` | Adresse civique | 100 % | 2345 rue Saint-Dominique Suite 201, Jonquière | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saguenay | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Jonquière | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 395 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.5408764 | | |
| 43 | +| `description` | Description | 100 % | DISPONIBLE POUR LE 1 er JUILLET 2022 ! Appartement 4 et demi de luxe. Situé à l’étage d’u… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://louersaguenay.com/wp-content/uploads/2020/01/2345-rue-saint-dominiqu… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true}, "appliances": {"dishwasher": true}, "ac": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://louersaguenay.com/appartement-4-et-demi-rue-saint-dominique-suite-201/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 5 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **5 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — petit parc (~5 unités) avec prix mensuels publiés (meublé/non meublé) ; dates de disponibilité des fiches parfois périmées (texte brut conservé) | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync louer_saguenay` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='louer_saguenay' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/louis14.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Quartier Louis Quatorze (Groupe Damco) — connecteur `louis14` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 18/18 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Quartier Louis Quatorze (louis14.ca) 424 condos locatifs (immeubles A-B-C-D), Lebourgneuf, Québec (Groupe Damco). Le site WordPress n'affiche aucun prix statiquement : la page /plans/ embarque le sélecteur de plans Livya (app.livya.com, ex-RealVuu). La page Next.js du sélecteur est rendue serveur : son flux RSC (`self.__next_f .push`) contient les 423 unités du projet avec prix de location réel, disponibilité, superficie, étage, orientation, balcon, photos du type et plan d'étage — on le parse directement, sans exécuter de JavaScript. (403 sans UA navigateur ; le UA de base.py passe, Cloudflare accepte.) Seules les unités AVAILABLE deviennent des annonces (prix réels). | |
| 10 | + | |
| 11 | +- **Site** : https://louis14.ca | |
| 12 | +- **Page des annonces** : https://louis14.ca/plans/ | |
| 13 | +- **Secteurs couverts** : ['Lebourgneuf'] | |
| 14 | +- **Module** : `louka/connectors/louis14.py` — classe `Louis14Connector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://louis14.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://louis14.ca · https://app.livya.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 18 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Louis 14 (Quartier C-D) — unité 816-C | | |
| 33 | +| `address` | Adresse civique | 100 % | 1010 Rue des Gadelles, Québec, G2J 1T8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 401 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1095 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8476 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/0a8f943a-fd85-4ee6-bf0e-f1630… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Balcon de 112 pi²", "Étage 8", "Orientation SE"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true, "floor": 8, "orientation": "SE", "balcony_sqft": 112.0, "bedrooms": 2, … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://louis14.ca/plans/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 18 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 18 au total, **18 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync louis14` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='louis14' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lr_gestion.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# LR Gestion immobilière (LR Location) — connecteur `lr_gestion` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 111/116 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur LR Gestion immobilière / LR Location (lrgestion.com ; portail d'annonces lrlocation.ca) — plus gros acteur multi-secteurs de l'Outaouais : Gatineau, Hull, Aylmer, Buckingham, Cantley, Thurso, Perkins (Val-des-Monts)… Portail RentSync rendu serveur, même plateforme que Girescom (girescom.py). Liste /fr/residential : une carte par immeuble (adresse avec ville, prix « Louer de », chambres). Page immeuble /fr/residential/<slug> : tableau des unités disponibles (li.unit-table-desktop__units--unit, colonnes column-field : numéro, salles de bain, prix, pi², photos, disponibilité — pas de colonne chambres sur ce portail), description « À propos de la propriété », texte « Quartier », téléphone du bureau de location et galerie. Une annonce Lou-Ka = une unité. Les immeubles d'Ottawa (Ontario) sont exclus ; Hull/Aylmer/Buckingham/Masson-Angers sont des secteurs de Gatineau (fusion 2002) -> sector = secteur, city = Gatineau. Fiches immeuble via self.detail() (cache BD, max max_details/sync). | |
| 10 | + | |
| 11 | +- **Site** : https://lrgestion.com | |
| 12 | +- **Page des annonces** : https://www.lrlocation.ca/fr/residential | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer, Buckingham), Cantley, Thurso, Perkins (Val-des-Monts) — Ottawa (ON) exclue | |
| 14 | +- **Module** : `louka/connectors/lr_gestion.py` — classe `LRGestionConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.lrlocation.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lrlocation.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 111 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1005B Rue Notre Dame — unité 1005B-3 | | |
| 33 | +| `address` | Adresse civique | 100 % | 1005 Rue Notre Dame, Gatineau, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 67 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 595 $ | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 21 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4893935 | | |
| 43 | +| `description` | Description | 100 % | Bel immeuble bien entretenu, offrant un environnement calme, propre et sécuritaire. La pr… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 12 photo(s) — https://s3.amazonaws.com/lws_lift/gestion_lr/images/gallery/512/17769539669… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 Salles de bains"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"building": "1005B Rue Notre Dame", "contact": {"phone": "873-800-0478"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lrlocation.ca/fr/residential/1005b-rue-notre-dame | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 112 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 116 au total, **111 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lr_gestion` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lr_gestion' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/luxuor.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Les Immeubles Luxuor — connecteur `luxuor` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Luxuor (lesimmeublesluxuor.com — ville de Saguenay). Condos locatifs neufs haut de gamme rue des Golfeurs (arrondissement Chicoutimi, projets « 42 logements » et « 16 logements »), plex « Quadrex » et résidence étudiante « La Fabrique » (3821 rue de la Fabrique, Jonquière). Site Wix rendu serveur, 4 pages projet FIXES sans fiches d'unités ni prix ni disponibilités (visites par formulaire) -> 1 annonce « catalogue » par projet, granularité PROJET (précédent girs/immeubles_guillot/alias_appartements), price=None, rien d'inventé. Texte extrait des blocs Wix `div[data-testid= "richTextElement"]` du <main> (les menus, légendes de galerie et pieds de page sont hors de ces blocs) : lignes courtes = pictogrammes de commodités (« Ascenseur », « Gym »…), lignes longues = description. Types multiples (3½-5½) cités en prose -> unit_type vide, la description fait foi. external_id stable : slug de page. robots.txt Wix standard (ouvert). | |
| 10 | + | |
| 11 | +- **Site** : https://www.lesimmeublesluxuor.com | |
| 12 | +- **Page des annonces** : https://www.lesimmeublesluxuor.com/42logements | |
| 13 | +- **Secteurs couverts** : Saguenay : rue des Golfeurs à Chicoutimi (42 + 16 logements), Quadrex, résidence étudiante La Fabrique à Jonquière (12 unités 4½) | |
| 14 | +- **Module** : `louka/connectors/luxuor.py` — classe `LuxuorConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.lesimmeublesluxuor.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lesimmeublesluxuor.com · https://static.wixstatic.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : multi-racines (4 pages de départ : PAGES) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Les Immeubles Luxuor — 42 Logements | | |
| 33 | +| `address` | Adresse civique | 75 % | Rue des Golfeurs, Chicoutimi | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saguenay | | |
| 35 | +| `sector` | Secteur / quartier | 75 % | Chicoutimi | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 25 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 25 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 75 % | 48.372797645314 | | |
| 43 | +| `description` | Description | 100 % | Situés sur la rue des Golfeurs à Ville Saguenay, dans l'arrondissement Chicoutimi (direct… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://static.wixstatic.com/media/e2b7ff_926fc95cc49f46feb1e6ffd171f08591f… | | |
| 45 | +| `amenities` | Commodités (JSON) | 75 % | ["Ascenseur", "Gym", "Terrasse au toit", "Intercom", "Boîte aux lettres à même le hall d'… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "elevator": true, "balcony": true, "gym": true, "storage": true, "parking": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lesimmeublesluxuor.com/42logements | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 75 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — 4 annonces « catalogue » à granularité projet (description, commodités, photos) : la source ne publie ni prix, ni disponibilités, ni fiches d'unités (visites par formulaire) | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync luxuor` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='luxuor' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/lynk_olymbec.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Lynk (Olymbec) — connecteur `lynk_olymbec` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : Firecrawl · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Lynk par Olymbec (lynk.ca) Lynk De la Savane — 303 unités au 5200, rue De la Savane, Montréal (secteur Namur / De la Savane, CDN-NDG). Site RentCafe derrière un challenge Cloudflare (403 pour les robots) : accès direct tenté avec en-têtes réalistes, sinon repli sur Firecrawl (rendu JS). Sources combinées (1 annonce par type d'unité — Studio, 3½, 4½, 5½) : - /lynk-dls/units : prix marketing « à partir de » par type, inclusions « dans mon unité » (icônes) et « aménagements et matériaux » (liste) ; - /lynk-dls/floorplans : données RentCafe STRUCTURÉES par plan (data-floorplan-size/sqft/price) -> superficie et fourchette de prix réelles ; pages de plan (avec cache self.detail) -> unités disponibles (« # 923 — Disponible maintenant ») ; - /lynk-dls : description du projet + « services et commodités » (icônes) + téléphone (lien tel:). Le projet Lynk Royale (Trois-Rivières) et Lynk Griffintown (« bientôt disponible ») sont exclus. | |
| 10 | + | |
| 11 | +- **Site** : https://lynk.ca | |
| 12 | +- **Page des annonces** : https://lynk.ca/ | |
| 13 | +- **Secteurs couverts** : De la Savane / Côte-des-Neiges | |
| 14 | +- **Module** : `louka/connectors/lynk_olymbec.py` — classe `LynkOlymbecConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.lynk.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lynk.ca | |
| 21 | +- **Authentification** : aucune — contenu public (clé Firecrawl côté Lou-Ka) | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) ; Firecrawl (HTML rendu, JavaScript exécuté) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (Firecrawl, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Lynk De la Savane — Studio | | |
| 33 | +| `address` | Adresse civique | 100 % | 5200, rue De la Savane, Montréal, QC H4P 0E2 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Namur / De la Savane (CDN-NDG) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 380 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 75 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 75 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4989506 | | |
| 43 | +| `description` | Description | 100 % | Lynk’s studio, 3 ½, 4 ½ & 5 ½ floor plans are designed to support a flexible, connected l… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 25 photo(s) — https://resource.rentcafe.com/image/upload/x_0,y_0,w_3200,h_2133,c_crop/q_a… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["chauffage — thermostat individuellement contrôlé", "électricité", "eau chaude", "détect… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lynk.ca/lynk-dls/units | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 4 trouvées, +0 / ~4 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync lynk_olymbec` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='lynk_olymbec' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/m_immobilier.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# M Immobilier (location) — connecteur `m_immobilier` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 192/198 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +M Immobilier (mimmobilier.com) — LOCATIONS Agence indépendante de prestige (Grand Montréal), inscriptions Centris. La liste /properties est rendue serveur et paginée ; le formulaire expose un filtre statut « à louer » (radio name="CODE_STATUT" value="AL") qu'on rejoue en query string : /properties?CODE_STATUT=AL&page=N. Chaque carte « cardProperty » porte l'URL (avec no Centris), le badge « à louer », la ville, l'adresse, chambres, salles de bains, superficie (PC) et le loyer « X $ / M ». Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka), qui excluait justement ces cartes-là. | |
| 10 | + | |
| 11 | +- **Site** : https://www.mimmobilier.com | |
| 12 | +- **Page des annonces** : https://www.mimmobilier.com/properties?CODE_STATUT=AL | |
| 13 | +- **Secteurs couverts** : Grand Montréal — filtre serveur CODE_STATUT=AL, volet résidentiel | |
| 14 | +- **Module** : `louka/connectors/m_immobilier.py` — classe `MImmobilierConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.mimmobilier.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.mimmobilier.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 192 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 9017 Rue Jean-Baptiste-Gauthie, Mirabel | | |
| 33 | +| `address` | Adresse civique | 100 % | 9017 Rue Jean-Baptiste-Gauthier | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Mirabel | | |
| 35 | +| `sector` | Secteur / quartier | 72 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 98 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 500 $ | | |
| 38 | +| `bedrooms` | Chambres | 98 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 91 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 54 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 59 % | — | | |
| 43 | +| `description` | Description | 100 % | Beau logement de 2 chambres situé au niveau inférieur d'une propriété unifamiliale constr… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 25 photo(s) — https://www.mimmobilier.com/images/centris-slideshow/13486094-1-494761508.j… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "hot_water": false}, "storage": t… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.mimmobilier.com/properties/9017-Rue-Jean-Baptiste-Gauthier/13486094 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 192 trouvées, +0 / ~0 / -3 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 198 au total, **192 actives** | |
| 59 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 59 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 59, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync m_immobilier` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='m_immobilier' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/majestic.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Le Majestic du Lac Boivin — connecteur `majestic` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montérégie · Backend : direct · Annonces actives : 1/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le Majestic du Lac Boivin (majesticlacboivin.ca) — 1 complexe de condos locatifs haut de gamme à Granby (150 rue de la Lobélie, adresse affichée sur la page « Nous joindre », schema.org PostalAddress). Site custom (non-WordPress) : la page /fr/condos-locatifs.html rend côté serveur la liste des unités libres (div.uniteItem[data-id] dans .listeResultatUnite) avec unité, étage, chambres, salles de bain, superficie, loyer, disponibilité, plan PDF et bouton « Info » — les unités réservées portent span.nonDispo (« Réservé ») et sont écartées. Les inclusions/avantages de l'immeuble (listes .services-liste) complètent les commodités. external_id = data-id de l'unité (identifiant interne stable). Le loyer est parfois affiché sans « $ » (« 1795 ») : la colonne étant explicitement « Loyer », le montant est extrait tel quel. robots.txt : /inc/, /Gestion/ et /auto/ interdits — la page des condos est permise. | |
| 10 | + | |
| 11 | +- **Site** : https://www.majesticlacboivin.ca | |
| 12 | +- **Page des annonces** : https://www.majesticlacboivin.ca/fr/condos-locatifs.html | |
| 13 | +- **Secteurs couverts** : Granby (150 rue de la Lobélie, lac Boivin) | |
| 14 | +- **Module** : `louka/connectors/majestic.py` — classe `MajesticConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.majesticlacboivin.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.majesticlacboivin.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Majestic du Lac Boivin — Unité 308 | | |
| 33 | +| `address` | Adresse civique | 100 % | 150 rue de la Lobélie | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Granby | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 695 $ | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 735 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.3971266 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 0 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chambres : 1 ch.", "Salle(s) de bain : 1 sb.", "Superficie : 735 pi²", "Étage : Étage 3… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true, "cable": true}, "ac": true, "elevator": true, "gym": tr… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.majesticlacboivin.ca/fr/condos-locatifs.html | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:14 — 1 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 0 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync majestic` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='majestic' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/matinale.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Matinale — connecteur `matinale` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 44/45 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Matinale (gestionmatinale.com) ~44 apparts + maisons à Sherbrooke, Magog et Windsor. WordPress + WooCommerce : chaque logement offert est un « produit » — archives /a-louer/appartements-logements/ (paginée, 16/page) et /a-louer/maison/. Cartes li.product : titre « 1330 KING OUEST, SHERBROOKE, J1J 2B6 (Août) » (adresse, ville, code postal + disponibilité entre parenthèses), prix WooCommerce, type d'unité dans la taxonomie (classe product_cat-5-1-2) et photo. external_id = ID WordPress (classe post-<id>). ATTENTION robots.txt : « Crawl-Delay: 20 » -> request_delay de 20 s et AUCUNE fiche produit visitée (archives seulement, 4-5 requêtes par sync). | |
| 10 | + | |
| 11 | +- **Site** : https://gestionmatinale.com | |
| 12 | +- **Page des annonces** : https://gestionmatinale.com/a-louer/appartements-logements/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke, Magog, Orford, Sainte-Catherine-de-Hatley, Stukely-Sud | |
| 14 | +- **Module** : `louka/connectors/matinale.py` — classe `MatinaleConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionmatinale.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionmatinale.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 20.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 44 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1330 KING OUEST, SHERBROOKE, J1J 2B6 (Août) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1330 KING OUEST, SHERBROOKE, J1J 2B6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 345 $ | | |
| 38 | +| `bedrooms` | Chambres | 86 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 86 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 57 % | 45.3985951 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://gestionmatinale.com/wp-content/uploads/2024/06/1330-Ko-facade-1.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 84 % | {"postal_code": "J1J 2B6"} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionmatinale.com/appartement/5-1-2/1330-king-ouest-sherbrooke-j1j-2b6/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:15 — 44 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 20.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 45 au total, **44 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 57 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync matinale` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='matinale' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 20.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/may_bourg.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Gestion May Bourg — connecteur `may_bourg` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Centre-du-Québec · Backend : direct · Annonces actives : 6/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion May Bourg (maybourg.com) Parc de 162 unités à Bécancour (Centre-du-Québec). WordPress + Elementor + Dynamic Content for Elementor : la page /repertoire-de-logements/ liste les modèles disponibles en <article class="logement"> avec data-dce-post-id stable (ID de post WP), titre, projet, adresse, prix (« 1350$ / mois »), superficie (« 1048 P.C. ») et badge « Unités disponibles ». Les fiches /logement/<slug>/ (via cache BD) ajoutent la description et la galerie. robots.txt : /wp-json/ interdit → HTML seulement (respecté). | |
| 10 | + | |
| 11 | +- **Site** : https://maybourg.com | |
| 12 | +- **Page des annonces** : https://maybourg.com/repertoire-de-logements/ | |
| 13 | +- **Secteurs couverts** : Bécancour | |
| 14 | +- **Module** : `louka/connectors/may_bourg.py` — classe `MayBourgConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://maybourg.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://maybourg.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le prestigieux- 4 1/2 – 2e étage | | |
| 33 | +| `address` | Adresse civique | 100 % | Rue Roy, Bécancour, QC G9H0X5 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Bécancour | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Condos Prestige – Rue Roy | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 525 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1400 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.2822128 | | |
| 43 | +| `description` | Description | 50 % | Le Prestigieux est notre logement le plus grand et le plus luxueux , avec une superficie … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 27 photo(s) — https://maybourg.com/wp-content/uploads/2025/10/16162509/6M23119-HDR.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 0 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://maybourg.com/logement/condos-roy-le-prestigieux-4-1-2-1400pc-2e-etage/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:15 — 6 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **6 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 50 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 1 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-16 17:13 | 503 Server Error: Service Unavailable for url: https://maybourg.com/repertoire-de-logements/ | | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync may_bourg` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='may_bourg' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/medway.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Medway — connecteur `medway` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 488/498 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Medway (condosmedway.ca) Condos locatifs neufs multi-villes : Rivière-du-Loup, Lévis (Saint-Nicolas, Lauzon, Rucher), Québec (boul. Laurier, Charest, Wilfrid-Hamel), Pont-Rouge, La Malbaie, Saint-Raphaël. WordPress (thème custom « turbutheme »), tout rendu serveur. Répertoire /condos-a-louer/ : cartes projet (nom, adresse civique avec ville, nombre d'unités). Chaque page projet /projet/<slug>/ embarque les unités sous DEUX gabarits selon le projet : 1. span JSON `condosParEtageJson` (Rive, Edmond, Nico, Anastasie…) — unités par étage : id, prix, type « 3 ½ / 4 ½ bureau », superficie, disponibilité oui/non + « Prochainement » avec date, fiche /condo/… ; 2. tableau JS inline `units = [[…]]` (sélecteur d'étages : Kali, Wil, Alto) — number, state (Available/Reserved/Sold), price, typology (« 4etdemiB », « StudioA »), superficies, date, plan. On ne retient que les unités disponibles (maintenant ou prochainement ; Reserved/Sold exclues) — le prix de chaque unité vient de ces données (les fiches /condo/ n'affichent pas le prix). robots.txt WP standard. | |
| 10 | + | |
| 11 | +- **Site** : https://condosmedway.ca | |
| 12 | +- **Page des annonces** : https://condosmedway.ca/condos-a-louer/ | |
| 13 | +- **Secteurs couverts** : Rivière-du-Loup (Medway Rive) + Lévis (Faro, Nico, Ruches, Complexe Santé Lauzon), Québec (Kali, Wil), Pont-Rouge (Edmond, Quartier Anastasie), La Malbaie (Alto), Saint-Raphaël — condos locatifs neufs, 13 projets, forte part de prélocation datée | |
| 14 | +- **Module** : `louka/connectors/medway.py` — classe `MedwayConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://condosmedway.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://condosmedway.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 488 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Medway Faro — Unité 1513 | | |
| 33 | +| `address` | Adresse civique | 100 % | 1015 chemin du Sault, Lévis, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Medway Faro | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 420 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 590 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2027-01-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 91 % | 46.7321163 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://condosmedway.ca/wp-content/uploads/2026/04/Faro-Modele-20.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 78 % | ["Balcon 43 pi²"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 78 % | {"balcony": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://condosmedway.ca/projet/medway-faro/?t=r | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:16 — 488 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 498 au total, **488 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 91 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync medway` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='medway' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/mellem.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Mellem (Groupe Mach) — connecteur `mellem` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 78/87 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Mellem (mellem.ca — Groupe Mach) Site Nuxt (rendu serveur) : un projet = une page /projets/<slug> - Mellem Manoir-des-Trembles (189 unités) — Gatineau - Mellem Grace Dart et Mellem Ville-Marie — Montréal (bonus : mêmes pages, même sélecteur, donc même parsing) Le sélecteur d'unités est le module « plans » de Livya/Realvuu, intégré en iframe et décrit dans la page par <div data-module="plans" data-project="…" data-entity="…">. La page du module (app.livya.com, rendue côté serveur par Next.js) embarque l'INVENTAIRE COMPLET en JSON : n° d'unité, étage, typologie (rooms 4.5 -> 4½), loyer exact (rentalPrice), superficie, balcon, chambres/salles de bain, adresse + ville + code postal, latitude/longitude et statut (AVAILABLE / RESERVED / NOT_AVAILABLE). Une annonce = une unité AVAILABLE. Les projets sont découverts via le sitemap (aucune liste codée en dur), et les commodités/inclusions du projet sont lues sur sa page (liste « Plus de commodités pour mieux vivre »). | |
| 10 | + | |
| 11 | +- **Site** : https://www.mellem.ca | |
| 12 | +- **Page des annonces** : https://www.mellem.ca/projets/manoir-des-trembles | |
| 13 | +- **Secteurs couverts** : Gatineau (Manoir-des-Trembles, boul. Saint-Raymond) ; aussi Montréal (Grace Dart, Ville-Marie) | |
| 14 | +- **Module** : `louka/connectors/mellem.py` — classe `MellemConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.mellem.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.mellem.ca · https://app.livya.com/fr/{client}/projects/{project} | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 78 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Grace Dart — Unité 531 | | |
| 33 | +| `address` | Adresse civique | 100 % | 6085 Rue Sherbrooke Est, Montréal, H1N 1C2 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 96 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 868 $ | | |
| 38 | +| `bedrooms` | Chambres | 96 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 590 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5786 | | |
| 43 | +| `description` | Description | 100 % | B13 — 590 pi² — balcon 58 pi² — 1 chambre(s) — 1 salle(s) de bain — 5eme étage (C) | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/a0d89b35-e0de-40d6-bb33-6c0de… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Internet", "Électricité", "Air climatisé et thermopompe dissimulée sur le toit", "5 éle… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "internet": true}, "appliances": {"fridge": true}, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.mellem.ca/projets/grace-dart#unite-531 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:16 — 78 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 87 au total, **78 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync mellem` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='mellem' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/mercini.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Mercini (Gestion Faleschini Mercier) — connecteur `mercini` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 47/52 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Mercini (Gestion Faleschini Mercier) (groupemercini.com — Limoilou, Duberger, Sainte-Foy, Beauport, Charlesbourg, Saint-Sauveur, Sillery… + Lévis). WordPress + thème WpResidence, tout est rendu serveur. Liste /appartements/ paginée (12 cartes/page) : titre complet (alt de l'image), catégorie (« 4½ », « Studio ou 2½ », « Chambre »…), statut (« Disponible pour visite », « Bientôt disponible »), prix, chambres/sdb. Fiche détail (via cache BD) : adresse complète avec code postal (.property_categs), secteur (taxonomie property_city), description riche (n° de référence REF…, inclusions, animaux…), caractéristiques, galerie complète (#owl-demo). Les lat/lng du thème sont erronées (latitude négative identique partout) : ignorées, le géocodeur Lou-Ka prend le relais. | |
| 10 | + | |
| 11 | +- **Site** : https://groupemercini.com | |
| 12 | +- **Page des annonces** : https://groupemercini.com/appartements/ | |
| 13 | +- **Secteurs couverts** : Limoilou, Sainte-Foy, Duberger, Vanier, Saint-Sacrement, Beauport, Montcalm, Saint-Sauveur, Sillery, Charlesbourg, Lévis | |
| 14 | +- **Module** : `louka/connectors/mercini.py` — classe `MerciniConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://groupemercini.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://groupemercini.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 47 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Maison de ville (4-1/2) \| Secteur : Duberger \| Disponible : Maintenant | | |
| 33 | +| `address` | Adresse civique | 100 % | 2575 Bd de Monaco, Québec, QC G1P 3G9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Duberger | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 895 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 2 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 98 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 94 % | 46.8123302 | | |
| 43 | +| `description` | Description | 100 % | Situé au 2575 boulevard de Monaco – app 2 à Duberger Référence de l’annonce : : REF230126… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://groupemercini.com/wp-content/uploads/2026/02/exposio_0002-min.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["2 Chambres", "2 salle(s) de bain", "2 Salles de bain", "Air climatisé", "Balcon", "Chie… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "hot_water": false, "internet": f… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://groupemercini.com/estate_property/2575-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:16 — 47 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 52 au total, **47 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 94 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync mercini` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='mercini' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/metcap.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# MetCap Living — connecteur `metcap` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 8/8 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur MetCap Living (metcap.com) Site WordPress rendu serveur. La page /province/quebec liste les villes QC (province=115) ; chaque page « province-search-results » liste les immeubles (avec lat/lng dans l'attribut onclick=centerMap) et leurs types d'unités (« Montreal 2 Bedrooms from $1,819 »). Les fiches /apartment/... donnent le détail structuré : tableau « Suite Details » (statut, lits, sdb, pi²), listes « Building Amenities », « Rent Includes », « Pet Friendly », contact du bureau de location, description bilingue et photos d'unité ; les fiches /property/... la galerie photo de l'immeuble. Fiches visitées via self.detail(...) (cache BD). Gestionnaire pancanadien : seules les villes du Grand Montréal sont couvertes. | |
| 10 | + | |
| 11 | +- **Site** : https://www.metcap.com | |
| 12 | +- **Page des annonces** : https://www.metcap.com/province-search-results?lang=en&province=115&city=Montréal | |
| 13 | +- **Secteurs couverts** : Montréal, Saint-Laurent, Pointe-Claire | |
| 14 | +- **Module** : `louka/connectors/metcap.py` — classe `MetcapConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.metcap.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.metcap.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 8 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Tour du Parc — Montreal Studio (Bachelor) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1150 Rue Sherbrooke Est, Montréal, QC H2L 1L8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 38 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 219 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 88 % | 336 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5220419 | | |
| 43 | +| `description` | Description | 100 % | Combining the ultimate in comfort and convenience, Tour du Parc offers rental suites with… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 15 photo(s) — https://www.metcap.com/wp-content/uploads/2023/06/Starlight-1150-Sherbrooke… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Above Ground Parking", "Assigned Parking", "Elevator", "Fitness Centre", "On-Premise Ca… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "elevator": true, "balcony": true,… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.metcap.com/apartment/montreal-bachelor-at-1150-rue-sherbrooke-est-montreal-qc… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:16 — 8 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 8 au total, **8 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync metcap` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='metcap' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/minto.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Minto Apartments — connecteur `minto` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 19/20 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Minto Apartments (mintoapartments.com) Page « projects » Montréal rendue serveur : Rockhill, Haddon Hall, Le 4300, Le Hill-Park. Chaque fiche propriété (main.html) liste ses types de suites dans des cartes .projects-apartamets-unit-card : nom (h4), disponibilité (« Available now » / « Available September 17 » / « Not available »), prix ($X - $Y), pi² (span icon-svg-column), sdb, galerie photo par type (tableaux JS `lightboxImages…`). La section Contact donne l'adresse complète, le quartier (« Neighbourhood: ») et le téléphone/courriel ; les sections Features listent les commodités (items à coche). Une annonce par type de suite disponible. | |
| 10 | + | |
| 11 | +- **Site** : https://www.mintoapartments.com | |
| 12 | +- **Page des annonces** : https://www.mintoapartments.com/montreal/apartment-rentals/projects.html | |
| 13 | +- **Secteurs couverts** : Côte-des-Neiges, Westmount, centre-ville | |
| 14 | +- **Module** : `louka/connectors/minto.py` — classe `MintoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.mintoapartments.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.mintoapartments.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 19 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Haddon Hall — Studio Suites | | |
| 33 | +| `address` | Adresse civique | 100 % | 2255 Rue Lambert-Closse, Montréal, QC H3H 1Z9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 84 % | Shaughnessy Village | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 506 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 401 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 84 % | 45.4917992 | | |
| 43 | +| `description` | Description | 100 % | Haddon Hall apartments offer a luxurious, condo-like home with spacious areas to work and… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://media.minto.com/slideshows/2531/original/Haddon Hall_Rate Chart_Stud… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Security cameras on-site", "Security-controlled access", "Secure fob access", "Pet-frie… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true}, "appliances": {"fridge": true, "dishwasher": true}, "el… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.mintoapartments.com/montreal/apartment-rentals/Haddon-Hall/main.html | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:16 — 19 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 20 au total, **19 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 84 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync minto` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='minto' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/mkar.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Immobilière MKAR — connecteur `mkar` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 5/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Immobilière MKAR (gestionimmobilieremkar.ca — Saguenay : Jonquière/Chicoutimi/La Baie, Alma, Chambord ; gère aussi pour des tiers). WordPress + thème maison blitzWP (CPT property), tout rendu serveur. Archive /proprietes-gestion-immobiliere- mkar/ : cartes `article.archive__item--property` — badge de disponibilité (« Disponible »/« Complet »), type (« 4½ », « Chambre », « Loft »), catégorie (Duplex, Colocation…), adresse + municipalité, photos. Fiche /propriete/<slug>/ (via cache BD) : inclusions (chambres, salles de bain, chauffage, wifi…), conditions de location (animaux, fumeur) et galerie. Aucun prix publié nulle part -> price = None (rien d'inventé). robots.txt Yoast standard (admin seulement), sitemap. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionimmobilieremkar.ca | |
| 12 | +- **Page des annonces** : https://gestionimmobilieremkar.ca/proprietes-gestion-immobiliere-mkar/ | |
| 13 | +- **Secteurs couverts** : Saguenay (Jonquière, Chicoutimi, La Baie, Lac Kénogami) + Alma et Chambord — 2½–6½, lofts, chambres/colocation ; prix jamais publiés par la source | |
| 14 | +- **Module** : `louka/connectors/mkar.py` — classe `MkarConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://gestionimmobilieremkar.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionimmobilieremkar.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Colocation — 3850 Rue Panet | | |
| 33 | +| `address` | Adresse civique | 100 % | 3850 Rue Panet | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saguenay | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Jonquière | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Chambre | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.4043487 | | |
| 43 | +| `description` | Description | 100 % | Conditions de location : La durée de location minimum est d'un an ; Le(s) candidat(s) dev… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://gestionimmobilieremkar.ca/wp-content/uploads/2026/04/f66b9906-6a36-4… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Colocation", "1 Chambre", "2 Salles de bain", "Chauffage", "Eau chaude", "Électricité",… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionimmobilieremkar.ca/propriete/colocation-au-3850-rue-panet-a-jonquiere/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:16 — 5 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **5 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync mkar` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='mkar' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/moderno.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Moderno Construction — connecteur `moderno` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Lanaudière · Backend : direct · Annonces actives : 7/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Moderno Construction (moderno.immo) Promoteur-gestionnaire de Lanaudière (Joliette — Aqua Roca, Domaine du Sentier Riverain). Site custom SSR très propre : /logements-a-louer liste des cartes BEM (titre, disponibilité, prix, adresse, badge « Loué »), chaque carte pointe vers /logements-a-louer/<projet>/<CODE> ; le CODE (= champ « Référence » de la fiche) sert d'external_id stable. La fiche détail (via cache BD) ajoute chambres/sdb, unité/niveau/vue/superficie, inclusions, commodités, description et galerie. | |
| 10 | + | |
| 11 | +- **Site** : https://moderno.immo | |
| 12 | +- **Page des annonces** : https://moderno.immo/logements-a-louer | |
| 13 | +- **Secteurs couverts** : Joliette (Aqua Roca, Domaine du Sentier Riverain) — condos locatifs neufs | |
| 14 | +- **Module** : `louka/connectors/moderno.py` — classe `ModernoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://moderno.immo | |
| 20 | +- **URLs de départ (constantes du module)** : https://moderno.immo | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 7 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4 1/2 - Domaine du Sentier Riverain | | |
| 33 | +| `address` | Adresse civique | 100 % | 105 -1002 rue Gustave-Guertin | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Joliette | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 945 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1120 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.99811 | | |
| 43 | +| `description` | Description | 100 % | Un coin ensoleillé Situé aux abords de la rivière l'Assomption à Joliette, le Domaine du … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 16 photo(s) — https://moderno.tor1.digitaloceanspaces.com/701/105-v1.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["2 chambres", "1 salle de bain", "Électricité", "Eau chaude", "Climatisation", "Chauffag… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://moderno.immo/logements-a-louer/domaine-du-sentier-riverain/ZUOIM | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:16 — 7 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **7 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync moderno` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='moderno' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/mondev.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Mondev — connecteur `mondev` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 47/49 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Mondev (mondev.ca) Grand constructeur-locateur montréalais (Ville-Marie, Sud-Ouest, Griffintown, Plateau, LaSalle, etc.). Site WordPress/Elementor rendu serveur : la page /apartments-and-condos-for-rent/ liste les immeubles (une carte par immeuble, quartier dans l'URL), et chaque fiche immeuble contient un « PLAN SELECTOR » avec, par typologie, « Starting at $X » ou « not available ». Une annonce par (immeuble, typologie) disponible. Prix « à partir de », adresse, description, commodités et galerie photos. | |
| 10 | + | |
| 11 | +- **Site** : https://www.mondev.ca | |
| 12 | +- **Page des annonces** : https://mondev.ca/apartments-and-condos-for-rent/ | |
| 13 | +- **Secteurs couverts** : Ville-Marie, Sud-Ouest, Plateau | |
| 14 | +- **Module** : `louka/connectors/mondev.py` — classe `MondevConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://mondev.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://mondev.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 47 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Jacques — Studio | | |
| 33 | +| `address` | Adresse civique | 100 % | 605 Rue Fullum, Montreal, QC, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Ville-Marie | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 245 $ | | |
| 38 | +| `bedrooms` | Chambres | 98 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 49 % | 45.526832 | | |
| 43 | +| `description` | Description | 94 % | Find your new home at Jacques in Ville-Marie. Studios, 1, 2, or 3-bedroom rentals with hi… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 40 photo(s) — https://mondev.ca/wp-content/uploads/2025/06/Fullum_ext_Cam_001_1-1.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Appliances", "Electricity", "Heating", "Air Conditioning", "Indoor parking", "Gym", "Po… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "appliances": {"fridge": true}, "a… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://mondev.ca/apartments-and-condos-for-rent/ville-marie/jacques-condo-rentals/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:17 — 47 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 49 au total, **47 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 49 % · prix 100 % · photos 100 % · description 94 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync mondev` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='mondev' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/montagnais.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Le Montagnais, résidences étudiantes — connecteur `montagnais` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 31/31 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le Montagnais, résidences étudiantes (lemontagnais.com) — 6 campus/immeubles à Sherbrooke (Campus principal, Campus de la santé, Campus Centro, Campus Mont-Bellevue, Résidences E et G), location longue durée (bail) : chambres, studios, 2½ à 5½. WordPress (thème Oktane « campus ») : la page /logement/ charge la liste via admin-ajax `get_posts_location` (post_type=logement) qui retourne le JSON complet des types de logements — titre, prix « à partir de » (startingFrom), campus (habitation_terms), statut (projet_status/acf), adresse structurée Google (ville, code postal, GPS), description, caractéristiques ACF et photo. Granularité = type de logement par campus (aucune unité individuelle publiée), comme sig.py. 1 requête par sync. Seuls les types au statut « Disponible » deviennent des annonces. | |
| 10 | + | |
| 11 | +- **Site** : https://www.lemontagnais.com | |
| 12 | +- **Page des annonces** : https://www.lemontagnais.com/logement/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Campus principal, Campus de la santé, Campus Centro, Campus Mont-Bellevue, Résidences E et G) | |
| 14 | +- **Module** : `louka/connectors/montagnais.py` — classe `MontagnaisConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API admin-ajax (WordPress) | |
| 19 | +- **Endpoint de base** : https://www.lemontagnais.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lemontagnais.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API admin-ajax (WordPress)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 31 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Petite chambre - Résidence E | | |
| 33 | +| `address` | Adresse civique | 26 % | 2500 Boulevard de l'Université, J1K 1T3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Résidence E | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Chambre | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 431 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.3826185 | | |
| 43 | +| `description` | Description | 100 % | Logement tout inclus confortable et tout meublé avec lit simple, directement sur le campu… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://www.lemontagnais.com/wp-content/uploads/2025/07/Petite-chambre-compl… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Meublé", "Lit simple", "Internet", "Salle d'étude", "Salle de jeux", "Buanderie", "Chau… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lemontagnais.com/logement/petite-chambre-residence-e-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:17 — 31 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 31 au total, **31 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync montagnais` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='montagnais' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/morin.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Constructions Morin — connecteur `morin` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 6/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Constructions Morin (constructionsmorin.com) Constructeur-locateur : apparts neufs tout inclus à Sherbrooke (St-Élie/Rock-Forest, Fleurimont), Ascot Corner, East Angus, Windsor et Lac-Mégantic. WordPress + Avada : la page /appartements-a-louer/ est rendue serveur — un bloc .appartement_list_block par TYPE d'unité disponible dans un immeuble (adresse h3, ville/secteur, projet, badge de type « 4 ½ », « N disponibles », « À partir de … $ », date « Disponible dès le … », chambres/sdb/stationnement). Granularité = type d'unité par immeuble (les unités individuelles de la fiche n'ont ni prix ni dispo propres). Les fiches (via self.detail, cache BD) ajoutent la description (inclusions) et la galerie. external_id = slug projet/unité (stable). | |
| 10 | + | |
| 11 | +- **Site** : https://constructionsmorin.com | |
| 12 | +- **Page des annonces** : https://constructionsmorin.com/appartements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (St-Élie/Rock-Forest, Fleurimont), Ascot Corner, East Angus, Windsor, Lac-Mégantic | |
| 14 | +- **Module** : `louka/connectors/morin.py` — classe `MorinConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://constructionsmorin.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://constructionsmorin.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4½ — 5565 rue Stanislas-Blais (Horizon) | | |
| 33 | +| `address` | Adresse civique | 83 % | 5565 rue Stanislas-Blais | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Ascot Corner | | |
| 35 | +| `sector` | Secteur / quartier | 33 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 395 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 860 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2027-03-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 83 % | 45.447466866013 | | |
| 43 | +| `description` | Description | 100 % | Votre appartement comprend : Construction de qualité supérieure ; Luminosité exceptionnel… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://constructionsmorin.com/wp-content/uploads/2024/02/Facade-1.5.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["15 disponibles", "Immeuble de 30 unités", "2 chambres", "1 salle de bain", "1 stationne… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"parking": {"available": true}, "price_from": true, "project": "Horizon"} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://constructionsmorin.com/appartements-a-louer/horizon/5565-rue-stanislas-blais-4-1-… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:17 — 6 trouvées, +0 / ~0 / -1 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **6 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 83 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync morin` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='morin' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/msi.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# MSI Gestion immobilière — connecteur `msi` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 96/105 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur MSI Gestion immobilière (msimmobiliers.com) Crawl des pages de secteurs (rendu serveur) : Québec + Lévis + Montréal + Thetford Mines (flux intermittent — souvent 0 unité). Front Next.js : chaque fiche embarque un objet JSON `rental` complet dans le payload « flight » (self.__next_f.push) — adresse + code postal, lat/lng, date de disponibilité ISO, étage, superficie, caractéristiques structurées (features), galerie photo, politique chiens (dogPolicy). Fiches visitées via self.detail(...) (cache BD, plafond de requêtes). | |
| 10 | + | |
| 11 | +- **Site** : https://www.msimmobiliers.com | |
| 12 | +- **Page des annonces** : https://www.msimmobiliers.com/appartements-a-louer/quebec | |
| 13 | +- **Secteurs couverts** : Ville de Québec, Lévis, Limoilou, Beauport, Ste-Foy, Vanier, St-Nicolas | |
| 14 | +- **Module** : `louka/connectors/msi.py` — classe `MSIConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.msimmobiliers.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.msimmobiliers.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 96 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 167 Avenue Ruel | | |
| 33 | +| `address` | Adresse civique | 100 % | 167 Avenue Ruel, Québec, QC, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 98 % | Chutes-Montmorency | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 88 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 095 $ | | |
| 38 | +| `bedrooms` | Chambres | 99 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 6 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.874519 | | |
| 43 | +| `description` | Description | 27 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://api.msimmobiliers.com/wp-content/uploads/2024/10/img_7982.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["2 e étage", "Dernier étage", "2 chambre", "Chien interdit", "Non fumeur", "Balcon", "En… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer_hookup": true, "dishwasher_hookup": true}, "balcony": true,… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.msimmobiliers.com/appartements-a-louer/quebec/beauport/chutes-montmorency/app… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:18 — 96 trouvées, +0 / ~0 / -1 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 105 au total, **96 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 27 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync msi` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='msi' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/multi_logis.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Multi-Logis — connecteur `multi_logis` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Côte-Nord · Backend : direct · Annonces actives : 27/27 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Multi-Logis (multi-logis.com — 500+ logements : Sept-Îles, Port-Cartier — plus gros parc de la Côte-Nord — et aussi Lévis, toutes les villes conservées). WordPress + Elementor + JetEngine + plugin maison « multilogis-listing », tout rendu serveur. Liste /trouver-mon-appartement/ : une carte par bâtiment (nom, adresse, typologies offertes, « À partir de »). Page /batiment/<slug>/ (via cache BD) : unités disponibles individuelles (numéro, type, description, loyer, superficie, disponibilité, galerie, plan), adresse structurée du champ ACF (ville, code postal, lat/lng) et listes « Inclus » / « Caractéristiques » de l'immeuble. Une annonce Lou-Ka = une unité disponible. Les champs des unités sont identifiés par leur CONTENU (motifs « $/mois », « Studio/n½ », « Superficie: », « Disponibilité: ») — robustes aux ids Elementor. Immeubles commerciaux (« Le St-Georges ») sans unités : ignorés d'eux-mêmes. robots.txt ouvert, sitemap Yoast. | |
| 10 | + | |
| 11 | +- **Site** : https://multi-logis.com | |
| 12 | +- **Page des annonces** : https://multi-logis.com/trouver-mon-appartement/ | |
| 13 | +- **Secteurs couverts** : Sept-Îles (Perreault, Giasson, Otter, Régnault, Radisson, Bissot, Gallant), Port-Cartier (Maisonneuve) + Lévis (Le Duc de Lévy, Vieux-Lévis) — toutes les villes conservées | |
| 14 | +- **Module** : `louka/connectors/multi_logis.py` — classe `MultiLogisConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://multi-logis.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://multi-logis.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 27 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Duc de Lévy — Appartement #16 | | |
| 33 | +| `address` | Adresse civique | 100 % | 40, G6V 5R8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 96 % | 1 025 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 74 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8051966 | | |
| 43 | +| `description` | Description | 81 % | Découvrez notre studio au Duc de Levy, un espace lumineux alliant confort moderne et char… | | |
| 44 | +| `images` | Photos (JSON) | 70 % | 3 photo(s) — https://multi-logis.com/wp-content/uploads/2024/07/Modele-Grille-Instragram-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 93 % | ["Chauffé, éclairé, eau chaude inclus", "Wi-Fi inclus", "Air climatisé, Thermopompe", "Ca… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "hot_water": true, "internet": true, "cable": true},… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://multi-logis.com/batiment/le-duc-de-levy/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:18 — 27 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 27 au total, **27 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 96 % · photos 70 % · description 81 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync multi_logis` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='multi_logis' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/niddamour.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Nid d'Amour — connecteur `niddamour` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 14/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Nid d'Amour / Karen Cadet inc. (niddamour.ca — Plateau, Verdun, Outremont, Rosemont, Ville-Marie, Brossard...). Front WordPress + Angular sur la plateforme source.immo : on lit la config publique (_configs.json) puis on interroge directement l'API JSON api-v1.source.immo (liste + fiches avec toutes les photos). | |
| 10 | + | |
| 11 | +- **Site** : https://niddamour.ca | |
| 12 | +- **Page des annonces** : https://niddamour.ca/ | |
| 13 | +- **Secteurs couverts** : Plateau, Verdun, Outremont, Rosemont | |
| 14 | +- **Module** : `louka/connectors/niddamour.py` — classe `NiddamourConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://niddamour.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://niddamour.ca · https://api-v1.source.immo/api | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 14 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 5453 Rue Saint-Urbain, H2T 2W8 | | |
| 33 | +| `address` | Adresse civique | 100 % | 5453 Rue Saint-Urbain, H2T 2W8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 64 % | Outremont | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 93 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 500 $ | | |
| 38 | +| `bedrooms` | Chambres | 93 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 57 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 29 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5243897 | | |
| 43 | +| `description` | Description | 100 % | Ce superbe appartement entièrement rénové situé au RDC a tout pour plaire avec ses grande… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 14 photo(s) — https://blob.source.immo/pic/lis-96JG8SbffUOlo91dedb9fQ-v3-md.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 71 % | ["Tous les électroménagers, système de sécurité avec caméra de surveillance et internet h… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true, "electricity": false, "heating": false, "hot_water": fa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://niddamour.ca/propriete/si-00000111/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:18 — 14 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **14 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync niddamour` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='niddamour' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/novelo.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Les Appartements Novelo — connecteur `novelo` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Saguenay–Lac-Saint-Jean · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Appartements Novelo inc. (appartementsnovelo.com — Saguenay, secteur Jonquière/Arvida ; projet du Groupe Dumont, ~50-100 appartements rénovés). WordPress + Elementor + WPML, tout rendu serveur sur une page unique /louer-un-appartement/ : une section par type d'unité (« Appartement — Loft », « — 3 1/2 », « — 4 1/2 », « — 5 1/2 ») avec prix « À partir de 901$/ mois », description, liste des services offerts et galerie. Granularité par TYPE (pas d'unités individuelles ni de dates) — types, prix et photos réels, précédent immeubles_guillot. Adresse du complexe : rue Langelier, Saguenay. robots.txt WP standard (wp-admin seulement), sitemap. | |
| 10 | + | |
| 11 | +- **Site** : https://appartementsnovelo.com | |
| 12 | +- **Page des annonces** : https://appartementsnovelo.com/louer-un-appartement/ | |
| 13 | +- **Secteurs couverts** : Saguenay (Jonquière/Arvida — rue Langelier) — lofts, 3½, 4½ et 5½ rénovés, offre par type avec prix « à partir de » | |
| 14 | +- **Module** : `louka/connectors/novelo.py` — classe `NoveloConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://appartementsnovelo.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://appartementsnovelo.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement Loft — Les Appartements Novelo | | |
| 33 | +| `address` | Adresse civique | 100 % | 2469, rue Langelier | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saguenay | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Loft | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 901 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.40257 | | |
| 43 | +| `description` | Description | 100 % | Tous nos appartements sont complètement rénovés, propres, spacieux et lumineux. Possibili… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://appartementsnovelo.com/wp-content/uploads/2021/07/Novelo_Loft_10-07-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Accès parc à chien", "Stationnement $", "Remise intérieure $", "Possibilité de semi-meu… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true}, "appliances": {"fridge": true, "washer_dryer_hookup": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://appartementsnovelo.com/louer-un-appartement/#loft | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:18 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 2 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-12 20:25 | HTTPSConnectionPool(host='appartementsnovelo.com', port=443): Read timed out. (read timeout=30) | | |
| 68 | +| 2026-08-12 18:52 | HTTPSConnectionPool(host='appartementsnovelo.com', port=443): Read timed out. (read timeout=30) | | |
| 69 | + | |
| 70 | +Rejouer la source seule : `python3 run.py sync novelo` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='novelo' ORDER BY ts DESC LIMIT 5;`). | |
| 71 | + | |
| 72 | +## Licence, attribution & conditions | |
| 73 | + | |
| 74 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 75 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 76 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 77 | +- Retrait sur demande : contact@spboucher.ai. | |
| 78 | + | |
| 79 | +## Historique | |
| 80 | + | |
| 81 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/oklouer.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# OK Louer (location temporaire) — connecteur `oklouer` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 41/41 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur OK Louer (oklouer.com) Appartements meublés en location temporaire à Québec (Haute-Ville, Centre-Ville, Limoilou, Charlesbourg/Beauport). Pages rendues serveur. Les pages de secteurs exposent des cartes `div.unit` structurées : data-lat/data-lng, adresse (h3), icônes lits/chambres/salles de bain, animaux permis (ico-paws). La fiche ajoute le prix, la galerie et la climatisation (ico-clim). Le secteur Lac-Beauport est exclu. | |
| 10 | + | |
| 11 | +- **Site** : https://www.oklouer.com | |
| 12 | +- **Page des annonces** : https://www.oklouer.com/logements/limoilou | |
| 13 | +- **Secteurs couverts** : Limoilou, Charlesbourg/Beauport, Lac-Beauport | |
| 14 | +- **Module** : `louka/connectors/oklouer.py` — classe `OkLouerConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.oklouer.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.oklouer.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 41 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 2½ — 305 Rue Caron, Québec QC G1K 5W3 (meublé, location temporaire) | | |
| 33 | +| `address` | Adresse civique | 100 % | 305 Rue Caron, Québec QC G1K 5W3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Centre-Ville (St-Roch) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 2½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 350 $ | | |
| 38 | +| `bedrooms` | Chambres | 98 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 95 % | 46.8142 | | |
| 43 | +| `description` | Description | 100 % | Appartement meublé en location temporaire (court, moyen ou long terme). | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://www.oklouer.com/uploads/m/202310172013094629693.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 lit", "1 salle de bain", "Avec air climatisé sur demande", "Meublé"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"furnished": true, "price_from": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.oklouer.com/1-1-2-centre-ville-305-rue-caron-quebec-qc-g1k-5w3 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:18 — 41 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 41 au total, **41 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 95 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync oklouer` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='oklouer' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/omhm.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# OMHM — logements abordables — connecteur `omhm` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +OMHM — Office municipal d'habitation de Montréal. Le HLM classique fonctionne par liste d'attente (non agrégeable) ; SEULE la page « logements disponibles » (résidences abordables ENHARMONIE pour aînés autonomes 60 ans +) liste de vraies unités. Site Drupal SSR, aucun anti-bot. Chaque unité = un <article class="node--type-logement-disponible"> avec adresse civique complète et grille de prix par type (« 3 ½ entre 1 357 $ et 1 497 $ »). Volume faible (~5) mais différenciateur social (filtre « logement abordable » de Lou-Ka). | |
| 10 | + | |
| 11 | +- **Site** : https://www.omhm.qc.ca | |
| 12 | +- **Page des annonces** : https://www.omhm.qc.ca/fr/soumettre-une-demande/logements-disponibles | |
| 13 | +- **Secteurs couverts** : Montréal — résidences abordables ENHARMONIE (aînés autonomes) | |
| 14 | +- **Module** : `louka/connectors/omhm.py` — classe `OmhmConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.omhm.qc.ca/fr/soumettre-une-demande/logements-disponibles | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.omhm.qc.ca/fr/soumettre-une-demande/logements-disponibles | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Résidence Lionel-Bourdon à Rivière-des-Prairies — 3½ | | |
| 33 | +| `address` | Adresse civique | 100 % | 12100, rue Rodolphe-Forget | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 357 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 0 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"Code postal": "H1E 7S2", "Logement abordable": "oui", "Résidence pour aînés": "oui"} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.omhm.qc.ca/fr/soumettre-une-demande/logements-disponibles | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.5 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:18 — 3 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 0 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 4, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync omhm` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='omhm' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/osgoode.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Osgoode Properties — connecteur `osgoode` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Osgoode Properties (osgoodeproperties.com) Grand gestionnaire Ottawa-Gatineau ; côté Québec : 4 immeubles à Gatineau (Le 700 St Joseph, Le Faubourg de l'Île, Village Cité-des-Jeunes, Le Salaberry). Site RentCafe/Yardi protégé par Cloudflare (403 direct) : tout passe par Firecrawl, comme realstar.py. 1) pages recherche /1-bedroom|2-bedroom/qc/gatineau/apartments -> cartes propriétés (li.property-box : nom, adresse, lits/sdb/pi², fourchette de prix, téléphone, vignette) — les cartes hors Québec (liens /on/) sont ignorées ; 2) fiche propriété -> galerie resource.rentcafe.com ; 3) /floorplans -> plans structurés (nom, chambres, sdb, pi², prix) ; ⚠ contrairement à Realstar, AUCUN décompte d'unités disponibles n'est publié -> availability reste vide (rien d'inventé). Une annonce par propriété (uid stables). Les fiches passent par self.detail(...) (cache BD) avec budget Firecrawl par sync. | |
| 10 | + | |
| 11 | +- **Site** : https://www.osgoodeproperties.com | |
| 12 | +- **Page des annonces** : https://www.osgoodeproperties.com/apartments-for-rent-gatineau | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull) | |
| 14 | +- **Module** : `louka/connectors/osgoode.py` — classe `OsgoodeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://www.osgoodeproperties.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.osgoodeproperties.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le 700 St Joseph | | |
| 33 | +| `address` | Adresse civique | 100 % | 700 St Joseph, Gatineau, QC J8Y 4B1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 015 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 450 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4551457 | | |
| 43 | +| `description` | Description | 100 % | We offer amenity-rich, proactively maintained, continually modernized apartments in great… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://resource.rentcafe.com/image/upload//q_auto,f_auto,w_600,h_400,c_lfil… | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"price_from": true, "contact": {"phone": "613-688-2222"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.osgoodeproperties.com/apartments/qc/gatineau/le-700-st-joseph | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:18 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync osgoode` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='osgoode' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/oxford.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Appartements Oxford — connecteur `oxford` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Appartements Oxford (appartoxford.com) Complexe locatif de Lennoxville (Sherbrooke), près de l'Université Bishop's. WordPress + Elementor : une fiche par TYPE d'unité (2½ tout inclus, 3½, 4½, 5½), listées dans le menu « Logements » de la page d'accueil. Chaque fiche affiche le prix (« À partir de 760$ / par mois ») et, seulement quand des unités sont libres, un encart de disponibilité (« 1 unité disponible 1er octobre 2026 », widget Elementor à visibilité conditionnelle) : les fiches SANS cet encart ne sont pas des annonces courantes et sont écartées. Caractéristiques (listes à pictos), description et galerie extraites de la fiche. Peu de requêtes (accueil + ~4 fiches) : pas de cache détail nécessaire — la disponibilité doit être relue à chaque synchronisation. | |
| 10 | + | |
| 11 | +- **Site** : https://appartoxford.com | |
| 12 | +- **Page des annonces** : https://appartoxford.com | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Lennoxville, près de l'Université Bishop's) | |
| 14 | +- **Module** : `louka/connectors/oxford.py` — classe `OxfordConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://appartoxford.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://appartoxford.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Grand appartement 3½ à louer | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Lennoxville | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 760 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-15 | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Nos appartements 3½ sont spacieux et lumineux à Lennoxville, Sherbrooke, offrent un espac… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://appartoxford.com/wp-content/uploads/2024/11/3-et-demi_Appartements-O… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Concierge sur place", "Stationnement", "Accès à la piscine (sous condition)", "Vaste es… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"pool": true, "pets": "non", "parking": {"available": true}, "price_from": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://appartoxford.com/appartement/3%C2%BD-a-louer/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:19 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `_MAX_FICHES` = 12 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 60 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 61 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 60, dont 1 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +| Date | Message (sync_log) | | |
| 67 | +|---|---| | |
| 68 | +| 2026-08-14 06:42 | HTTPSConnectionPool(host='appartoxford.com', port=443): Read timed out. (read timeout=30) | | |
| 69 | + | |
| 70 | +Rejouer la source seule : `python3 run.py sync oxford` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='oxford' ORDER BY ts DESC LIMIT 5;`). | |
| 71 | + | |
| 72 | +## Licence, attribution & conditions | |
| 73 | + | |
| 74 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 75 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 76 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 77 | +- Retrait sur demande : contact@spboucher.ai. | |
| 78 | + | |
| 79 | +## Historique | |
| 80 | + | |
| 81 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/per.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Immeubles Paul-E. Richard — connecteur `per` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 3/3 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Immeubles Paul-E. Richard (immeublesper.com — 18 immeubles à Limoilou, Charlesbourg et Beauport). Les unités en vedette sont listées sur /logements/ ; chaque fiche /logement/<slug>/ fournit secteur, adresse, format, prix, disponibilité, caractéristiques et galerie de photos. | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesper.com | |
| 12 | +- **Page des annonces** : https://immeublesper.com | |
| 13 | +- **Secteurs couverts** : Limoilou, Charlesbourg, Beauport | |
| 14 | +- **Module** : `louka/connectors/per.py` — classe `PERConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesper.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesper.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 4515, 5e Avenue Ouest, #6, 4 1/2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 4515, 5e Avenue Ouest | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | 5e Avenue Ouest | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 020 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 67 % | 46.839488 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://immeublesper.com/wp-content/uploads/2018/08/4515-4535-4555-4575-5e-A… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Intercom", "Balcon", "Plancher Bois Flottant, Céramique", "Stationnement à part : 30.00… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true, "pets": "non", "parking": {"available": true}, "floor": 2} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesper.com/logement/4515-6-5e-avenue-ouest/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:19 — 3 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3 au total, **3 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 67 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync per` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='per' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/picard.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Picard Immobilier — connecteur `picard` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 34/34 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Picard Immobilier (picardimmobilier.net) La page /recherche/ liste tous les logements disponibles (rendu serveur), cartes .property-box-2 avec lien /logement/<secteur>/ref=<id>/. Fiches détaillées : photos S3, disponibilité, description, commodités. | |
| 10 | + | |
| 11 | +- **Site** : https://picardimmobilier.net | |
| 12 | +- **Page des annonces** : https://picardimmobilier.net/logement/arrondissement=charny | |
| 13 | +- **Secteurs couverts** : Charny, Les Saules, Ste-Foy, Beauport, Limoilou, Loretteville, Vieux-Québec, Montcalm | |
| 14 | +- **Module** : `louka/connectors/picard.py` — classe `PicardConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://picardimmobilier.net | |
| 20 | +- **URLs de départ (constantes du module)** : https://picardimmobilier.net | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 34 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement \| Limoilou | | |
| 33 | +| `address` | Adresse civique | 100 % | 2227 champfleury, #1, Québec, Québec, G1J 4K1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Limoilou | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 1½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 055 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8406938 | | |
| 43 | +| `description` | Description | 100 % | Charmant petit immeuble résidentiel à limoilou | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://picardimmobilier.s3.amazonaws.com/media/files/00675f6c-f3fa-474a-866… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chambres : 1½", "Salle de bain", "Cuisine", "Entrée indépendante", "Wifi Illimité", "Co… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true}, "ac": true, "pets": "conditions", "furnished": "semi",… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://picardimmobilier.net/logement/limoilou/ref=970/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:19 — 34 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 34 au total, **34 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync picard` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='picard' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/place_florimay.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Place Florimay — connecteur `place_florimay` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Chaudière-Appalaches · Backend : direct · Annonces actives : 0/0 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Place Florimay (placeflorimay.ca) Boulevard Taché Ouest, Montmagny (Chaudière-Appalaches) — 170 condos locatifs en 3 phases ; seule la phase 2 (60 unités, 5 étages) est exposée dans le sélecteur du site. Site WordPress (Elementor/Qode) avec le sélecteur d'unités « do1011 » (variante du plugin do-selecteur-plans utilisé par La Cour / AULA / Le St-Georges), rendu côté serveur : - polygones SVG par unité : class disponible / indisponible, data-numero (id du contenu WP), data-etage, data-type (« 4½ coin »), data-prix, data-promotion ; - REST /wp-json/do-selecteur-plans/v1/unite?id=<data-numero> : n° d'unité, état (« disponible » / « indisponible » + libellé « Louée »), type, superficie habitable et de balcon, plan PDF, galerie. Cette variante du plugin ne renvoie PAS de champ `montant` : le loyer publié est celui du polygone (data-prix) — aucune autre valeur n'est supposée. La carte SVG sert de clé de cache BD (self.detail) : le REST n'est rappelé que si l'unité a changé. ⚠ Cloudflare renvoie 403 aux robots sans en-tête de navigateur : le User-Agent de base.py (Chrome + LouKaBot) passe. robots.txt : Allow: / pour les agents génériques (blocage ciblé des robots d'entraînement IA) ; signal de contenu « use=reference », compatible avec un agrégateur qui renvoie vers la source. ⚠ État du marché au 2026-08-09 : les phases 1 et 3 sont complètes et les 60 unités de la phase 2 sont toutes « Louée » -> le connecteur retourne 0 annonce tant qu'aucune unité n'est remise en location (vérifié aussi unité par unité via le REST). | |
| 10 | + | |
| 11 | +- **Site** : https://placeflorimay.ca | |
| 12 | +- **Page des annonces** : https://placeflorimay.ca/selecteur/ | |
| 13 | +- **Secteurs couverts** : Montmagny (boulevard Taché Ouest — phases 1 à 3) | |
| 14 | +- **Module** : `louka/connectors/place_florimay.py` — classe `PlaceFlorimayConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API REST WordPress (wp-json) | |
| 19 | +- **Endpoint de base** : https://placeflorimay.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://placeflorimay.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API REST WordPress (wp-json)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 0 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | — | — | | |
| 33 | +| `address` | Adresse civique | — | — | | |
| 34 | +| `city` | Ville (normalisée) | — | — | | |
| 35 | +| `sector` | Secteur / quartier | — | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | — | — | | |
| 37 | +| `price` | Loyer mensuel ($) | — | — | | |
| 38 | +| `bedrooms` | Chambres | — | — | | |
| 39 | +| `bathrooms` | Salles de bain | — | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | — | — | | |
| 41 | +| `availability_date` | Date de disponibilité | — | — | | |
| 42 | +| `lat` | GPS (lat/lng) | — | — | | |
| 43 | +| `description` | Description | — | — | | |
| 44 | +| `images` | Photos (JSON) | — | — | | |
| 45 | +| `amenities` | Commodités (JSON) | — | — | | |
| 46 | +| `details` | Détails additionnels (JSON) | — | — | | |
| 47 | +| `url` | URL de l'annonce source | — | — | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:19 — 0 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 0 au total, **0 actives** | |
| 59 | +- **Première ingestion** : — · **Dernière observation** : — | |
| 60 | +- **Complétude clé (actives)** : GPS — · prix — · photos — · description — | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — inventaire à 0 le 2026-08-09 : phases 1 et 3 complètes et les 60 unités de la phase 2 sont toutes « Louée » (vérifié par le REST unité par unité) ; le connecteur produira des annonces dès qu'une unité redeviendra disponible | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync place_florimay` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='place_florimay' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — mention au registre : « …actif — inventaire à 0 le 2026-08-09 : phases 1 et 3 complètes et les 60 unités de la phase 2 sont toutes « Louée » (vérifié p… » | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/plan_a.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Plan A Immobilier — connecteur `plan_a` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 11/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Plan A Immobilier (plan-a.ca) ~3500 unités dans des complexes locatifs (Pierrefonds-Roxboro, Pointe-aux-Trembles, Ahuntsic, Laval, Vaudreuil-Dorion, Sherbrooke — les projets de Saguenay sont encore exclus). WordPress rendu serveur : la page « appartements et condos à louer » expose des cartes-projets a.c-card[data-listing=project] avec un JSON data-filters-item (ville, budget min, types), le carrousel d'images et le prix « à partir de ». Granularité = 1 annonce par complexe (prix plancher), fiches /project/ pour la description et la disponibilité. | |
| 10 | + | |
| 11 | +- **Site** : https://plan-a.ca | |
| 12 | +- **Page des annonces** : https://plan-a.ca/plan-a-appartements-et-condos-a-louer/ | |
| 13 | +- **Secteurs couverts** : Pierrefonds, Laval, Vaudreuil | |
| 14 | +- **Module** : `louka/connectors/plan_a.py` — classe `PlanAConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://plan-a.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://plan-a.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 11 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | ELORA | | |
| 33 | +| `address` | Adresse civique | 100 % | 2005 Av. de Bois-de-Boulogne, Laval | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Laval | | |
| 35 | +| `sector` | Secteur / quartier | 27 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 91 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 91 % | 1 720 $ | | |
| 38 | +| `bedrooms` | Chambres | 91 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 91 % | 45.5720032 | | |
| 43 | +| `description` | Description | 100 % | ELORA : condos locatifs haut de gamme à louer à Chomedey, Laval, avec espaces modernes, p… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 20 photo(s) — https://plan-a.ca/wp-content/uploads/2026/01/hr_facade_perspectiveprincipal… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Comptoir de quartz et dosseret de quartz", "Électroménagers (5) inclus dans toutes les … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true}, "ac": true, "elevator": true, "balcony": true, "gym": tr… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://plan-a.ca/project/elora/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:19 — 11 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **11 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 91 % · prix 91 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync plan_a` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='plan_a' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/progim.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Progim — connecteur `progim` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 62/68 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Immobilière Progim (progimannonces.bstk.io — plateforme Building Stack, Grand Montréal : Montréal, Dorval, Longueuil, Sainte-Julie, Châteauguay, Charlemagne...) La page /Listing/Listings embarque `var units = [...]` (JSON complet des unités). Le détail d'une unité (photos, équipements, description) vient de POST /Listing/ApartmentView avec `id=<ApartmentId>`. | |
| 10 | + | |
| 11 | +- **Site** : https://progim.com | |
| 12 | +- **Page des annonces** : http://progimannonces.bstk.io/Listing/Listings | |
| 13 | +- **Secteurs couverts** : Grand Montréal (base Brossard) | |
| 14 | +- **Module** : `louka/connectors/progim.py` — classe `ProgimConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://progimannonces.bstk.io | |
| 20 | +- **URLs de départ (constantes du module)** : https://progimannonces.bstk.io | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 62 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 812 Dawson — unité 7 | | |
| 33 | +| `address` | Adresse civique | 100 % | 812 Avenue Dawson | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Dorval | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 450 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 68 % | 737 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.441216 | | |
| 43 | +| `description` | Description | 94 % | Situé dans le secteur paisible et recherché de Dorval, cet appartement bénéficie d’un emp… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 4 photo(s) — https://wfiles.buildingstack.com/resources/image/Is5JPJ0mPJ9oBqKpStPMOJHDRZG… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["1 salle de bain", "Chauffage inclus", "Eau chaude inclus", "Meublé", "Réfrigérateur", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true}, "appliances": {"fridge": true, "stov… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://progimannonces.bstk.io/b/202133705601004942719/332233 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:19 — 62 trouvées, +1 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 68 au total, **62 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 94 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync progim` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='progim' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/projection_immo.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Projection Immobilière — connecteur `projection_immo` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 1/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Projection Immobilière (projectionimmobiliere.com — Amqui, Matane, Rimouski, Lac-au-Saumon ; 200+ appartements, rare acteur structuré de la Matapédia). Squarespace, tout rendu serveur. Pas de moteur d'annonces : une page par IMMEUBLE (/logements-<ville>/<slug>, découvertes via sitemap.xml) portant un indicateur « Disponible: Oui/Non », une description des logements (typologies réelles), la liste « À proximité », la carte (mapLat/mapLng) et la galerie. Le connecteur visite chaque page d'immeuble (l'indicateur n'existe nulle part ailleurs) et n'émet que les immeubles « Disponible: Oui » — granularité immeuble assumée (précédent immeubles_guillot), sans prix (jamais publié). robots.txt Squarespace : les UA IA listés partagent le MÊME groupe de règles que « * » (seuls /config, /search, /api/… sont interdits) -> pages d'annonces permises à tous les agents ; aucune page CGU publiée sur le site. Exclusions : /espaces-commerciaux (commercial), « Location court terme », projet Perle Noire (condos en vente). | |
| 10 | + | |
| 11 | +- **Site** : https://www.projectionimmobiliere.com | |
| 12 | +- **Page des annonces** : https://www.projectionimmobiliere.com/residentiel | |
| 13 | +- **Secteurs couverts** : Amqui (15 immeubles), Matane (10), Rimouski (2) — granularité immeuble, sans prix ; commercial (Lac-au-Saumon) et court terme exclus | |
| 14 | +- **Module** : `louka/connectors/projection_immo.py` — classe `ProjectionImmoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.projectionimmobiliere.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.projectionimmobiliere.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 280, Boul Dion, Matane | | |
| 33 | +| `address` | Adresse civique | 100 % | 280, Boul Dion, Matane | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Matane | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 48.4427834 | | |
| 43 | +| `description` | Description | 100 % | Deux grandes chambre, échangeur d’air, bâtiment sécurisé et un grand rangement. | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 14 photo(s) — https://images.squarespace-cdn.com/content/v1/6089952475f01a32b10b9c01/7789… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["À proximité : À moins de 10 minutes à pied", "À proximité : Épicerie", "À proximité : D… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"storage": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.projectionimmobiliere.com/logements-matane/280bouldion | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:19 — 1 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **1 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — 1 immeuble disponible le 2026-08-09 ; parc quasi plein, volume normalement faible | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync projection_immo` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='projection_immo' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-09 — mention au registre : « …actif — 1 immeuble disponible le 2026-08-09 ; parc quasi plein, volume normalement faible… » | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/promenade_des_forts.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Promenade des Forts — connecteur `promenade_des_forts` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Promenade des Forts (promenadedesforts.com, Groupe immobilier Brochu) — condos locatifs en 2 phases au 6275 et 6375, boulevard Étienne-Dallaire (quartier Umano, Lévis). Site WordPress rendu serveur : chaque page d'étage (/projets/phase-N/etage-M/) contient un plan SVG dont les liens d'unités portent la classe « disponible » ou « loue ». La fiche de chaque unité disponible donne modèle, grandeur (4½…), superficie totale, prix avec date (« disponible 1er septembre 2026 à 1485 $ »), spécifications, plan et PDF. Peu d'unités libres à la fois : les fiches sont visitées directement à chaque sync (pas de cache détail), ~15-20 requêtes au total. | |
| 10 | + | |
| 11 | +- **Site** : https://www.promenadedesforts.com | |
| 12 | +- **Page des annonces** : https://www.promenadedesforts.com/projets/phase-1/ | |
| 13 | +- **Secteurs couverts** : Lévis (quartier Umano) | |
| 14 | +- **Module** : `louka/connectors/promenade_des_forts.py` — classe `PromenadeDesFortsConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.promenadedesforts.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.promenadedesforts.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Promenade des Forts phase 1 — unité 607 (5½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 6275 et 6375, Boulevard Étienne-Dallaire, Levis | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Quartier Umano (Lévis) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 945 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 50 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1233 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7960454 | | |
| 43 | +| `description` | Description | 100 % | Modèle : Phase 1 - modèle 8 \| Fiche PDF : https://www.promenadedesforts.com/wp-content/u… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://www.promenadedesforts.com/wp-content/uploads/2018/11/8.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Unité de coin", "2 stationnements (1 intérieur) inclus", "Ascenseur", "Eau chaude fourn… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true}, "ac": true, "elevator": true, "parking": {"available"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.promenadedesforts.com/projets/phase-1/etage-6/unite-607/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync promenade_des_forts` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='promenade_des_forts' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/proprio_direct.md
+80 −0
@@ -0,0 +1,80 @@ | ||
| 1 | +# Proprio Direct (location) — connecteur `proprio_direct` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 190/190 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Proprio Direct (propriodirect.com) — LOCATION L'inventaire (alimenté par le feed DDF de CREA) est servi par une API JSON interne : POST https://propriodirect.com/fr/api/searchListings Corps { "from": <offset>, "filter": {"rentOrSale": "rent"} } — le filtre côté API fonctionne (~260 locations vs ~3200 annonces au total) ; 30 résultats/page, champ `total`. Chaque item porte forRent/forSale/sold, le loyer en cents (rentPriceInCents, rentPriceFrequency), adresse, ville, région, chambres, sdb, GPS, tags et galerie photos. On ne garde que le volet RÉSIDENTIEL (tag « residential ») : les locaux commerciaux et industriels (loyer en $/pi²/an) sont écartés. Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://propriodirect.com | |
| 12 | +- **Page des annonces** : https://propriodirect.com/resultats/?rentOrSale=rent | |
| 13 | +- **Secteurs couverts** : Province entière — API searchListings filter rentOrSale:rent, volet résidentiel | |
| 14 | +- **Module** : `louka/connectors/proprio_direct.py` — classe `ProprioDirectConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://propriodirect.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://propriodirect.com/fr/api/searchListings · https://propriodirect.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.4 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 190 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 31, Boul. des Hauteurs | | |
| 33 | +| `address` | Adresse civique | 100 % | 31, Boul. des Hauteurs | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Saint-Jérôme | | |
| 35 | +| `sector` | Secteur / quartier | 61 % | Lafontaine | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 99 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 095 $ | | |
| 38 | +| `bedrooms` | Chambres | 99 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 4 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.8090705871582 | | |
| 43 | +| `description` | Description | 92 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://cdn.propriodirect.com/properties/22315758/large/001_ADD432ADA40CBE0D… | | |
| 45 | +| `amenities` | Commodités (JSON) | 77 % | ["Stationnement"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"parking": {"available": true}, "Niveau": "Sous-sol", "Zonage": "Résidentiel", "Approvis… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://propriodirect.com/laurentides/saint-jerome/appartement-a-vendre/31-boul-des-haute… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 190 trouvées, +0 / ~6 / -0 | |
| 53 | +- **Throttling** : 0.4 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `MAX_PAGES` = 60 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 190 au total, **190 actives** | |
| 60 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-17 | |
| 61 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 92 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 57, dont 0 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 67 | + | |
| 68 | +Rejouer la source seule : `python3 run.py sync proprio_direct` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='proprio_direct' ORDER BY ts DESC LIMIT 5;`). | |
| 69 | + | |
| 70 | +## Licence, attribution & conditions | |
| 71 | + | |
| 72 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 73 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.4 s ; cache détail pour minimiser les requêtes. | |
| 74 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 75 | +- Retrait sur demande : contact@spboucher.ai. | |
| 76 | + | |
| 77 | +## Historique | |
| 78 | + | |
| 79 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 80 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/quanta.md
+82 −0
@@ -0,0 +1,82 @@ | ||
| 1 | +# Gestion Quanta — connecteur `quanta` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 2/2 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Quanta (gestionquanta.ca) Firme de gestion de l'Outaouais (Gatineau, Hull, Aylmer). Vieux site ASP.NET rendu serveur : la page d'accueil embarque un carrousel (#CAROUSEL) avec TOUTES les fiches de location — titre (« Appartement / Maison / Condo à louer »), lien Location.aspx?RentalId=<id>&rented=<0|1>, secteur/ville, loyer (« 890$ par mois, non chauffé ni éclairé »), description et photo. Les unités louées portent rented=1 et un overlay « rented » : elles sont exclues. Les pages Location.aspx elles-mêmes répondent 404 (liens morts) : l'accueil est la seule source — l'URL d'annonce pointe donc sur l'accueil avec un fragment stable. robots.txt : Disallow /Rentals/ (chemin des photos, jamais visité par le connecteur — seule la page d'accueil, autorisée, est requêtée). external_id = RentalId (H4, G1, CH2…), stable côté site. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionquanta.ca | |
| 12 | +- **Page des annonces** : https://gestionquanta.ca/ | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Plateau, Côte d'Azur, Aylmer) | |
| 14 | +- **Module** : `louka/connectors/quanta.py` — classe `QuantaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionquanta.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionquanta.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement à louer | | |
| 33 | +| `address` | Adresse civique | 0 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Plateau, Hull | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 890 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Beau grand 2 chambres à coucher, unité du bas dans triplex récent, foyer au gaz, échangeu… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://gestionquanta.ca/Rentals/263%20Atmosphere%20Apt%203/S_IMG_2641.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true, "storage": true, "parking": {"available": true}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionquanta.ca/#location-H4 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 2 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — petit parc : 2 unités libres sur 7 fiches le 2026-08-09 (les fiches Location.aspx sont des liens morts, tout vit sur l'accueil) | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync quanta` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='quanta' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-09 — mention au registre : « …actif — petit parc : 2 unités libres sur 7 fiches le 2026-08-09 (les fiches Location.aspx sont des liens morts, tout vit sur l'accueil)… » | |
| 82 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/quartier_mosaique.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Quartier Mosaïque (Constrobourg) — connecteur `quartier_mosaique` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 24/24 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Quartier Mosaïque (Constrobourg) (quartiermosaique.com — 5 complexes : Rubis, Saphir, Opale 1-2, Perle, secteur Lebourgneuf près des Galeries de la Capitale, Québec). Page /unites-disponibles/ rendue serveur (WordPress, thème Browsy) : une carte par plan d'unité disponible (div.cardib.unites-item) avec titre (« Rubis – 3 ½ »), type (data-type), prix « À partir de X $ par mois » (cardib-excerpt), description (data-desc, JSON) et galerie complète (data-gallery, JSON). Aucune page détail nécessaire : tout est sur la liste. Adresse du quartier publiée sur /contact/ : 2013, boulevard Lebourgneuf. | |
| 10 | + | |
| 11 | +- **Site** : https://quartiermosaique.com | |
| 12 | +- **Page des annonces** : https://quartiermosaique.com/unites-disponibles/ | |
| 13 | +- **Secteurs couverts** : Lebourgneuf (Galeries de la Capitale) — complexes Rubis, Saphir, Opale 1-2, Perle | |
| 14 | +- **Module** : `louka/connectors/quartier_mosaique.py` — classe `QuartierMosaiqueConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://quartiermosaique.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://quartiermosaique.com · https://quartiermosaique.com/contact/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 24 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Rubis – Loft | | |
| 33 | +| `address` | Adresse civique | 100 % | 2013, boulevard Lebourgneuf, Québec, G2K 0N8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Lebourgneuf | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Loft | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 058 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8294016 | | |
| 43 | +| `description` | Description | 100 % | Condos locatifs haut de gamme avec fenestration abondante, cuisine raffinée avec comptoir… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://quartiermosaique.com/app/uploads/2026/03/pdp-1-t3-1.webp | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"price_from": true, "building": "Rubis"} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://quartiermosaique.com/unites/rubis-loft/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 24 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 24 au total, **24 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync quartier_mosaique` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='quartier_mosaique' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/quartier_oree.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Quartier Orée — connecteur `quartier_oree` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Chaudière-Appalaches · Backend : direct · Annonces actives : 31/31 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Quartier Orée (quartieroree.com) Route Chassé, Sainte-Marie (Chaudière-Appalaches) — 4 immeubles locatifs neufs (Orée-A à Orée-D, 279 unités au total). Site WordPress + FacetWP : la page /plans-et-prix/ est rendue CÔTÉ SERVEUR et ne contient QUE les unités disponibles (les facettes FacetWP « disponibilite / loyer / batiment » ne servent qu'au filtrage client) : - carte `.unite` : n° d'unité, loyer mensuel, superficie, nombre de chambres, immeuble (Orée-A…D) et disponibilité (« Immédiate », « Juillet 2026 ») ; - lien « Plan de l'unité » (PDF) ; - lien « Demande d'info » portant les attributs structurés unite="Unité 101" et batiment="Orée-B". L'adresse civique de chaque immeuble est publiée sur la même page (`div.infos.OREE-B` -> « 485 Route Chassé, Ste-Marie-de-Beauce… »), et les commodités du projet sur l'accueil (`.box-icone`). ⚠ Cloudflare renvoie 403 aux robots sans en-tête de navigateur : le User-Agent de base.py (Chrome + LouKaBot) passe. robots.txt autorise /plans-et-prix/ (seuls /unite/* et /batiment/* sont interdits). | |
| 10 | + | |
| 11 | +- **Site** : https://quartieroree.com | |
| 12 | +- **Page des annonces** : https://quartieroree.com/plans-et-prix/ | |
| 13 | +- **Secteurs couverts** : Sainte-Marie (route Chassé — immeubles Orée-A à Orée-D) | |
| 14 | +- **Module** : `louka/connectors/quartier_oree.py` — classe `QuartierOreeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://quartieroree.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://quartieroree.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 31 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Quartier Orée B — Unité 101 | | |
| 33 | +| `address` | Adresse civique | 100 % | 485 Route Chassé, Ste-Marie-de-Beauce, Québec G6E 0R2 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sainte-Marie | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 555 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1152 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.4564677 | | |
| 43 | +| `description` | Description | 100 % | 2 chambres — 1 152 pi² — Orée-B | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://quartieroree.com/wp-content/uploads/2020/03/facebook-website.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Aire ouverte", "Insonorisation", "Salle de bain", "Cuisine avec ilot", "Balcon privé", … | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "ac": true, "elevator": true, "balc… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://quartieroree.com/plans-et-prix/#oree-b-101 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 31 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 31 au total, **31 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync quartier_oree` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='quartier_oree' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/quartier_plus.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Le Quartier Plus — connecteur `quartier_plus` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Chaudière-Appalaches · Backend : direct · Annonces actives : 59/59 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le Quartier Plus (lequartierplus.com — Thetford Mines, Chaudière-Appalaches). Complexe locatif 55+ autonome (aucun service de repas/soins : appartements standards, lofts urbains et unités bigénérationnelles) construit en 3 phases ; la page /plans-et-visites-virtuelles/ embarque un sélecteur d'étages WordPress (thème ubeo-theme-v5-child) dont TOUTES les unités sont rendues serveur : blocs `div.unit#unit_<n>` avec numéro, statut (« disponible », « Construction 2026 »…), type (3½/4½/4½+/5½), lettre de modèle, superficie du logement et du balcon, plan PNG/PDF. Seules les unités dont le statut contient « disponible » sont retenues. Aucun prix par unité (seul un « à partir de 1195 $ » global est cité en prose) -> price=None, rien d'inventé. L'adresse « 140, rue Kingsville » (phase 3) publiée sur la page n'est attachée qu'aux unités dont le statut mentionne « Construction 2026 ». external_id stable : numéro d'unité (unit_501 -> 501). robots.txt Yoast ouvert (Disallow vide), sitemap public. | |
| 10 | + | |
| 11 | +- **Site** : https://www.lequartierplus.com | |
| 12 | +- **Page des annonces** : https://www.lequartierplus.com/plans-et-visites-virtuelles/ | |
| 13 | +- **Secteurs couverts** : Thetford Mines (140-180 rue Kingsville) — complexe 55+ autonome, 3 phases ; phase 3 (59 unités « Construction 2026 ») en prélocation | |
| 14 | +- **Module** : `louka/connectors/quartier_plus.py` — classe `QuartierPlusConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.lequartierplus.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.lequartierplus.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 59 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Quartier Plus — Unité 501 (4½+) | | |
| 33 | +| `address` | Adresse civique | 100 % | 140, rue Kingsville, Thetford Mines | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Thetford Mines | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1097 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.1078511 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://www.lequartierplus.com/wp-content/themes/ubeo-theme-v5-child/images/… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Modèle L", "Balcon 128 pi²"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"balcony": true} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.lequartierplus.com/plans-et-visites-virtuelles/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 59 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 59 au total, **59 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 0 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +**Note du registre** : actif — prix par unité non publié (seul un « à partir de 1195 $ » global en prose) ; vocation 55+ sans services de soins (pas une RPA), à re-trancher selon la politique éditoriale | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync quartier_plus` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='quartier_plus' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/quartier_sila.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Quartier Sila — connecteur `quartier_sila` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 199/200 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Quartier Sila (silalevis.ca) Complexe de condos locatifs du Groupe Damco / Développement Beaubourg à Saint-Romuald (Lévis) — 4 phases (Guillaume-Couture, J.-B.-Demers, d'Anticosti), 3½ à 5½. Site WordPress/Elementor derrière Cloudflare ; la page « Condos locatifs Sila » embarque le module de plans interactifs Livya (app.livya.com, client « damco », projet « sila »). La page Next.js du module est rendue côté serveur : son flux RSC (self.__next_f.push) contient l'inventaire JSON complet — numéro d'unité, immeuble/étage, statut, loyer, pièces, superficie, adresse civique, GPS et plans. Les unités de la phase 4 (prélocation) n'ont pas encore de prix publié. 2 requêtes par sync : la page WordPress (id d'entité Livya + services et commodités + bannières de phases) + la page du module. | |
| 10 | + | |
| 11 | +- **Site** : https://silalevis.ca | |
| 12 | +- **Page des annonces** : https://silalevis.ca/condos-locatifs-sila/ | |
| 13 | +- **Secteurs couverts** : Lévis (St-Romuald) | |
| 14 | +- **Module** : `louka/connectors/quartier_sila.py` — classe `QuartierSilaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://silalevis.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://silalevis.ca · https://app.livya.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 199 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Quartier Sila — Sila 2, unité 703 (4½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 1415 Boulevard Guillaume-Couture, Lévis, G6W 0W9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Romuald | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 26 % | 1 908 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1044 | | |
| 41 | +| `availability_date` | Date de disponibilité | 7 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7371 | | |
| 43 | +| `description` | Description | 100 % | Étage 7 \| Phase 2 \| Modèle B-3 \| 2 chambre(s) \| 1 salle(s) de bain \| Balcon de 63 pi… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/94e3406e-0815-4e93-986f-70295… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["2 ascenseurs dans chaque phase", "Caméras de surveillance", "Entrée sécurisée", "1 stat… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true}, "elevator": true, "balcony": true, "gym": true, "stor… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://silalevis.ca/condos-locatifs-sila/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 199 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 200 au total, **199 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 26 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync quartier_sila` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='quartier_sila' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/realstar.md
+81 −0
@@ -0,0 +1,81 @@ | ||
| 1 | +# Realstar — connecteur `realstar` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 9/9 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Realstar (realstar.ca) Site protégé par Cloudflare (403 pour les robots) et rendu côté client (moteur RentCafe/Yardi) : tout passe par Firecrawl avec attente de rendu. 1) /searchlisting?province=Quebec -> cartes propriétés (nom, adresse, lits/sdb/pi², fourchette de prix, téléphone, vignette) ; 2) fiche de chaque propriété couverte (Grand Montréal, Gatineau, Sherbrooke) -> galerie photos, description, points forts ; 3) fiche /floorplans -> plans structurés (type, chambres, pi², prix, nombre d'unités disponibles) — disponibilité et prix réels. Une annonce par propriété (uid stables). Les pages détail passent par self.detail(...) (cache BD) : Firecrawl n'est rappelé que si la carte liste a changé. | |
| 10 | + | |
| 11 | +- **Site** : https://www.realstar.ca | |
| 12 | +- **Page des annonces** : https://www.realstar.ca/apartments/qc/montreal/excelsior-apartments | |
| 13 | +- **Secteurs couverts** : Côte-Saint-Luc, Brossard | |
| 14 | +- **Module** : `louka/connectors/realstar.py` — classe `RealstarConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://www.realstar.ca/searchlisting?province=Quebec | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.realstar.ca/searchlisting?province=Quebec | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 9 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Bourg Du Village | | |
| 33 | +| `address` | Adresse civique | 100 % | 25 Place Casavant, Sainte Therese, QC J7E 5X1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sainte-Thérèse | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 11 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 750 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 2 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 918 | | |
| 41 | +| `availability_date` | Date de disponibilité | 89 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.634686 | | |
| 43 | +| `description` | Description | 100 % | Le site Bourg Du Village de Realstar se situe dans la petite ville de Sainte-Thérèse. Que… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 25 photo(s) — https://resource.rentcafe.com/image/upload//q_auto,f_auto,w_600,h_400,c_lfi… | | |
| 45 | +| `amenities` | Commodités (JSON) | 78 % | ["Laveuse-sécheuse incluse", "Stationnement Intérieur", "Stationnement extérieur", "Balco… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"washer_dryer": true}, "elevator": true, "balcony": true, "pool": true, "… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.realstar.ca/apartments/qc/sainte-therese/bourg-du-village | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:20 — 9 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 9 au total, **9 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 1 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-15 21:53 | 502 Server Error: Bad Gateway for url: https://api.firecrawl.dev/v1/scrape | | |
| 68 | + | |
| 69 | +Rejouer la source seule : `python3 run.py sync realstar` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='realstar' ORDER BY ts DESC LIMIT 5;`). | |
| 70 | + | |
| 71 | +## Licence, attribution & conditions | |
| 72 | + | |
| 73 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 74 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 75 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 76 | +- Retrait sur demande : contact@spboucher.ai. | |
| 77 | + | |
| 78 | +## Historique | |
| 79 | + | |
| 80 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 81 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/remax_quebec.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# RE/MAX Québec (location) — connecteur `remax_quebec` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 3239/3373 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +RE/MAX Québec (remax-quebec.com) — LOCATIONS Le site interroge un index Meilisearch public (search-only key exposée dans la config de la page). L'index « inscriptions » couvre toute la province et mélange ventes et locations : on ne garde QUE les slugs « -a-louer » / « -for-rent » (et on écarte les Loué/Vendu que l'index conserve). Meilisearch plafonne à 1000 hits par requête (maxTotalHits) : on shard donc par région de tri d'acheminement postale (FSA, 3 premiers caractères) et on dédoublonne par numéro d'inscription. Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://www.remax-quebec.com | |
| 12 | +- **Page des annonces** : https://www.remax-quebec.com/fr/proprietes | |
| 13 | +- **Secteurs couverts** : Province entière — index Meilisearch public shardé par RTA (G/H/J), slugs « -a-louer » seulement | |
| 14 | +- **Module** : `louka/connectors/remax_quebec.py` — classe `RemaxQuebecConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.remax-quebec.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://search.remax-quebec.com/indexes/inscriptions/search · https://www.remax-quebec.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.15 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3239 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 12 Rue des Pommiers | | |
| 33 | +| `address` | Adresse civique | 100 % | 12 Rue des Pommiers | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Château-Richer | | |
| 35 | +| `sector` | Secteur / quartier | 86 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Maison | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 950 $ | | |
| 38 | +| `bedrooms` | Chambres | 97 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 53 % | 884 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.963065 | | |
| 43 | +| `description` | Description | 90 % | Magnifique propriété récente louée entièrement meublée et équipée. Luminosité exceptionne… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 24 photo(s) — https://media.remax-quebec.com/img/www_full/0194/m22369195-pri01-01.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "balcony": true, "storage": true, "pets": "non", "smoking": false, "furnishe… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.remax-quebec.com/fr/proprietes/maison-a-louer-region-de-quebec/12-rue-des-pom… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:23 — 3231 trouvées, +10 / ~2 / -18 | |
| 53 | +- **Throttling** : 0.15 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3373 au total, **3239 actives** | |
| 59 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 90 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 57, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync remax_quebec` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='remax_quebec' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.15 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/rentals_ca.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Rentals.ca (Québec) — connecteur `rentals_ca` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : Scrapfly · Annonces actives : 3452/3452 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Rentals.ca — portail locatif national, filtré PROVINCE DE QUÉBEC. Même plateforme GraphQL que Louer.ca (mêmes City.id, mutation acquireAuthInfo, clé publique `rentalsGqlKey` de window.appconf), mais l'inventaire de marque est un peu plus large (~+15 % vérifié sur Québec : 78 annonces contre 67 côté Louer.ca) — les doublons inter-marques sont résorbés par la dédup (rentals_ca est dans la liste PORTALS). ⚠️ rentals.ca est derrière Cloudflare (« Just a moment… ») : chaque appel GraphQL est REJOUÉ via Scrapfly ASP SANS rendu JS (POST JSON, coût minime par rapport à un render_js). Pour contenir le budget Scrapfly : - villes limitées (LOUKA_RENTALSCA_CITIES) et plafond par ville ; - pages de 200 annonces (1 à 4 requêtes liste par ville) ; - détails PAR LOTS de 40 via nodes(ids:[…]) — 1 requête pour 40 fiches — avec cache TTL : seuls les lots nouveaux/périmés sont re-téléchargés. Régime de croisière : ~25-40 appels Scrapfly par synchronisation. ⚠️ CGU Rentals.ca : extraction interdite sans accord écrit (même réserve que louer_ca). | |
| 10 | + | |
| 11 | +- **Site** : https://rentals.ca | |
| 12 | +- **Page des annonces** : https://rentals.ca/quebec-city | |
| 13 | +- **Secteurs couverts** : Grandes villes QC — même plateforme GraphQL que Louer.ca mais inventaire de marque ~15 % plus large ; accès via Scrapfly ASP (Cloudflare), volumes plafonnés par ville | |
| 14 | +- **Module** : `louka/connectors/rentals_ca.py` — classe `RentalsCaConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API GraphQL interne | |
| 19 | +- **Endpoint de base** : https://rentals.ca/ | |
| 20 | +- **URLs de départ (constantes du module)** : https://rentals.ca/ · https://rentals.ca/graphql · https://rentals.ca | |
| 21 | +- **Authentification** : aucune — contenu public (clé Scrapfly côté Lou-Ka) | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : Scrapfly (asp + render_js — contournement anti-bot) | |
| 24 | +- **Politesse** : 0.3 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (Scrapfly, API GraphQL interne) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 3452 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1225 Saint Marc Street | | |
| 33 | +| `address` | Adresse civique | 86 % | 1225 Saint Marc Street | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 12 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 450 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 71 % | 400 | | |
| 41 | +| `availability_date` | Date de disponibilité | 84 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.492189 | | |
| 43 | +| `description` | Description | 86 % | Le Marco Situé au 1225, rue Saint Marc, à proximité du métro Guy-Concordia, ce quartier o… | | |
| 44 | +| `images` | Photos (JSON) | 86 % | 12 photo(s) — https://images.rentals.ca/property-pictures/large/montreal-qc/809380/apartm… | | |
| 45 | +| `amenities` | Commodités (JSON) | 92 % | ["Cuisinière", "Non-fumeur", "Balcon", "Réfrigérateur", "Électricité incluse", "Chauffage… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "appliances": {"fridge": true, "st… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://rentals.ca/montreal/le-marco-1225-st-marc-st | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : — | |
| 52 | +- **Dernier passage OK** : 2026-08-18 03:14 — 3452 trouvées, +3452 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.3 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 3452 au total, **3452 actives** | |
| 59 | +- **Première ingestion** : 2026-08-18 · **Dernière observation** : 2026-08-18 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 86 % · description 86 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 1, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync rentals_ca` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='rentals_ca' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.3 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-18 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/rentalys.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Rentalys — connecteur `rentalys` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 10/10 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Rentalys (location.rentalys.ca) Agence de location du Grand Montréal (Verdun, Villeray, Rosemont, Saint-Michel, Longueuil...). Site WordPress (thème Houzez) rendu serveur : archives /property/page/N/ = cartes complètes (prix, adresse, étiquettes de disponibilité), pages /property/<slug>/ = photos, détails, description bilingue, superficie structurée (.h-area) et coordonnées lat/lng (variable JS houzez_single_property_map). Les fiches passent par self.detail(...) (cache BD) : re-téléchargées seulement si la carte change. | |
| 10 | + | |
| 11 | +- **Site** : https://www.rentalys.ca | |
| 12 | +- **Page des annonces** : https://location.rentalys.ca/ | |
| 13 | +- **Secteurs couverts** : Grande région de Montréal | |
| 14 | +- **Module** : `louka/connectors/rentalys.py` — classe `RentalysConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://location.rentalys.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://location.rentalys.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 10 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | VERDUN – 4 1/2 dans bâtisse récente | | |
| 33 | +| `address` | Adresse civique | 100 % | 200 Rue Egan, Verdun, QC | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 80 % | Verdun | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 177 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 80 % | 790 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.45175800000001 | | |
| 43 | +| `description` | Description | 100 % | Superbe 4 1/2 situé dans un immeuble de construction récente , au cœur du quartier recher… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 16 photo(s) — https://location.rentalys.ca/wp-content/uploads/2026/04/WhatsApp-Image-2026… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Non meublé", "1 salle(s) de bain", "790 pi²"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true}, "appliances": {"fridge": true, "stove": true, "dishwash… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://location.rentalys.ca/property/verdun-4-1-2-dans-batisse-recente-2/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:23 — 10 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 10 au total, **10 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync rentalys` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='rentalys' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/rivero.md
+89 −0
@@ -0,0 +1,89 @@ | ||
| 1 | +# Le Rivero — connecteur `rivero` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : désactivé (disabled=True)** · Région : Québec · Backend : direct · Annonces actives : 0/214 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le Rivero (lerivero.ca — Québec, rue Bourdages, aux abords de la rivière Saint-Charles). Le sélecteur de plans est un embed RealVuu (app.realvuu.com) dont la page contient toutes les unités en JSON (numéro, pièces, prix, disponibilité, plans/images). Phase 1 louée; phase 2 (livraison été 2028) en prélocation. Garde-fou : si toutes les unités « disponibles » affichent un prix identique (placeholder), le prix n'est pas retenu. DÉSACTIVÉ 2026-08-18 : app.realvuu.com hors-ligne depuis le 2026-08-10 (DNS NXDOMAIN). Réactiver (disabled=False) si le widget RealVuu revit. | |
| 10 | + | |
| 11 | +- **Site** : https://www.lerivero.ca | |
| 12 | +- **Page des annonces** : https://www.lerivero.ca | |
| 13 | +- **Secteurs couverts** : Québec (rivière St-Charles) | |
| 14 | +- **Module** : `louka/connectors/rivero.py` — classe `RiveroConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://app.realvuu.com/fr/external/immeubles-simard/rivero/plans | |
| 20 | +- **URLs de départ (constantes du module)** : https://app.realvuu.com/fr/external/immeubles-simard/rivero/plans · https://www.lerivero.ca/plans/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 0 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | — | Le Rivero — Unité 704 (4½) | | |
| 33 | +| `address` | Adresse civique | — | 524 Rue Bourdages, Québec, QC G1M 1A1 | | |
| 34 | +| `city` | Ville (normalisée) | — | Québec | | |
| 35 | +| `sector` | Secteur / quartier | — | Vanier (rivière Saint-Charles) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | — | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | — | — | | |
| 38 | +| `bedrooms` | Chambres | — | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | — | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | — | 1216 | | |
| 41 | +| `availability_date` | Date de disponibilité | — | — | | |
| 42 | +| `lat` | GPS (lat/lng) | — | 46.818726 | | |
| 43 | +| `description` | Description | — | 1216 pi² \| 2 chambre(s) \| 1 espace(s) bureau \| 1 salle(s) de bain \| Balcon/loggia 401… | | |
| 44 | +| `images` | Photos (JSON) | — | 2 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/c5a83cc0-b584-40a8-a0d2-e68a2… | | |
| 45 | +| `amenities` | Commodités (JSON) | — | ["Eau chaude incluse", "Électricité et chauffage", "Air climatisé", "Internet inclus"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | — | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | — | https://www.lerivero.ca/plans/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : — | |
| 52 | +- **Dernier passage OK** : aucun dans les 60 derniers runs | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 214 au total, **0 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-10 | |
| 60 | +- **Complétude clé (actives)** : GPS — · prix — · photos — · description — | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 60 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-17 23:23 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/immeubles-simard/rivero/plans (Caused by NameResolutionError… | | |
| 68 | +| 2026-08-17 20:00 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/immeubles-simard/rivero/plans (Caused by NameResolutionError… | | |
| 69 | +| 2026-08-17 16:30 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/immeubles-simard/rivero/plans (Caused by NameResolutionError… | | |
| 70 | +| 2026-08-17 12:39 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/immeubles-simard/rivero/plans (Caused by NameResolutionError… | | |
| 71 | +| 2026-08-17 09:02 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/immeubles-simard/rivero/plans (Caused by NameResolutionError… | | |
| 72 | + | |
| 73 | +**Note du registre** : suspendu — widget RealVuu (app.realvuu.com) hors-ligne depuis 2026-08-10 (DNS NXDOMAIN) ; connecteur désactivé (disabled=True) et annonces archivées le 2026-08-18 | |
| 74 | + | |
| 75 | +Rejouer la source seule : `python3 run.py sync rivero` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='rivero' ORDER BY ts DESC LIMIT 5;`). | |
| 76 | + | |
| 77 | +## Licence, attribution & conditions | |
| 78 | + | |
| 79 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 80 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 81 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 82 | +- Retrait sur demande : contact@spboucher.ai. | |
| 83 | + | |
| 84 | +## Historique | |
| 85 | + | |
| 86 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 87 | +- 2026-08-10 — mention au registre : « …suspendu — widget RealVuu (app.realvuu.com) hors-ligne depuis 2026-08-10 (DNS NXDOMAIN) ; connecteur désactivé (disabled=True) et annonces archivées le 2026-08-18… » | |
| 88 | +- 2026-08-18 — mention au registre : « …2026-08-10 (DNS NXDOMAIN) ; connecteur désactivé (disabled=True) et annonces archivées le 2026-08-18… » | |
| 89 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/roomies.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Roomies.ca — connecteur `roomies` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 276/276 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Roomies.ca — chambres et colocation (segment que les gestionnaires ne couvrent pas). Site Laravel/Livewire server-rendered, robots.txt entièrement ouvert, aucun anti-bot (curl simple = 200). Découverte par les pages villes `/{ville}-qc?page=N` (les sitemaps `sitemap/rooms.xml` répondent 504 par intermittence — non fiables). Fiche `/rooms/<id>` : JSON-LD `Room` complet (offers.price mensuel, availabilityStarts, lat/lng, petsAllowed, chambres/SDB de l'appartement, PostalAddress, amenityFeature) + description intégrale dans un div `prose` + galerie Cloudinary. On ignore les profils de chercheurs de colocataires (/profiles) : seules les chambres offertes sont des annonces. | |
| 10 | + | |
| 11 | +- **Site** : https://www.roomies.ca | |
| 12 | +- **Page des annonces** : https://www.roomies.ca/montreal-qc | |
| 13 | +- **Secteurs couverts** : Grandes villes QC — chambres et colocation | |
| 14 | +- **Module** : `louka/connectors/roomies.py` — classe `RoomiesConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.roomies.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.roomies.ca · https://cloudinary.roomies.pics/image/upload/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 276 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Furnished room in an apartment | | |
| 33 | +| `address` | Adresse civique | 66 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Chambre | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 690 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 73 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 5 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 97 % | 2026-10-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4600610916329 | | |
| 43 | +| `description` | Description | 100 % | Cute, clean, bright and practical private room for a female at 690$ / month. It is 5 minu… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://cloudinary.roomies.pics/image/upload/c_fill,f_jpg,fl_lossy,g_auto,h… | | |
| 45 | +| `amenities` | Commodités (JSON) | 99 % | ["Furnished", "Internet access"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true, "internet": true}, "appliances": {"fr… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.roomies.ca/rooms/1024705 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 3.5 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:24 — 275 trouvées, +1 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 276 au total, **276 actives** | |
| 59 | +- **Première ingestion** : 2026-08-17 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 4, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync roomies` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='roomies' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-17 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/roussin.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immeubles Roussin — connecteur `roussin` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 36/36 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immeubles Roussin (immeublesroussin.com) Immeubles/projets résidentiels (L'Aromate, L'Allié, La Vigie, etc.) — une annonce par type d'unité et par immeuble, prix « à partir de ». Les pages commerciales (locaux, bureaux, entrepôts) sont exclues. Commodités : paires icône+texte Elementor (Gym, Eau chaude, Animaux acceptés (20lb et moins)…) ; contact : liens tel:/mailto: structurés. | |
| 10 | + | |
| 11 | +- **Site** : https://immeublesroussin.com | |
| 12 | +- **Page des annonces** : https://immeublesroussin.com | |
| 13 | +- **Secteurs couverts** : Sainte-Foy, Lévis, Beauport | |
| 14 | +- **Module** : `louka/connectors/roussin.py` — classe `RoussinConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublesroussin.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublesroussin.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 36 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | L'Aromate — Loft | | |
| 33 | +| `address` | Adresse civique | 100 % | 3700, CHEMIN STE-FOY, QUÉBEC, G1X 0G2 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 67 % | Ste-Foy | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Loft | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 200 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.763616 | | |
| 43 | +| `description` | Description | 100 % | En choisissant L'Aromate, vivez une expérience de location de condos à Ste-Foy unique. … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 15 photo(s) — https://immeublesroussin.com/wp-content/uploads/2024/01/les-immeubles-rouss… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Gym", "Eau chaude", "Terrasse sur le toit", "Stationnement intérieur", "Wifi inclus", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "ac": true, "balcony": true, "pool"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublesroussin.com/location-condo-appartement-quebec/aromate/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:24 — 36 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 36 au total, **36 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync roussin` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='roussin' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/royal_lepage.md
+80 −0
@@ -0,0 +1,80 @@ | ||
| 1 | +# Royal LePage (location) — connecteur `royal_lepage` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 952/1043 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Royal LePage (royallepage.ca) — LOCATIONS Québec Le portail rend ses résultats côté serveur. La recherche par ville est filtrable : /fr/search/homes/{page}/?search_str=...&prov_code=QC&city_name= ...&lat=..&lng=..&search_type=city + « transactionType=LEASE » (trouvé dans le formulaire caché du site) renvoie les propriétés À LOUER (46/page, prix « 1 850.00 $ /mois » sur la carte). Chaque recherche plafonne à ~1 250 résultats ; on SHARD par points d'ancrage répartis dans la province et on dédoublonne par numéro MLS (dans l'URL /.../mls{no}/). Aucune dépendance Firecrawl : requêtes directes. Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). La fiche détail (accessible en direct, ~0,7 s) fournit ce que la carte liste n'a pas : description (« Remarques »), superficie habitable et bureau — enrichissement plafonné (DETAIL_LIMIT/cycle) + cache BD, le parc se complète au fil des synchronisations. | |
| 10 | + | |
| 11 | +- **Site** : https://www.royallepage.ca | |
| 12 | +- **Page des annonces** : https://www.royallepage.ca/fr/qc/rentals/ | |
| 13 | +- **Secteurs couverts** : Province entière — recherche transactionType=LEASE shardée par 28 villes d'ancrage | |
| 14 | +- **Module** : `louka/connectors/royal_lepage.py` — classe `RoyalLepageConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.royallepage.ca/fr/search/homes | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.royallepage.ca/fr/search/homes · https://www.royallepage.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.4 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 952 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3117 1210 Rue Jeanne Mance | | |
| 33 | +| `address` | Adresse civique | 100 % | 3117 1210 Rue Jeanne Mance | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 64 % | Ville Marie | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 90 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 850 $ | | |
| 38 | +| `bedrooms` | Chambres | 90 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 93 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 6 % | 527 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.506426 | | |
| 43 | +| `description` | Description | 10 % | Superbe 1 chambre fermée au 31e étage du Maestria, avec balcon privé et vue panoramique s… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://rlp.jumplisting.com/photos/28/95/49/24/28954924_0_lg.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "hot_water": true, "internet": true}, "appliances": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.royallepage.ca/fr/property/quebec/montreal-ville-marie/3117-1210-rue-jeanne-m… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-18 01:56 — 948 trouvées, +1 / ~943 / -2 | |
| 53 | +- **Throttling** : 0.4 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `MAX_PAGES` = 30 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 1043 au total, **952 actives** | |
| 60 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-18 | |
| 61 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 10 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 58, dont 0 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 67 | + | |
| 68 | +Rejouer la source seule : `python3 run.py sync royal_lepage` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='royal_lepage' ORDER BY ts DESC LIMIT 5;`). | |
| 69 | + | |
| 70 | +## Licence, attribution & conditions | |
| 71 | + | |
| 72 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 73 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.4 s ; cache détail pour minimiser les requêtes. | |
| 74 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 75 | +- Retrait sur demande : contact@spboucher.ai. | |
| 76 | + | |
| 77 | +## Historique | |
| 78 | + | |
| 79 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 80 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/savouet.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Groupe Savouet — connecteur `savouet` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 15/17 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Groupe Savouet (savouet.ca) Gestionnaire-propriétaire de Sherbrooke (Fleurimont, Mont-Bellevue, Centre-ville, Rock-Forest, Lennoxville) + East Angus. Webflow CMS rendu serveur (même famille que copley.py) : page /logement, cartes `a[href^=/logements-a-louer/]` avec champs étiquetés `fs-cmsfilter-field` (prix, dimensions, secteur, atout/meublé, type) + bandeau `.rabais` (« Libre dès maintenant ! »). Fiches détail via self.detail() (cache BD) : blocs `.term-block-1` (étage, animaux, ameublement, stationnement, sdb, typologie), description `.w-richtext`, galerie `img.cover-image`. ATTENTION Webflow : les variantes conditionnelles `w-condition-invisible` (valeurs masquées côté client) doivent être exclues partout. | |
| 10 | + | |
| 11 | +- **Site** : https://www.savouet.ca | |
| 12 | +- **Page des annonces** : https://www.savouet.ca/logement | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont, Mont-Bellevue, Centre-ville, Rock-Forest, Lennoxville), East Angus | |
| 14 | +- **Module** : `louka/connectors/savouet.py` — classe `SavouetConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.savouet.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.savouet.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 15 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 170, rue Clémenceau Sherbrooke | | |
| 33 | +| `address` | Adresse civique | 100 % | 170, rue Clémenceau Sherbrooke | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 87 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 5½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 995 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 3 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 93 % | 45.4096542 | | |
| 43 | +| `description` | Description | 100 % | Appartement avec cachet. Avec 5 pièces, mais seulement 1 chambre fermée (possible de tran… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 22 photo(s) — https://cdn.prod.website-files.com/633455c4a258184ac67804cf/65f49dcc7ae7f69… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Appartement", "Non meublé", "Étage : Rez-de-chaussée", "Typologie : Duplex", "Entrée in… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"storage": true, "pets": "conditions", "furnished": false, "parking": {"available": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.savouet.ca/logements-a-louer/170-rue-clemenceau-sherbrooke | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:25 — 15 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 17 au total, **15 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 93 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync savouet` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='savouet' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/sdg.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# SDG Immobilier — connecteur `sdg` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 9/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur SDG Immobilier (sdgimmobilier.ca) Site WordPress (thème Houzez) : /appartements-a-louer/ liste des immeubles (fiches « immeuble »). Une annonce par immeuble (types d'unités affichés, pas de prix ni de disponibilités publiés). Galerie via data-images ; fiche : description, caractéristiques, bloc adresse structuré (adresse, arrondissement, code postal, ville), téléphone (lien tel:). Fiches derrière self.detail(...) (cache BD). | |
| 10 | + | |
| 11 | +- **Site** : https://www.sdgimmobilier.ca | |
| 12 | +- **Page des annonces** : https://www.sdgimmobilier.ca | |
| 13 | +- **Secteurs couverts** : Charlesbourg, Ste-Foy, Limoilou, Charny | |
| 14 | +- **Module** : `louka/connectors/sdg.py` — classe `SDGConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.sdgimmobilier.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.sdgimmobilier.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 9 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 5201-5203 Rue de la Ballade | | |
| 33 | +| `address` | Adresse civique | 100 % | 5201-5203 Rue de la Ballade, G6X 1Z1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Charny, Lévis | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 2½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 0 % | — | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 89 % | 46.7173494 | | |
| 43 | +| `description` | Description | 100 % | Immeuble propre et bien entretenu muni d’un intercom, situé secteur Charny, devant la Bou… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://www.sdgimmobilier.ca/wp-content/uploads/2023/05/5201-5203-Rue-de-la-… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Inclus un locker", "Plusieurs types d'unités: 2 ½, 3 ½, 4 ½ et 5 ½", "Stationnement inc… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"internet": true}, "storage": true, "parking": {"available": true, "inclu… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.sdgimmobilier.ca/immeuble/5201-5203-ballade/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:25 — 9 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **9 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 89 % · prix 0 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync sdg` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='sdg' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/sentinelle.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# La Sentinelle (Groupe Immobilier Brochu) — connecteur `sentinelle` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 10/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur La Sentinelle (lasentinellelevis.com) Immeuble de 144 condos locatifs au 7002, boul. Guillaume-Couture (Vieux-Lévis). La page /projet/ contient un TABLEAU structuré des unités (numéro, étage, superficie pi², type, prix, statut, lien fiche) : on ne visite que les fiches des unités « Disponible », via self.detail(...) (cache BD, clé = ligne du tableau) — la fiche apporte la date de disponibilité, la liste des commodités (ul.uk-list-disc), les photos et le plan. | |
| 10 | + | |
| 11 | +- **Site** : https://lasentinellelevis.com | |
| 12 | +- **Page des annonces** : https://lasentinellelevis.com | |
| 13 | +- **Secteurs couverts** : Vieux-Lévis | |
| 14 | +- **Module** : `louka/connectors/sentinelle.py` — classe `SentinelleConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://lasentinellelevis.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://lasentinellelevis.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 10 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | La Sentinelle — Unité 104 (4½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 7002, boul. Guillaume-Couture, Lévis, G6V 0C1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Vieux-Lévis | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 695 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1241 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7954431 | | |
| 43 | +| `description` | Description | 100 % | Étage 1 \| Superficie 1241 pi² \| Avec espace bureau | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://lasentinellelevis.com/wp-content/uploads/2022/04/C-2.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Stationnement intérieur inclus", "Ascenceur", "Eau chaude fournie", "Air climatisé", "Î… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true}, "ac": true, "elevator": true, "storage": true, "parki… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://lasentinellelevis.com/projet/etage-1/unite-104/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:25 — 10 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **10 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync sentinelle` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='sentinelle' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/sgiq.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# SGIQ (Société de gestion immobilière du Québec) — connecteur `sgiq` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 147/147 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur SGIQ — Société de Gestion Immobilière du Québec (gestionimmobilierequebec.com). Liste paginée /immeubles?page=N (rendu serveur) + fiches /fiche/<id> pour images, description, commodités (avec cache BD self.detail) + endpoint JSON getMarkers pour lat/lng. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionimmobilierequebec.com | |
| 12 | +- **Page des annonces** : https://gestionimmobilierequebec.com/immeubles | |
| 13 | +- **Secteurs couverts** : Limoilou, St-Sauveur, Ste-Foy, Sillery | |
| 14 | +- **Module** : `louka/connectors/sgiq.py` — classe `SGIQConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionimmobilierequebec.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionimmobilierequebec.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 147 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 751-C avenue Myrand, Québec | | |
| 33 | +| `address` | Adresse civique | 100 % | 751-C avenue Myrand | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 99 % | Sainte-Foy | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 948 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 99 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 95 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 99 % | 46.7910730641709 | | |
| 43 | +| `description` | Description | 100 % | POUR UNE VISITE 3D DU LOGEMENT : https://my.matterport.com/show/?m=uatsWDGf2eF 3 1/2 LUMI… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://gestionimmobilierequebec.com/mod/file/ImmeubleSliderFile/15825aee15e… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chauffé : Oui", "Éclairé : Non", "1 salle de bain", "1 chambre", "Chiens permis", "1 st… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "pets": "oui", "parking": {"availa… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionimmobilierequebec.com/fiche/908 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 147 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 147 au total, **147 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 99 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync sgiq` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='sgiq' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/shdm.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# SHDM — connecteur `shdm` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 2/21 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur SHDM — Société d'habitation et de développement de Montréal (shdm.org, logements abordables à Montréal). Front Nuxt 3 + WordPress GraphQL : la page /fr/logements-disponibles embarque les logements disponibles dans le payload __NUXT_DATA__ (format « devalue » : tableau plat où les valeurs sont des index). | |
| 10 | + | |
| 11 | +- **Site** : https://www.shdm.org | |
| 12 | +- **Page des annonces** : https://www.shdm.org/fr/logements-abordables/louer-un-appartement | |
| 13 | +- **Secteurs couverts** : Île de Montréal (abordable) | |
| 14 | +- **Module** : `louka/connectors/shdm.py` — classe `SHDMConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API GraphQL interne | |
| 19 | +- **Endpoint de base** : https://www.shdm.org | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.shdm.org | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API GraphQL interne) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 2 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 2245-2249, rue De Champlain — app. 2249 | | |
| 33 | +| `address` | Adresse civique | 100 % | 2245-2249, De Champlain | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Ville-Marie | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 595 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 50 % | 45.5212722 | | |
| 43 | +| `description` | Description | 100 % | Triple x neuf idéalement situé dans l’arrondissement Ville-Marie , à deux pas du parc Laf… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 7 photo(s) — https://www.shdm.org/app/uploads/2026/06/champlain_immeuble1.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Balcon", "2 chambres", "Clientèle : Pour tous"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"ac": true, "balcony": true, "floor": 1} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.shdm.org/fr/logements-disponibles#50429-2249-3 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 2 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 21 au total, **2 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 50 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync shdm` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='shdm' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/siagi.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# SIA Gestion Immobilière — connecteur `siagi` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 6/6 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur SIA Gestion Immobilière (siagi.ca) ~240 logements en gestion — Estrie (Sherbrooke) + Grand Montréal (Laval, La Prairie). Site Next.js (App Router) : la page /listings est rendue serveur et son flux RSC (self.__next_f.push) embarque le tableau JSON "listings" — id (cuid stable), title « Ville · App. N », subtitle (adresse civique), rentLabel (« 1 200,00 $ / mois ») et mapEmbedUrl Google Maps (adresse complète avec code postal). Une seule requête par sync ; aucun rendu JavaScript nécessaire (patron louis14/somex). Les annonces n'ont pas de page propre ni de photo/type/disponibilité publiés — champs laissés vides, rien d'inventé. | |
| 10 | + | |
| 11 | +- **Site** : https://www.siagi.ca | |
| 12 | +- **Page des annonces** : https://www.siagi.ca/listings | |
| 13 | +- **Secteurs couverts** : Sherbrooke — aussi Laval et La Prairie (Grand Montréal) | |
| 14 | +- **Module** : `louka/connectors/siagi.py` — classe `SiagiConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.siagi.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.siagi.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 6 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Laval · App. 12 | | |
| 33 | +| `address` | Adresse civique | 100 % | 2645 Bd des Oiseaux, H7L 5Z1 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Laval | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 850 $ | | |
| 38 | +| `bedrooms` | Chambres | 0 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5865116 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 0 % | — | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 0 % | {} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.siagi.ca/listings | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 6 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 6 au total, **6 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 0 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync siagi` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='siagi' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/sibelanger.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Société immobilière Bélanger — connecteur `sibelanger` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 12/19 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Société immobilière Bélanger (sibelanger.com) — page /appartements-a-louer/ : cartes d'unités avec prix, « Disponible dès… », secteur, commodités et carrousel de photos. Pages détail (cache BD self.detail) : adresse complète avec code postal, superficie (« Plan de l'unité … pi2 »), description riche, commodités de l'appartement et de l'immeuble, galerie complète. | |
| 10 | + | |
| 11 | +- **Site** : https://sibelanger.com | |
| 12 | +- **Page des annonces** : https://sibelanger.com | |
| 13 | +- **Secteurs couverts** : Québec + Lévis | |
| 14 | +- **Module** : `louka/connectors/sibelanger.py` — classe `SibelangerConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://sibelanger.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://sibelanger.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 12 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Chamonix - Unité 197 | | |
| 33 | +| `address` | Adresse civique | 100 % | 1175, rue de Chamonix, Québec (QC) G1H 6M3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Charlesbourg | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Maison | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 595 $ | | |
| 38 | +| `bedrooms` | Chambres | 92 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 17 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 42 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 83 % | 46.8673632 | | |
| 43 | +| `description` | Description | 100 % | Grand projet locatif de maisons de ville dans Charlesbourg. Complexe de maisons en rangée… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 21 photo(s) — https://sibelanger.com/app/uploads/2026/05/copie-de-1175-197-chamonix-photo… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Non meublé", "Entrée laveuse-sécheuse", "Entrée lave-vaisselle", "Balcon", "Chauffé", "… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true}, "appliances": {"washer_dryer_hookup": true, "dishwasher… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://sibelanger.com/appartements-a-louer/1175-197-chamonix-selection-197/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 12 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 19 au total, **12 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 83 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync sibelanger` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='sibelanger' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/sig.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Société d'investissement Gilbert (résidences étudiantes) — connecteur `sig` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Société d'investissement Gilbert (immo-sig.ca) Résidences étudiantes en colocation à Québec (Université Laval, Cégep Sainte-Foy) : Le Sommet, Le Pavillon, La FAC, L'UNI. La page /residences-etudiantes/ (Elementor, rendue serveur) affiche pour chaque résidence le prix « à partir de » par chambre, l'adresse et une photo. Granularité = résidence (aucune unité détaillée publiée). Les fiches détaillées vivent sur residences-etudiantes.com, protégé par une vérification anti-bot reCAPTCHA -> immo-sig.ca est la source primaire ; le lien « DÉCOUVRIR » sert d'URL d'annonce pour l'utilisateur. | |
| 10 | + | |
| 11 | +- **Site** : https://immo-sig.ca | |
| 12 | +- **Page des annonces** : https://immo-sig.ca/residences-etudiantes/ | |
| 13 | +- **Secteurs couverts** : Sainte-Foy, chemin Sainte-Foy (Université Laval, Cégep Sainte-Foy) | |
| 14 | +- **Module** : `louka/connectors/sig.py` — classe `SigConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immo-sig.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://immo-sig.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le SOMMET — Colocation étudiante | | |
| 33 | +| `address` | Adresse civique | 100 % | 2333 Chapdelaine | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Chambre | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 650 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 75 % | 46.7871325 | | |
| 43 | +| `description` | Description | 100 % | Colocation étudiante — Unités de 3 chambres à partir de 650$/mois — Fiche détaillée : htt… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://immo-sig.ca/wp-content/uploads/2022/08/Résidences_SIG_1-modelisatio… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Colocation étudiante", "Unités de 3 chambres"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"price_from": true, "residence": "Le SOMMET"} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://residences-etudiantes.com/espaces/le-sommet/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 75 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync sig` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='sig' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/simard.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Immeubles Simard — connecteur `simard` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 5/5 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Immeubles Simard (immeublessimard.com) Section « À louer » — catégorie appartement uniquement (les bureaux, commerces et laboratoires sont exclus d'office). Pages détail (cache BD self.detail) : bloc specs étiqueté (#infos : pièces, prix, superficie, disponibilité), « Caractéristiques et inclusions », description, images. | |
| 10 | + | |
| 11 | +- **Site** : https://immeublessimard.com | |
| 12 | +- **Page des annonces** : https://immeublessimard.com/a-louer/categorie/appartement | |
| 13 | +- **Secteurs couverts** : Québec (Grande Allée, centre-ville) | |
| 14 | +- **Module** : `louka/connectors/simard.py` — classe `SimardConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://immeublessimard.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://immeublessimard.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 5 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Arboris – Grande Allée Ouest | | |
| 33 | +| `address` | Adresse civique | 20 % | — | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Montcalm | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 60 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 40 % | — | | |
| 38 | +| `bedrooms` | Chambres | 60 % | — | | |
| 39 | +| `bathrooms` | Salles de bain | 20 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 20 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 80 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 20 % | — | | |
| 43 | +| `description` | Description | 100 % | Nouveau projet de condos locatifs. Situé dans le quartier Montcalm, le projet offre un mi… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 9 photo(s) — https://immeublessimard.com/wp-content/uploads/2026/07/2516_M-1_Immeubles-Si… | | |
| 45 | +| `amenities` | Commodités (JSON) | 60 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"contact": {"phone": "418-527-7700", "email": "arboris@immeublessimard.com"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://immeublessimard.com/a-louer/appartement/montcalm/arboris-grande-allee-ouest/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 1.9 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 5 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 5 au total, **5 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 20 % · prix 40 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync simard` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='simard' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/somex_saintnicolas.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Somex Saint-Nicolas — connecteur `somex_saintnicolas` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 145/145 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Somex Saint-Nicolas (somexsaintnicolas.com, Groupe Mahlex / OÏKOS Construction) — 407 unités à terme au 710, Route des Rivières, Saint-Nicolas (Lévis). Site WordPress/Elementor ; la page « Plans » embarque le module de plans interactifs Livya (app.livya.com, client « hulix », projet « somex »). La page Next.js du module est rendue côté serveur : son flux RSC (self.__next_f.push) contient l'inventaire JSON complet — numéro d'unité, étage, statut, loyer, pièces, superficie, balcon, adresse, GPS et plans. 2 requêtes par sync : la page WordPress (découverte de l'id d'entité Livya) + la page du module. Aucun rendu JavaScript nécessaire. | |
| 10 | + | |
| 11 | +- **Site** : https://www.somexsaintnicolas.com | |
| 12 | +- **Page des annonces** : https://www.somexsaintnicolas.com/plans/ | |
| 13 | +- **Secteurs couverts** : Lévis (Saint-Nicolas) | |
| 14 | +- **Module** : `louka/connectors/somex_saintnicolas.py` — classe `SomexSaintNicolasConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.somexsaintnicolas.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.somexsaintnicolas.com · https://app.livya.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 145 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Somex Saint-Nicolas — unité 934 (3½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 710 Route des Rivières, Saint-Nicolas, G7A 2T6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Saint-Nicolas | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 035 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1078 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.7331 | | |
| 43 | +| `description` | Description | 100 % | Étage 9 \| Modèle W \| 1 chambre(s) \| 1 salle(s) de bain \| Espace bureau \| Balcon de 8… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/7cc89eed-f080-4dc9-8bb9-f14f9… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Eau chaude incluse", "Électroménagers en inox", "Éclairage inclus", "Accès internet inc… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "appliances": {"fridge": true}, "ac… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.somexsaintnicolas.com/plans/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 145 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 145 au total, **145 actives** | |
| 59 | +- **Première ingestion** : 2026-08-08 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync somex_saintnicolas` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='somex_saintnicolas' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-08 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/souleymane.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestion Souleymane — connecteur `souleymane` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 13/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Souleymane (gestionsouleymane.com) Gestionnaire local de Gatineau (secteurs est : Masson-Angers, Buckingham, + Hull/Aylmer). WordPress + plugin immobilier ESTATIK : la page /a-louer liste toutes les annonces (« 14 results », pas de pagination), chaque carte `div.js-es-listing` portant data-post-id (external_id stable), l'adresse civique en titre, le prix, chambres/salles de bain et la galerie du carrousel (data-lazy). La fiche /property/<slug> (cache BD) ajoute la description longue rédigée par l'agence — qui contient « 📅 Disponible immédiatement », « secteur Masson-Angers », inclusions — exploitée pour availability et le secteur, le reste par textmine. | |
| 10 | + | |
| 11 | +- **Site** : https://gestionsouleymane.com | |
| 12 | +- **Page des annonces** : https://gestionsouleymane.com/a-louer | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer, Masson-Angers, Buckingham, Plateau) | |
| 14 | +- **Module** : `louka/connectors/souleymane.py` — classe `SouleymaneConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://gestionsouleymane.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://gestionsouleymane.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 1.0 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 13 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 327 Rue des Bouleaux, Gatineau, QC J8M 2B8 | | |
| 33 | +| `address` | Adresse civique | 100 % | 327 Rue des Bouleaux, Gatineau, QC J8M 2B8 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 62 % | Masson-Angers | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 77 % | Maison | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 700 $ | | |
| 38 | +| `bedrooms` | Chambres | 92 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 69 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 8 % | 86 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 92 % | 45.556441 | | |
| 43 | +| `description` | Description | 100 % | MAISON 2 CHAMBRES À LOUER À MASSON-ANGERS – COUR PRIVÉE SANS VOISIN ARRIÈRE 📍 327, rue de… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://gestionsouleymane.com/wp-content/uploads/2026/08/DSC09357-HDR.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "internet": true}, "appliances": {"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://gestionsouleymane.com/property/belle-maison-2-chambres-a-louer-a-masson-angers | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 13 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 1.0 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **13 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 92 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync souleymane` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='souleymane' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 1.0 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/stb_immobilier.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# STB Immobilier — connecteur `stb_immobilier` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Bas-Saint-Laurent · Backend : direct · Annonces actives : 11/11 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur STB Immobilier (stbimmobilier.com) Gestionnaire de Matane (Bas-Saint-Laurent) : ~11 immeubles/projets à Matane et Saint-Ulric (rue Fournier, Boisé St-Rédempteur, rue Marquis, maisons de ville…). WordPress + Elementor, tout rendu serveur. Liste /locations-residentielles/ : cartes `e-loop-item` par IMMEUBLE (granularité immeuble — le site ne publie pas d'unités individuelles) : nombre de logements/maisons, adresse civique avec ville, nom, « Unités en location » (typologies réelles « 4 X 4 ½, 6 X 5 ½ »), « À partir de X $/mois » et parfois « Date de disponibilité ». Fiche /location/<slug>/ (via cache BD) : type de location, services associés/à proximité, photos. robots.txt ouvert, sitemap Yoast. | |
| 10 | + | |
| 11 | +- **Site** : https://stbimmobilier.com | |
| 12 | +- **Page des annonces** : https://stbimmobilier.com/locations-residentielles/ | |
| 13 | +- **Secteurs couverts** : Matane (rue Fournier, Boisé St-Rédempteur/rue Léa-Desrosiers, rue Marquis, rue Bergeron, avenue d'Amours) + Saint-Ulric — granularité immeuble, maisons de ville incluses | |
| 14 | +- **Module** : `louka/connectors/stb_immobilier.py` — classe `STBImmobilierConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://stbimmobilier.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://stbimmobilier.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 11 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Rue Fournier — 355 rue Fournier, Matane | | |
| 33 | +| `address` | Adresse civique | 100 % | 355 rue Fournier, Matane | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Matane | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 64 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 73 % | — | | |
| 38 | +| `bedrooms` | Chambres | 64 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 9 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 27 % | 2027-07-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 91 % | 48.8446173 | | |
| 43 | +| `description` | Description | 73 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 13 photo(s) — https://stbimmobilier.com/wp-content/uploads/2026/01/IMG_7541-1_opt-768x102… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Immeuble de 18 logements", "Unités en location : 6 X 4 ½, 18 X 4 ½ (Phase 2), 6 X 4 ½ (… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"parking": {"available": true, "type": "intérieur"}} | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://stbimmobilier.com/location/rue-fournier/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 11 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 11 au total, **11 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 91 % · prix 73 % · photos 100 % · description 73 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync stb_immobilier` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='stb_immobilier' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/summum.md
+85 −0
@@ -0,0 +1,85 @@ | ||
| 1 | +# Gestion immobilière Summum — connecteur `summum` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Laurentides · Backend : direct · Annonces actives : 89/95 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion immobilière Summum (location.summumpm.com) — portail hébergé Building Stack (même famille que le portail edifialocation.com du connecteur edifia.py) : Saint-Jérôme, Blainville, Montréal, Laval, Longueuil, Granby… - /Listing/Listings embarque `var units = [...]` : JSON complet des unités affichées (ApartmentId stable, prix, pi², chambres, salles de bain, adresse complète avec GPS, contact de location, photo) ; - les pages immeuble /b/<id> donnent la date de disponibilité par unité et les commodités de l'immeuble (une requête par immeuble, en cache via self.detail, plafonnée). Portail SaaS standard, pas de robots.txt (tout permis). | |
| 10 | + | |
| 11 | +- **Site** : https://location.summumpm.com | |
| 12 | +- **Page des annonces** : https://location.summumpm.com/Listing/Listings | |
| 13 | +- **Secteurs couverts** : Saint-Jérôme, Blainville, Saint-Calixte, Laval, Montréal, Lachine, Longueuil, Granby | |
| 14 | +- **Module** : `louka/connectors/summum.py` — classe `SummumConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://location.summumpm.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://location.summumpm.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 89 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 2560 Rachel — Unité 2 | | |
| 33 | +| `address` | Adresse civique | 100 % | 2560 Rue Rachel Est, Montréal, QC H2H 1S4, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 970 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 16 % | 200 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.537562 | | |
| 43 | +| `description` | Description | 84 % | 200 pi² — 1 salle(s) de bain | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 3 photo(s) — https://wfiles.buildingstack.com/resources/image/Lq9HKcvJEIyqj38QhBecAYYY9Yi… | | |
| 45 | +| `amenities` | Commodités (JSON) | 13 % | ["Arrêt de bus à proximité", "Station de métro à proximité", "Salle de buanderie"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"laundry": true, "bedrooms": 0, "bathrooms": 1, "contact": {"name": "Zachary Pilon", "ph… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://location.summumpm.com/b/202029066007004535622/287081 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:26 — 89 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 95 au total, **89 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 84 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 5 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-17 09:04 | HTTPSConnectionPool(host='location.summumpm.com', port=443): Read timed out. (read timeout=30) | | |
| 68 | +| 2026-08-17 03:03 | HTTPSConnectionPool(host='location.summumpm.com', port=443): Read timed out. (read timeout=30) | | |
| 69 | +| 2026-08-16 01:50 | HTTPSConnectionPool(host='location.summumpm.com', port=443): Read timed out. (read timeout=30) | | |
| 70 | +| 2026-08-15 13:44 | HTTPSConnectionPool(host='location.summumpm.com', port=443): Read timed out. (read timeout=30) | | |
| 71 | +| 2026-08-14 00:58 | HTTPSConnectionPool(host='location.summumpm.com', port=443): Read timed out. (read timeout=30) | | |
| 72 | + | |
| 73 | +Rejouer la source seule : `python3 run.py sync summum` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='summum' ORDER BY ts DESC LIMIT 5;`). | |
| 74 | + | |
| 75 | +## Licence, attribution & conditions | |
| 76 | + | |
| 77 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 78 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 79 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 80 | +- Retrait sur demande : contact@spboucher.ai. | |
| 81 | + | |
| 82 | +## Historique | |
| 83 | + | |
| 84 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 85 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/sutton.md
+80 −0
@@ -0,0 +1,80 @@ | ||
| 1 | +# Groupe Sutton Québec (location) — connecteur `sutton` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 1224/1392 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Groupe Sutton Québec (suttonquebec.com) — LOCATIONS Couverture exhaustive via le sitemap : l'index /sitemap.cfm pointe vers des sitemaps d'inscriptions paginés où chaque URL porte noInscription (numéro Centris) et typeInscription (1 = à vendre, 2 = À LOUER — on ne garde que les 2). Le slug donne type/adresse/ville approximatifs ; la fiche détail fournit le loyer (« 1 950 $ / mois »), la galerie immo.vrtx.co, la description, les pièces et l'adresse exacte (H1). Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://www.suttonquebec.com | |
| 12 | +- **Page des annonces** : https://www.suttonquebec.com/fr/proprietes-a-louer.html | |
| 13 | +- **Secteurs couverts** : Province entière — sitemap inscriptions, typeInscription=2 (locations) | |
| 14 | +- **Module** : `louka/connectors/sutton.py` — classe `SuttonConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.suttonquebec.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.suttonquebec.com · https://immo.vrtx.co/pic450/{key}.jpg | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 1224 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3762 Rue St-Dominique | | |
| 33 | +| `address` | Adresse civique | 100 % | 3762 Rue St-Dominique | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 54 % | Le Plateau-Mont-Royal | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 73 % | 1 950 $ | | |
| 38 | +| `bedrooms` | Chambres | 74 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 73 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 38 % | 828 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 70 % | — | | |
| 43 | +| `description` | Description | 72 % | Charmant et lumineux condo de 2 chambres idéalement situé au coeur du vibrant Plateau. Av… | | |
| 44 | +| `images` | Photos (JSON) | 73 % | 13 photo(s) — https://immo.vrtx.co/pic450/11476711.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 6 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true}, "appliances": {"fridge": true, "st… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.suttonquebec.com/fr/inscription/appartement-a-louer-3762-rue-st-dominique-mon… | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 1224 trouvées, +0 / ~16 / -29 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `SITEMAP_MAX_PAGES` = 40 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 1392 au total, **1224 actives** | |
| 60 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-17 | |
| 61 | +- **Complétude clé (actives)** : GPS 70 % · prix 73 % · photos 73 % · description 72 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 57, dont 0 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 67 | + | |
| 68 | +Rejouer la source seule : `python3 run.py sync sutton` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='sutton' ORDER BY ts DESC LIMIT 5;`). | |
| 69 | + | |
| 70 | +## Licence, attribution & conditions | |
| 71 | + | |
| 72 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 73 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 74 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 75 | +- Retrait sur demande : contact@spboucher.ai. | |
| 76 | + | |
| 77 | +## Historique | |
| 78 | + | |
| 79 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 80 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/terater.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Les Constructions Tèratèr — connecteur `terater` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 12/14 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Les Constructions Tèratèr (terater.ca) Constructeur-locateur de l'Estrie : Val-Joli/Windsor, Sherbrooke (Nord, Fleurimont, Seyval), Orford, Cookshire-Eaton. WordPress + thème enfant Avada avec blocs maison (même famille de balisage que morin.py) : archive /a-louer/ rendue serveur — cartes div.landing_modele_block_item complètes (bandeau de disponibilité coloré, type « 3 ½ », adresse, secteur/ville, chambres/salle de bain/étage/stationnement/animaux, prix « par mois »). La fiche (via self.detail, cache BD) ajoute la superficie, la liste des inclusions et la galerie photos. Les logements loués n'apparaissent pas dans l'archive (bandeau « Loué » absent au moment de l'écriture) mais on filtre par prudence. | |
| 10 | + | |
| 11 | +- **Site** : https://terater.ca | |
| 12 | +- **Page des annonces** : https://terater.ca/a-louer/ | |
| 13 | +- **Secteurs couverts** : Val-Joli/Windsor, Sherbrooke (Nord, Seyval, Fleurimont), Orford, Cookshire-Eaton | |
| 14 | +- **Module** : `louka/connectors/terater.py` — classe `TeraterConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://terater.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://terater.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.7 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 12 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 3 ½ Appartement — 550, rte 143 Sud, Val-Joli #3 | | |
| 33 | +| `address` | Adresse civique | 100 % | 550, rte 143 Sud, Val-Joli #3 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Val-Joli | | |
| 35 | +| `sector` | Secteur / quartier | 42 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 075 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 610 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 67 % | — | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 11 photo(s) — https://terater.ca/wp-content/uploads/2025/07/Facade_558Val-Joli.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chambres : 1", "Salle(s) de bain : 1", "Étage : 1 er", "Stationnement : 1", "Animaux ac… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true, "washer_dryer_hookup": true, "dishwasher_hookup": true}, … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://terater.ca/a-louer/3-et-demi-val-joli-550-3/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 12 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.7 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 14 au total, **12 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 67 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync terater` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='terater' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.7 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/terra.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Terra Condos locatifs — connecteur `terra` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 29/51 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur TERRA Condos locatifs (terracondolocatif.ca) Projet de 4 phases sur la route Mgr-Bourget (arrondissement Desjardins, Lévis). Site Webflow : chaque page de phase liste les unités par immeuble avec statut Disponible/Réservée/Louée (classes w-condition-invisible). Prix « à partir de » par type affichés en entête (3½+/4½+). | |
| 10 | + | |
| 11 | +- **Site** : https://www.terracondolocatif.ca | |
| 12 | +- **Page des annonces** : https://www.terracondolocatif.ca | |
| 13 | +- **Secteurs couverts** : Lévis (Desjardins) | |
| 14 | +- **Module** : `louka/connectors/terra.py` — classe `TerraConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.terracondolocatif.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.terracondolocatif.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 29 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | TERRA Phases 1-2 — Le 950, unité 104 (4½) | | |
| 33 | +| `address` | Adresse civique | 100 % | 950, route Mgr-Bourget, Lévis | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Desjardins (Lévis) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 90 % | 1 295 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1381 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8099418 | | |
| 43 | +| `description` | Description | 100 % | RDC \| 1381 pi² \| 2 chambre(s) \| Exposition S.E. \| Modèle 1i \| Fiche : https://cdn.pr… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 1 photo(s) — https://cdn.prod.website-files.com/5d955015f8b06dde81cf7224/5dab96b3d26b0a48… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chauffé et climatisé", "Eau chaude incluse", "Internet inclus", "Stationnement intérieu… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true, "internet": true}, "ac": true, "eleva… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.terracondolocatif.ca/phase-1-2 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 29 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 51 au total, **29 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 90 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync terra` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='terra' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/thrace.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Gestions Thrace — connecteur `thrace` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Mauricie · Backend : direct · Annonces actives : 172/182 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestions Thrace (gestionsthrace.com) Plus gros gestionnaire de la Mauricie (~2 500 logements — Trois-Rivières, Cap-de-la-Madeleine, Bécancour). Site WordPress (Bricks) ; la page /fr/residential embarque le module « inventory » Livya (app.livya.com, client « thrace »). Contrairement au module « plans » (somex, louis14, quartier_sila), le module inventory charge ses unités côté client via api.realvuu.com — dont le robots.txt interdit tout accès : on ne l'utilise PAS. À la place, les pages « plans » des trois projets Livya du client (thrace, radisson, carree-radisson — découverts via le sitemap public d'app.livya.com, robots permissif) sont rendues côté serveur : leur flux RSC (self.__next_f.push) contient l'inventaire JSON complet — unités ({"unitId": …} : statut, loyer, pièces, inclusions, adresse civique, GPS, photos) et immeubles ({"buildingId": …} : nom, slug). 5 requêtes par sync. Unités AVAILABLE, résidentielles et locatives seulement (prix réels). | |
| 10 | + | |
| 11 | +- **Site** : https://www.gestionsthrace.com | |
| 12 | +- **Page des annonces** : https://www.gestionsthrace.com/fr/residential | |
| 13 | +- **Secteurs couverts** : Trois-Rivières (Trois-Rivières-Ouest, Cap-de-la-Madeleine, Sainte-Marthe-du-Cap), Bécancour | |
| 14 | +- **Module** : `louka/connectors/thrace.py` — classe `ThraceConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : sitemap XML + pages HTML | |
| 19 | +- **Endpoint de base** : https://www.gestionsthrace.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.gestionsthrace.com · https://app.livya.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.8 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, sitemap XML + pages HTML) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 172 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Gestions Thrace (Le Radisson) — unité 304 | | |
| 33 | +| `address` | Adresse civique | 100 % | 675 Rue Bonaventure, Trois-Rivières, G9A 2B9 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Trois-Rivières | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 99 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 66 % | 1 695 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 95 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 41 % | 888 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.3449 | | |
| 43 | +| `description` | Description | 100 % | 3e étage \| Modèle B \| 2 chambre(s) \| 1 salle(s) de bain \| Promo -100$/mois* \| Plan :… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/d6e2aa7e-ccb0-41a5-b47b-e8ca6… | | |
| 45 | +| `amenities` | Commodités (JSON) | 59 % | ["Internet", "Eau chaude"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"hot_water": true, "internet": true}, "building": "Le Radisson", "floor":… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.gestionsthrace.com/fr/residential?building=le-radisson | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 172 trouvées, +0 / ~0 / -1 | |
| 53 | +- **Throttling** : 0.8 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 182 au total, **172 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 66 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync thrace` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='thrace' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.8 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/tri_logis.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Société immobilière Tri-Logis — connecteur `tri_logis` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Abitibi-Témiscamingue · Backend : direct · Annonces actives : 0/1 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Société immobilière Tri-Logis inc. (tri-logis.ca — Rouyn-Noranda, 600+ logements, référence n°1 en Abitibi-Témiscamingue). Site custom statique, tout rendu serveur. Liste /espaces-a-louer/logements : un bloc par immeuble (adresse, secteur, proximité) ; seules les unités disponibles y ont une rangée (type, texte de disponibilité, prix). Fiche unité /espaces-a-louer/immeuble/<imm>/<unité> (via cache BD) : adresse complète avec code postal, description (bloc « Apartment Features » : étage, inclusions, animaux…), galerie pleine taille, inclusions. Périmètre : logements résidentiels seulement — les pages /studios (meublés loués à la nuitée : « les prix des locations de moins de 31 nuitées… ») et /chalets (court terme) sont exclues. Pas de robots.txt (= tout permis). | |
| 10 | + | |
| 11 | +- **Site** : https://tri-logis.ca | |
| 12 | +- **Page des annonces** : https://tri-logis.ca/espaces-a-louer/logements | |
| 13 | +- **Secteurs couverts** : Rouyn-Noranda (Principale, Rouyn-Sud, Centre-Ville, Université, Marie-Victorin/Du Sourire, Évain) — studios à la nuitée et chalets exclus (court terme) | |
| 14 | +- **Module** : `louka/connectors/tri_logis.py` — classe `TriLogisConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://tri-logis.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://tri-logis.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 0 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | — | 992 avenue Larivière — 4 1/2 | | |
| 33 | +| `address` | Adresse civique | — | 992 Av. Larivière, Rouyn-Noranda, QC J9X 4K5 | | |
| 34 | +| `city` | Ville (normalisée) | — | Rouyn-Noranda | | |
| 35 | +| `sector` | Secteur / quartier | — | Principale | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | — | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | — | 1 160 $ | | |
| 38 | +| `bedrooms` | Chambres | — | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | — | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | — | — | | |
| 41 | +| `availability_date` | Date de disponibilité | — | now | | |
| 42 | +| `lat` | GPS (lat/lng) | — | 48.2249359 | | |
| 43 | +| `description` | Description | — | Address: 992-B_Lariviere Availability: NOW Price: $1160 per month Apartment Features Size… | | |
| 44 | +| `images` | Photos (JSON) | — | 8 photo(s) — https://www.tri-logis.ca/resources/images/logis/992-B_Lariviere_salon_b.jpeg | | |
| 45 | +| `amenities` | Commodités (JSON) | — | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | — | {"contact": {"phone": "819-762-3435", "email": "info@tri-logis.ca"}, "building": "992 ave… | | |
| 47 | +| `url` | URL de l'annonce source | — | https://www.tri-logis.ca/espaces-a-louer/immeuble/992-avenue-lariviere/992-b-lariviere | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 0 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 1 au total, **0 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-09 | |
| 60 | +- **Complétude clé (actives)** : GPS — · prix — · photos — · description — | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync tri_logis` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='tri_logis' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/trudel.md
+89 −0
@@ -0,0 +1,89 @@ | ||
| 1 | +# Trudel (Fleur de Lys, LGC) — connecteur `trudel` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : désactivé (disabled=True)** · Région : Québec · Backend : direct · Annonces actives : 0/30 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Trudel — Fleur de Lys condos locatifs (le21mars.ca / 18juillet.trudel.ca — 550, boul. Wilfrid-Hamel, Québec, secteur Vanier). Le sélecteur de plans du Vingt-et-un Mars est un embed RealVuu (client=trudel, project=fdl) dont la page contient toutes les unités en JSON (numéro, pièces, prix, disponibilité, plans/images). Le Dix-Huit Juillet n'affiche aucune unité (landing de contact seulement). DÉSACTIVÉ 2026-08-18 : app.realvuu.com hors-ligne depuis le 2026-08-10 (DNS NXDOMAIN). Réactiver (disabled=False) si le widget RealVuu revit. | |
| 10 | + | |
| 11 | +- **Site** : https://trudel.ca | |
| 12 | +- **Page des annonces** : https://18juillet.trudel.ca | |
| 13 | +- **Secteurs couverts** : Vanier/Fleur de Lys, Charlesbourg | |
| 14 | +- **Module** : `louka/connectors/trudel.py` — classe `TrudelConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://app.realvuu.com/fr/external/trudel/fdl/plans | |
| 20 | +- **URLs de départ (constantes du module)** : https://app.realvuu.com/fr/external/trudel/fdl/plans · https://www.le21mars.ca/plans/ | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 0 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | — | Fleur de Lys (21 mars) — Unité 1410 (4½) | | |
| 33 | +| `address` | Adresse civique | — | 550 Boulevard Wilfrid-Hamel, Québec G1M 2S6 | | |
| 34 | +| `city` | Ville (normalisée) | — | Québec | | |
| 35 | +| `sector` | Secteur / quartier | — | Vanier (Fleur de Lys) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | — | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | — | 2 395 $ | | |
| 38 | +| `bedrooms` | Chambres | — | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | — | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | — | 1120 | | |
| 41 | +| `availability_date` | Date de disponibilité | — | now | | |
| 42 | +| `lat` | GPS (lat/lng) | — | 46.82088 | | |
| 43 | +| `description` | Description | — | 1120 pi² \| 2 chambre(s) \| 1 salle(s) de bain \| Modèle C6 \| Orientation N \| Immeuble … | | |
| 44 | +| `images` | Photos (JSON) | — | 2 photo(s) — https://d10eh8wo1l4y8c.cloudfront.net/projects/cdda4a8b-28ea-4673-b5ec-ff4b8… | | |
| 45 | +| `amenities` | Commodités (JSON) | — | ["Eau chaude incluse", "Air climatisé"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | — | {"inclusions": {"hot_water": true}, "ac": true, "floor": 14} | | |
| 47 | +| `url` | URL de l'annonce source | — | https://www.le21mars.ca/plans/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : — | |
| 52 | +- **Dernier passage OK** : aucun dans les 60 derniers runs | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 30 au total, **0 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-10 | |
| 60 | +- **Complétude clé (actives)** : GPS — · prix — · photos — · description — | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 60 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +| Date | Message (sync_log) | | |
| 66 | +|---|---| | |
| 67 | +| 2026-08-17 23:27 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/trudel/fdl/plans (Caused by NameResolutionError("HTTPSConnec… | | |
| 68 | +| 2026-08-17 20:05 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/trudel/fdl/plans (Caused by NameResolutionError("HTTPSConnec… | | |
| 69 | +| 2026-08-17 16:34 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/trudel/fdl/plans (Caused by NameResolutionError("HTTPSConnec… | | |
| 70 | +| 2026-08-17 12:49 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/trudel/fdl/plans (Caused by NameResolutionError("HTTPSConnec… | | |
| 71 | +| 2026-08-17 09:05 | HTTPSConnectionPool(host='app.realvuu.com', port=443): Max retries exceeded with url: /fr/external/trudel/fdl/plans (Caused by NameResolutionError("HTTPSConnec… | | |
| 72 | + | |
| 73 | +**Note du registre** : suspendu — widget RealVuu (app.realvuu.com) hors-ligne depuis 2026-08-10 (DNS NXDOMAIN) ; connecteur désactivé (disabled=True) et annonces archivées le 2026-08-18 | |
| 74 | + | |
| 75 | +Rejouer la source seule : `python3 run.py sync trudel` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='trudel' ORDER BY ts DESC LIMIT 5;`). | |
| 76 | + | |
| 77 | +## Licence, attribution & conditions | |
| 78 | + | |
| 79 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 80 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 81 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 82 | +- Retrait sur demande : contact@spboucher.ai. | |
| 83 | + | |
| 84 | +## Historique | |
| 85 | + | |
| 86 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 87 | +- 2026-08-10 — mention au registre : « …suspendu — widget RealVuu (app.realvuu.com) hors-ligne depuis 2026-08-10 (DNS NXDOMAIN) ; connecteur désactivé (disabled=True) et annonces archivées le 2026-08-18… » | |
| 88 | +- 2026-08-18 — mention au registre : « …2026-08-10 (DNS NXDOMAIN) ; connecteur désactivé (disabled=True) et annonces archivées le 2026-08-18… » | |
| 89 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/trylon.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Trylon Apartments — connecteur `trylon` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 7/7 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Trylon Montréal (trylonmontreal.com) Immeuble unique au 1400, avenue des Pins Ouest (centre-ville, au pied du Mont-Royal). WordPress/Elementor rendu serveur : la page /fr/des-pins/ liste les unités disponibles sous forme de sections « Semi-Meublé - <mois> <année> » suivies de cartes (type, prix $/mo, étage, surface, inclusions). | |
| 10 | + | |
| 11 | +- **Site** : https://trylonmontreal.com | |
| 12 | +- **Page des annonces** : https://trylonmontreal.com/fr | |
| 13 | +- **Secteurs couverts** : Centre-ville | |
| 14 | +- **Module** : `louka/connectors/trylon.py` — classe `TrylonConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://trylonmontreal.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://trylonmontreal.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 7 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement 4½ — 1400 des Pins | | |
| 33 | +| `address` | Adresse civique | 100 % | 1400, avenue des Pins Ouest, Montréal | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Centre-ville | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 625 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 1200 | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | now | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.5005621 | | |
| 43 | +| `description` | Description | 100 % | Étage : 13e \| Surface : 1200pc \| Semi-Meublé | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 16 photo(s) — https://trylonmontreal.com/wp-content/uploads/2020/05/lobby-despins-2.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Chauffage", "Eau chaude", "Climatiseur", "Lave-vaisselle", "Réfrigerateur", "Cuisinière… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true}, "appliances": {"fridge": true, "stov… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://trylonmontreal.com/fr/des-pins/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 7 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 7 au total, **7 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync trylon` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='trylon' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/ubee.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Ubee (location) — connecteur `ubee` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : direct · Annonces actives : 243/246 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Ubee (ubee.com) — plateforme immobilière québécoise API publique anonyme : POST api.ubee.ca/api/anonymous/Search/SearchProperties (pageIndex=N, 24 résultats/page, JSON riche : adresse, GPS, loyer, pièces, superficies m², année, galerie Cloudinary complète). Volet LOCATION : listingType=Renter + isResidential (~250 annonces) ; `askPrice` est le loyer MENSUEL ($) pour ce volet (vérifié en live : 300–5 300 $/mois). Les fiches location vivent sous /a-louer/{ville}/{slug} (canonical du site). Les terrains et le volet commercial sont écartés — pas des logements. Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://ubee.com | |
| 12 | +- **Page des annonces** : https://ubee.com/a-louer | |
| 13 | +- **Secteurs couverts** : Province entière — API SearchProperties listingType Renter (résidentiel) | |
| 14 | +- **Module** : `louka/connectors/ubee.py` — classe `UbeeConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://api.ubee.ca/api/anonymous/Search/SearchProperties | |
| 20 | +- **URLs de départ (constantes du module)** : https://api.ubee.ca/api/anonymous/Search/SearchProperties · https://ubee.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.5 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 243 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Condo à louer — Montréal (Le Plateau-Mont-Royal) | | |
| 33 | +| `address` | Adresse civique | 100 % | 3456, Av. du Parc | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal (Le Plateau-Mont-Royal) | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 800 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 99 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 89 % | 592 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.50889466 | | |
| 43 | +| `description` | Description | 0 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 10 photo(s) — https://res.cloudinary.com/ubee-media/image/private/t_default_size/v1786588… | | |
| 45 | +| `amenities` | Commodités (JSON) | 5 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"Courtier": "Ubee", "Type": "Condo", "Salles de bain": "1", "Année de construction": "20… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://ubee.com/a-louer/montreal/condo-3456-av-du-parc-49ac28 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 243 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.5 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 246 au total, **243 actives** | |
| 59 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 0 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 57, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync ubee` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='ubee' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.5 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/uptimo.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Uptimo Gestion immobilière — connecteur `uptimo` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Estrie · Backend : direct · Annonces actives : 62/78 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Uptimo Gestion immobilière (uptimo.ca) Apparts à Sherbrooke (Fleurimont, Mont-Bellevue, Jacques-Cartier…) et environs. WordPress Themify + Post Type Builder : l'archive /logements-a-louer/ (CPT « propriete », 15 cartes/page, ~6 pages) liste le catalogue à louer — cartes .ptb_post avec titre, arrondissement (taxonomie) et photo ; l'ID WordPress (classe post-<id>) sert d'external_id stable. Les fiches (via self.detail, cache BD) portent les champs structurés : « Adresse: », « Ville: », « Prix: », « Type de propriété: » (2 1/2…), salles de bain, description et galerie. Aucun statut structuré de disponibilité — la date de libération n'apparaît qu'en texte libre dans la description (textmine central). | |
| 10 | + | |
| 11 | +- **Site** : https://www.uptimo.ca | |
| 12 | +- **Page des annonces** : https://www.uptimo.ca/logements-a-louer/ | |
| 13 | +- **Secteurs couverts** : Sherbrooke (Fleurimont, Mont-Bellevue, Jacques-Cartier), Magog | |
| 14 | +- **Module** : `louka/connectors/uptimo.py` — classe `UptimoConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.uptimo.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.uptimo.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 62 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 1690 Rue de Courville | | |
| 33 | +| `address` | Adresse civique | 100 % | 1690 Rue de Courville | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Sherbrooke | | |
| 35 | +| `sector` | Secteur / quartier | 97 % | Mont-Bellevue | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 050 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 97 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 2 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.380655 | | |
| 43 | +| `description` | Description | 100 % | PROMOTION DISPONIBLE : 1 MOIS GRATUIT à la signature du bail. BEAU 4 1/2 \| CHAUFFAGE – E… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 8 photo(s) — https://www.uptimo.ca/wp-content/uploads/2026/07/Facade-1-2.png | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true}, "appliances": {"washer_dryer_hookup"… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.uptimo.ca/propriete/1690-rue-de-courville/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 44 trouvées, +0 / ~0 / -5 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 78 au total, **62 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync uptimo` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='uptimo' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/urban_services.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Urban Services (Urban Tenant Solutions) — connecteur `urban_services` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 52/56 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Urban Services (urbanservices.ca) Gestionnaire de Gatineau (Urban Tenant Solutions) ; portail de location dédié rent.urbanservices.ca sur la plateforme Building Stack — même famille que le portail edifialocation.com du connecteur edifia.py : - /Listing/Listings embarque `var units = [...]` (une entrée par appartement annoncé : prix, pi², chambres, sdb, adresse complète, GPS, contact de l'immeuble, photo) ; - les pages immeuble /b/<id> listent TOUTES les unités disponibles (onglets : numéro, prix, pi², chambres, sdb, date de disponibilité) + les commodités de l'immeuble — le JSON de la liste est parfois tronqué (immeubles à fort inventaire), la page /b/<id> fait donc foi pour l'inventaire et les dates ; le JSON enrichit (GPS, contact…). Une annonce Lou-Ka = une unité disponible. Le parc ontarien (Ottawa) est exclu (province != QC). ~17 requêtes par sync (1 + 16 immeubles). | |
| 10 | + | |
| 11 | +- **Site** : https://urbanservices.ca | |
| 12 | +- **Page des annonces** : https://rent.urbanservices.ca/Listing/Listings | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer, Plateau) — Ottawa (ON) exclue | |
| 14 | +- **Module** : `louka/connectors/urban_services.py` — classe `UrbanServicesConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://rent.urbanservices.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://rent.urbanservices.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 52 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 70 Noisetiers — unité 5 | | |
| 33 | +| `address` | Adresse civique | 100 % | 70 Rue des Noisetiers, Gatineau, QC J9A 3G9, Canada | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 0 % | — | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 350 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 75 % | 900 | | |
| 41 | +| `availability_date` | Date de disponibilité | 98 % | 2027-08-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.4288304 | | |
| 43 | +| `description` | Description | 100 % | 900 pi² — 2 chambre(s) — 1 salle(s) de bain | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://wfiles.buildingstack.com/resources/image/OKraM7T9Ub9IIM9KQ459Cs9eS3T… | | |
| 45 | +| `amenities` | Commodités (JSON) | 73 % | ["Salle de buanderie", "Stationnement extérieur"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"laundry": true, "parking": {"available": true, "type": "extérieur"}, "building": "70 No… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://rent.urbanservices.ca/b/202244058702005621807/410794 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 52 trouvées, +0 / ~0 / -2 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 56 au total, **52 actives** | |
| 59 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync urban_services` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='urban_services' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/utile.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# UTILE (logement étudiant) — connecteur `utile` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 28/28 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur UTILE (utile.org) OBNL de logement étudiant. Immeubles à Montréal (Angus, Griffintown, Milton-Parc, Saint-Laurent, Saint-Patrick, Parc La Fontaine, Des Carrières, Hutchison…), Québec (Cité universitaire, Saint-Sacrement), Trois-Rivières (Jean-XXIII), Rimouski et Sherbrooke (en développement). Site Webflow rendu serveur : une annonce par immeuble × typologie (Studio, 2 bedroom...) avec prix "From $x/month", photos de la galerie (templates Webflow encodés en URL) et statut de l'immeuble (For rent / Fully rented — balises conditionnelles w-condition-invisible). | |
| 10 | + | |
| 11 | +- **Site** : https://www.utile.org | |
| 12 | +- **Page des annonces** : https://www.utile.org/en | |
| 13 | +- **Secteurs couverts** : Griffintown, Angus, Milton-Parc | |
| 14 | +- **Module** : `louka/connectors/utile.py` — classe `UtileConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.utile.org | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.utile.org | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 28 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | UTILE Parc La Fontaine — Studio | | |
| 33 | +| `address` | Adresse civique | 100 % | 3505, avenue Papineau, Montréal | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Plateau Mont-Royal | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | Studio | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 843 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 0 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.52912538026019 | | |
| 43 | +| `description` | Description | 100 % | En location à partir du : April 1st, 2027. Non-profit housing provider. From studios to 4… | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 2 photo(s) — https://cdn.prod.website-files.com/671f03f16a9ff0cd1e15782e/68debcf6c2412f08… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Logement étudiant", "Bail 12 mois", "Cuisinière", "Réfrigérateur", "Portail locataire e… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "electricity": true, "hot_water": true, "internet": true… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.utile.org/en/immeubles/parc-la-fontaine | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:27 — 28 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 28 au total, **28 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync utile` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='utile' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/via_capitale.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Via Capitale (location) — connecteur `via_capitale` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Province · Backend : Firecrawl · Annonces actives : 193/211 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +Via Capitale (viacapitalevendu.com) — LOCATIONS Bannière 100 % québécoise (Bridgemarq). Le site est rendu serveur (ASP.NET) mais protégé par Cloudflare : on passe par Firecrawl (get_rendered) qui franchit le challenge — testé : Scrapfly ASP passe Cloudflare mais ne rend pas les cartes. La recherche accepte un blob base64 `criteresJson` ; « AVendre »: false y bascule le même moteur en mode LOCATION (prix « X $ / mois », ~34 cartes/page). Adapté du connecteur « à vendre » d'Immo-Ka (agent-courtage/immoka). | |
| 10 | + | |
| 11 | +- **Site** : https://www.viacapitalevendu.com | |
| 12 | +- **Page des annonces** : https://www.viacapitalevendu.com/recherche/residentiel/ | |
| 13 | +- **Secteurs couverts** : Province entière — inscriptions résidentielles à louer de la bannière (criteresJson AVendre:false, via Firecrawl) | |
| 14 | +- **Module** : `louka/connectors/via_capitale.py` — classe `ViaCapitaleConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://www.viacapitalevendu.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://www.viacapitalevendu.com · https://images.viacapitale.info | |
| 21 | +- **Authentification** : aucune — contenu public (clé Firecrawl côté Lou-Ka) | |
| 22 | +- **Pagination** : pagination par numéro de page | |
| 23 | +- **Backend anti-bot / rendu** : Firecrawl (HTML rendu, JavaScript exécuté) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (Firecrawl, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 193 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Appartement — 700 Route des Rivières | | |
| 33 | +| `address` | Adresse civique | 100 % | 700 Route des Rivières | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Lévis | | |
| 35 | +| `sector` | Secteur / quartier | 51 % | Les Chutes-de-la-Chaudière-Ouest | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 0 % | — | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 927 $ | | |
| 38 | +| `bedrooms` | Chambres | 7 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 4 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 4 % | 1207 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 54 % | 46.733574707 | | |
| 43 | +| `description` | Description | 100 % | CESSION DE BAIL -- LE 700 \| SAINT-NICOLAS Superbe unité de 1 207 pi² située au 3e étage … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 14 photo(s) — https://images.viacapitale.info/images/inscriptions/27146731/1-494833980.jpg | | |
| 45 | +| `amenities` | Commodités (JSON) | 0 % | [] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": true, "hot_water": true, "internet": true}, "ac": true, "balco… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://www.viacapitalevendu.com/inscription/fichedescriptive/?code=27146731 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:28 — 193 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 211 au total, **193 actives** | |
| 59 | +- **Première ingestion** : 2026-08-12 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 54 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 57, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync via_capitale` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='via_capitale' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-12 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/viridi.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Le Viridi — connecteur `viridi` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Québec · Backend : direct · Annonces actives : 16/17 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Le Viridi (condosleviridi.ca) Immeuble de 89 unités dans l'Écoquartier Pointe-aux-Lièvres (Québec). Le site présente 16 modèles d'unités (types A à O) avec prix « à partir de » par catégorie (Studio/Loft/3½/4½/5½/6½, maison de ville). Une annonce par modèle (pas de liste d'unités individuelles). | |
| 10 | + | |
| 11 | +- **Site** : https://condosleviridi.ca | |
| 12 | +- **Page des annonces** : https://condosleviridi.ca | |
| 13 | +- **Secteurs couverts** : Québec | |
| 14 | +- **Module** : `louka/connectors/viridi.py` — classe `ViridiConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://condosleviridi.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://condosleviridi.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 16 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | Le Viridi — Maison de ville 4½ (type K’) | | |
| 33 | +| `address` | Adresse civique | 100 % | 40, rue de la Pointe-aux-Lièvres, Québec, QC G1k 0J7 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Québec | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Pointe-aux-Lièvres (Saint-Roch) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 2 450 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 100 % | 980 | | |
| 41 | +| `availability_date` | Date de disponibilité | 0 % | — | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 46.8209075 | | |
| 43 | +| `description` | Description | 62 % | — | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 5 photo(s) — https://condosleviridi.ca/wp-content/uploads/2021/06/VIRIDI_102-1-texte-auto… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Nombre de chambres: 2", "Nombre de salles de bain: 1", "Superficie: 980 pi²", "Structur… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"electricity": true, "hot_water": true, "internet": true}, "appliances": … | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://condosleviridi.ca/logement-type-k-prime/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:28 — 16 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 17 au total, **16 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 62 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync viridi` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='viridi' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/wandji.md
+80 −0
@@ -0,0 +1,80 @@ | ||
| 1 | +# Gestion Immobilière Wandji — connecteur `wandji` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Outaouais · Backend : direct · Annonces actives : 25/30 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Gestion Immobilière Wandji (wandji-immobilier.com — Gatineau : Hull, Aylmer, Plateau, Buckingham, Masson-Angers + Papineauville). Le site est une SPA Angular 2 (2016) vide sans JavaScript, mais son backend expose une API JSON publique : GET /api/buildings -> liste des logements NON LOUÉS (rented=false) avec prix, adresse, secteur, ville, lat/lng, chambres, salles de bain, disponibilité (ISO), descriptions FR/EN, inclusions/exclusions, proximité et galerie (/api/buildings/<id>/picture/<fichier>). Une annonce = un document Mongo (_id stable = external_id). Les locaux commerciaux (type COMMERCIAL / subType LOCAL) et les adresses hors Québec (secteur Ottawa) sont exclus. Le suffixe « /mois » n'est affiché par le site que si monthly=true : le price_label reproduit ce comportement. | |
| 10 | + | |
| 11 | +- **Site** : https://wandji-immobilier.com | |
| 12 | +- **Page des annonces** : https://wandji-immobilier.com/proprietes | |
| 13 | +- **Secteurs couverts** : Gatineau (Hull, Aylmer, Plateau, Buckingham, Masson-Angers), Papineauville | |
| 14 | +- **Module** : `louka/connectors/wandji.py` — classe `WandjiConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : API JSON interne du site | |
| 19 | +- **Endpoint de base** : https://wandji-immobilier.com | |
| 20 | +- **URLs de départ (constantes du module)** : https://wandji-immobilier.com | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, API JSON interne du site) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 25 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | 52 rue Latour | | |
| 33 | +| `address` | Adresse civique | 100 % | 52 rue Latour | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Gatineau | | |
| 35 | +| `sector` | Secteur / quartier | 68 % | Buckingham | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 4½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 1 725 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 2 | | |
| 39 | +| `bathrooms` | Salles de bain | 100 % | 1 | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 20 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-07-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 100 % | 45.58538428352824 | | |
| 43 | +| `description` | Description | 100 % | Construction neuve à Buckingham. Cet appartement vient avec : - 2 chambres à coucher - 1 … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 13 photo(s) — https://wandji-immobilier.com/api/buildings/6a0cb851156b6624006cfc29/pictur… | | |
| 45 | +| `amenities` | Commodités (JSON) | 96 % | ["Stationnement extérieur"] | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"inclusions": {"heating": false, "electricity": false, "hot_water": false}, "pets": "non… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://wandji-immobilier.com/proprietes#6a0cb851156b6624006cfc29 | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:28 — 25 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | +- **Caps / budgets du module** : `MAX_IMAGES` = 20 | |
| 56 | + | |
| 57 | +## Volumétrie & complétude | |
| 58 | + | |
| 59 | +- **Annonces en BD** : 30 au total, **25 actives** | |
| 60 | +- **Première ingestion** : 2026-08-09 · **Dernière observation** : 2026-08-17 | |
| 61 | +- **Complétude clé (actives)** : GPS 100 % · prix 100 % · photos 100 % · description 100 % | |
| 62 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 63 | + | |
| 64 | +## Erreurs connues & dépannage | |
| 65 | + | |
| 66 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 67 | + | |
| 68 | +Rejouer la source seule : `python3 run.py sync wandji` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='wandji' ORDER BY ts DESC LIMIT 5;`). | |
| 69 | + | |
| 70 | +## Licence, attribution & conditions | |
| 71 | + | |
| 72 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 73 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 74 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 75 | +- Retrait sur demande : contact@spboucher.ai. | |
| 76 | + | |
| 77 | +## Historique | |
| 78 | + | |
| 79 | +- 2026-08-09 — premières annonces de la source ingérées dans la BD. | |
| 80 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
docs/connecteurs/werkliv.md
+79 −0
@@ -0,0 +1,79 @@ | ||
| 1 | +# Werkliv — connecteur `werkliv` | |
| 2 | + | |
| 3 | +_Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 03:30 — ne pas éditer à la main, régénérer._ | |
| 4 | + | |
| 5 | +**État : actif** · Région : Montréal · Backend : direct · Annonces actives : 4/4 | |
| 6 | + | |
| 7 | +## Description de la source | |
| 8 | + | |
| 9 | +connecteur Werkliv (logement étudiant) werkliv.com est le site corporatif ; la location de ses immeubles passe par sa plateforme University Apartments (universityapartments.ca — WordPress + FacetWP rendu serveur). Immeubles montréalais : Palay (2025 rue Peel, centre-ville) et Le Mojave (3476 rue Saint-Dominique, Plateau/Milton-Parc). Une annonce par typologie (1-BEDROOM, 4-BEDROOM...), loyer par personne (colocation étudiante meublée). | |
| 10 | + | |
| 11 | +- **Site** : https://werkliv.com | |
| 12 | +- **Page des annonces** : https://werkliv.com/en | |
| 13 | +- **Secteurs couverts** : Centre-ville, Milton-Parc (étudiant) | |
| 14 | +- **Module** : `louka/connectors/werkliv.py` — classe `WerklivConnector` | |
| 15 | + | |
| 16 | +## Accès | |
| 17 | + | |
| 18 | +- **Type d'accès** : pages HTML (rendu serveur) | |
| 19 | +- **Endpoint de base** : https://universityapartments.ca | |
| 20 | +- **URLs de départ (constantes du module)** : https://universityapartments.ca | |
| 21 | +- **Authentification** : aucune — contenu public | |
| 22 | +- **Pagination** : page de liste unique (pas de pagination) | |
| 23 | +- **Backend anti-bot / rendu** : requests direct (session UA LouKaBot, throttling poli) | |
| 24 | +- **Politesse** : 0.6 s entre requêtes, timeout 30 s, User-Agent identifiable `LouKaBot/1.0 (+https://www.lou-ka.com/bot)` | |
| 25 | + | |
| 26 | +## Champs récupérés → schéma cible | |
| 27 | + | |
| 28 | +Le connecteur (direct, pages HTML (rendu serveur)) alimente les colonnes de la table `listings`. Complétude mesurée en SQL sur les 4 annonces actives ; exemple tiré d'une ligne réelle de la BD. | |
| 29 | + | |
| 30 | +| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel | | |
| 31 | +|---|---|---|---| | |
| 32 | +| `title` | Titre de l'annonce | 100 % | PALAY — 1-BEDROOM (par chambre) | | |
| 33 | +| `address` | Adresse civique | 100 % | 2025 Peel Street Montréal QC H3A 1T6 | | |
| 34 | +| `city` | Ville (normalisée) | 100 % | Montréal | | |
| 35 | +| `sector` | Secteur / quartier | 100 % | Centre-ville (Ville-Marie) | | |
| 36 | +| `unit_type` | Type d'unité (3½, 4½…) | 100 % | 3½ | | |
| 37 | +| `price` | Loyer mensuel ($) | 100 % | 999 $ | | |
| 38 | +| `bedrooms` | Chambres | 100 % | 1 | | |
| 39 | +| `bathrooms` | Salles de bain | 0 % | — | | |
| 40 | +| `area_sqft` | Superficie (pi²) | 0 % | — | | |
| 41 | +| `availability_date` | Date de disponibilité | 100 % | 2026-09-01 | | |
| 42 | +| `lat` | GPS (lat/lng) | 0 % | — | | |
| 43 | +| `description` | Description | 100 % | Rent a private room at Palay's fully-furnished student apartments. Practically on McGill … | | |
| 44 | +| `images` | Photos (JSON) | 100 % | 26 photo(s) — https://universityapartments.ca/wp-content/uploads/2025/11/Palay-5-scaled.j… | | |
| 45 | +| `amenities` | Commodités (JSON) | 100 % | ["Logement étudiant", "Walk Distance: 10 min to Concordia University", "Lease: 12 months"… | | |
| 46 | +| `details` | Détails additionnels (JSON) | 100 % | {"appliances": {"fridge": true, "stove": true, "dishwasher": true}, "gym": true, "laundry… | | |
| 47 | +| `url` | URL de l'annonce source | 100 % | https://universityapartments.ca/listings/1-bedroom-3/ | | |
| 48 | + | |
| 49 | +## Fréquence & budget | |
| 50 | + | |
| 51 | +- **Cadence observée** (médiane des passages OK, sync_log) : ≈ 2.0 h | |
| 52 | +- **Dernier passage OK** : 2026-08-17 23:28 — 4 trouvées, +0 / ~0 / -0 | |
| 53 | +- **Throttling** : 0.6 s entre requêtes (constante de classe `request_delay`) | |
| 54 | +- **Cache des pages détail (BD `detail_cache`)** : activé — évite de re-visiter les fiches inchangées | |
| 55 | + | |
| 56 | +## Volumétrie & complétude | |
| 57 | + | |
| 58 | +- **Annonces en BD** : 4 au total, **4 actives** | |
| 59 | +- **Première ingestion** : 2026-08-06 · **Dernière observation** : 2026-08-17 | |
| 60 | +- **Complétude clé (actives)** : GPS 0 % · prix 100 % · photos 100 % · description 100 % | |
| 61 | +- **Runs journalisés (60 derniers)** : 60, dont 0 en erreur | |
| 62 | + | |
| 63 | +## Erreurs connues & dépannage | |
| 64 | + | |
| 65 | +Aucune erreur dans les 60 derniers runs journalisés. | |
| 66 | + | |
| 67 | +Rejouer la source seule : `python3 run.py sync werkliv` · vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE source='werkliv' ORDER BY ts DESC LIMIT 5;`). | |
| 68 | + | |
| 69 | +## Licence, attribution & conditions | |
| 70 | + | |
| 71 | +- Scraping poli d'annonces **publiques** (données factuelles : prix, adresse, disponibilité) publiées par le gestionnaire sur son propre site. | |
| 72 | +- User-Agent **identifiable** avec page d'information et contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; contact@spboucher.ai)` ; throttling 0.6 s ; cache détail pour minimiser les requêtes. | |
| 73 | +- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce d'origine** (colonne `url`) — la source garde le trafic de conversion. | |
| 74 | +- Retrait sur demande : contact@spboucher.ai. | |
| 75 | + | |
| 76 | +## Historique | |
| 77 | + | |
| 78 | +- 2026-08-06 — premières annonces de la source ingérées dans la BD. | |
| 79 | +- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`). | |
added
scripts/gen_connector_docs.py
+587 −0
@@ -0,0 +1,587 @@ | ||
| 1 | +#!/usr/bin/env python3 | |
| 2 | +# ----------------------------------------------------------------------------- | |
| 3 | +# Lou-Ka — Agrégateur de logements à louer (province de Québec) | |
| 4 | +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai | |
| 5 | +# scripts/gen_connector_docs.py : documentation STANDARDISÉE des connecteurs. | |
| 6 | +# | |
| 7 | +# Génère docs/connecteurs/INDEX.md + une fiche docs/connecteurs/<source_id>.md | |
| 8 | +# par connecteur, de façon 100 % programmatique et rejouable, en croisant : | |
| 9 | +# 1. le registre data/sources.json (nom, url, secteurs, statut, notes) ; | |
| 10 | +# 2. l'introspection STATIQUE (ast) du code de louka/connectors/*.py : | |
| 11 | +# classe, backend (direct / Firecrawl / Scrapfly), endpoint de base, | |
| 12 | +# pagination, constantes de budget — sans exécuter les connecteurs ; | |
| 13 | +# 3. la BD live data/louka.db : volumétrie, complétude des champs par | |
| 14 | +# source (SQL), dernier sync OK, cadence observée, erreurs récentes. | |
| 15 | +# | |
| 16 | +# Usage : python3 scripts/gen_connector_docs.py (depuis la racine) | |
| 17 | +# À relancer après tout changement de connecteur / registre / ingestion. | |
| 18 | +# ----------------------------------------------------------------------------- | |
| 19 | +from __future__ import annotations | |
| 20 | + | |
| 21 | +import ast | |
| 22 | +import json | |
| 23 | +import re | |
| 24 | +import sqlite3 | |
| 25 | +import statistics | |
| 26 | +from datetime import datetime | |
| 27 | +from pathlib import Path | |
| 28 | + | |
| 29 | +ROOT = Path(__file__).resolve().parents[1] | |
| 30 | +CONN_DIR = ROOT / "louka" / "connectors" | |
| 31 | +DOCS_DIR = ROOT / "docs" / "connecteurs" | |
| 32 | +DB_PATH = ROOT / "data" / "louka.db" | |
| 33 | +SOURCES_JSON = ROOT / "data" / "sources.json" | |
| 34 | + | |
| 35 | +SKIP_MODULES = {"__init__", "base", "_detailutil"} | |
| 36 | +URL_RE = re.compile(r"https?://[^\s\"'\\)>,;]+") | |
| 37 | +DATE_RE = re.compile(r"\d{4}-\d{2}-\d{2}") | |
| 38 | +INFRA_HOSTS = ("api.firecrawl.dev", "api.scrapfly.io", "lou-ka.com", | |
| 39 | + "nominatim", "overpass") | |
| 40 | + | |
| 41 | +# Colonnes de `listings` documentées dans la section « Champs récupérés » : | |
| 42 | +# (colonne, libellé, condition SQL de complétude sur les annonces actives) | |
| 43 | +FIELDS = [ | |
| 44 | + ("title", "Titre de l'annonce", "title IS NOT NULL AND title != ''"), | |
| 45 | + ("address", "Adresse civique", "address IS NOT NULL AND address != ''"), | |
| 46 | + ("city", "Ville (normalisée)", "city IS NOT NULL AND city != ''"), | |
| 47 | + ("sector", "Secteur / quartier", "sector IS NOT NULL AND sector != ''"), | |
| 48 | + ("unit_type", "Type d'unité (3½, 4½…)", | |
| 49 | + "unit_type IS NOT NULL AND unit_type != ''"), | |
| 50 | + ("price", "Loyer mensuel ($)", "price IS NOT NULL"), | |
| 51 | + ("bedrooms", "Chambres", "bedrooms IS NOT NULL"), | |
| 52 | + ("bathrooms", "Salles de bain", "bathrooms IS NOT NULL"), | |
| 53 | + ("area_sqft", "Superficie (pi²)", "area_sqft IS NOT NULL"), | |
| 54 | + ("availability_date", "Date de disponibilité", | |
| 55 | + "availability_date IS NOT NULL AND availability_date != ''"), | |
| 56 | + ("lat", "GPS (lat/lng)", "lat IS NOT NULL AND lng IS NOT NULL"), | |
| 57 | + ("description", "Description", "description IS NOT NULL AND description != ''"), | |
| 58 | + ("images", "Photos (JSON)", "images IS NOT NULL AND length(images) > 4"), | |
| 59 | + ("amenities", "Commodités (JSON)", | |
| 60 | + "amenities IS NOT NULL AND length(amenities) > 4"), | |
| 61 | + ("details", "Détails additionnels (JSON)", | |
| 62 | + "details IS NOT NULL AND length(details) > 4"), | |
| 63 | + ("url", "URL de l'annonce source", "url IS NOT NULL AND url != ''"), | |
| 64 | +] | |
| 65 | + | |
| 66 | + | |
| 67 | +# -- helpers de formatage ------------------------------------------------------ | |
| 68 | + | |
| 69 | +def esc(s: str, limit: int = 100) -> str: | |
| 70 | + """Échappe une valeur pour une cellule de tableau Markdown.""" | |
| 71 | + s = str(s).replace("\\", "\\\\").replace("|", "\\|") | |
| 72 | + s = re.sub(r"\s+", " ", s).strip() | |
| 73 | + return s[: limit - 1] + "…" if len(s) > limit else s | |
| 74 | + | |
| 75 | + | |
| 76 | +def pct(n, d) -> str: | |
| 77 | + if not d: | |
| 78 | + return "—" | |
| 79 | + return f"{100.0 * (n or 0) / d:.0f} %" | |
| 80 | + | |
| 81 | + | |
| 82 | +def fmt_ts(ts) -> str: | |
| 83 | + if not ts: | |
| 84 | + return "—" | |
| 85 | + return datetime.fromtimestamp(float(ts)).strftime("%Y-%m-%d %H:%M") | |
| 86 | + | |
| 87 | + | |
| 88 | +def fmt_secs(sec: float) -> str: | |
| 89 | + if sec < 5400: | |
| 90 | + return f"≈ {sec / 60:.0f} min" | |
| 91 | + if sec < 129600: | |
| 92 | + return f"≈ {sec / 3600:.1f} h" | |
| 93 | + return f"≈ {sec / 86400:.1f} j" | |
| 94 | + | |
| 95 | + | |
| 96 | +def example_value(col: str, value) -> str: | |
| 97 | + """Rend un exemple lisible tiré d'une ligne réelle de la BD.""" | |
| 98 | + if value is None or value == "": | |
| 99 | + return "—" | |
| 100 | + if col == "images": | |
| 101 | + try: | |
| 102 | + imgs = json.loads(value) | |
| 103 | + if not imgs: | |
| 104 | + return "—" | |
| 105 | + return esc(f"{len(imgs)} photo(s) — {imgs[0]}", 90) | |
| 106 | + except (ValueError, TypeError): | |
| 107 | + return esc(value, 90) | |
| 108 | + if col in ("amenities", "details"): | |
| 109 | + return esc(value, 90) | |
| 110 | + if col == "price": | |
| 111 | + return f"{float(value):,.0f} $".replace(",", " ") | |
| 112 | + if col in ("bedrooms", "bathrooms", "area_sqft"): | |
| 113 | + v = float(value) | |
| 114 | + return f"{v:g}" | |
| 115 | + return esc(value, 90) | |
| 116 | + | |
| 117 | + | |
| 118 | +# -- introspection statique du code des connecteurs ---------------------------- | |
| 119 | + | |
| 120 | +def banner_description(text: str, module: str) -> str: | |
| 121 | + """Extrait la description du bandeau de commentaires en tête de module.""" | |
| 122 | + lines, started = [], False | |
| 123 | + for raw in text.splitlines(): | |
| 124 | + if not raw.startswith("#"): | |
| 125 | + if started or not raw.strip(): | |
| 126 | + break | |
| 127 | + continue | |
| 128 | + body = raw.lstrip("#").strip() | |
| 129 | + if set(body) <= {"-", "="}: | |
| 130 | + continue | |
| 131 | + marker = f"connectors/{module}.py" | |
| 132 | + if not started: | |
| 133 | + if marker in body: | |
| 134 | + started = True | |
| 135 | + lines.append(body.split(":", 1)[-1].strip()) | |
| 136 | + continue | |
| 137 | + lines.append(body) | |
| 138 | + return " ".join(l for l in lines if l).strip() | |
| 139 | + | |
| 140 | + | |
| 141 | +def detect_backends(text: str) -> tuple[list[str], str]: | |
| 142 | + """(liste détaillée, famille courte) des backends de fetch utilisés.""" | |
| 143 | + detailed, family = [], "direct" | |
| 144 | + if re.search(r"self\.(get|post)\(", text): | |
| 145 | + detailed.append("requests direct (session UA LouKaBot, throttling poli)") | |
| 146 | + if ".scrapfly(" in text: | |
| 147 | + detailed.append("Scrapfly (asp + render_js — contournement anti-bot)") | |
| 148 | + family = "Scrapfly" | |
| 149 | + if "get_rendered(" in text: | |
| 150 | + detailed.append("Firecrawl (HTML rendu, JavaScript exécuté)") | |
| 151 | + family = "Firecrawl" if family == "direct" else family | |
| 152 | + if not detailed: | |
| 153 | + detailed.append("requests direct") | |
| 154 | + return detailed, family | |
| 155 | + | |
| 156 | + | |
| 157 | +def detect_flavor(text: str) -> str: | |
| 158 | + low = text.lower() | |
| 159 | + if "graphql" in low: | |
| 160 | + return "API GraphQL interne" | |
| 161 | + if "admin-ajax" in low: | |
| 162 | + return "API admin-ajax (WordPress)" | |
| 163 | + if "/wp-json" in low: | |
| 164 | + return "API REST WordPress (wp-json)" | |
| 165 | + if "sitemap" in low: | |
| 166 | + return "sitemap XML + pages HTML" | |
| 167 | + if re.search(r"\.json\(\)", text) and re.search(r"api[./_]", low): | |
| 168 | + return "API JSON interne du site" | |
| 169 | + return "pages HTML (rendu serveur)" | |
| 170 | + | |
| 171 | + | |
| 172 | +def detect_pagination(text: str, constants: dict) -> str: | |
| 173 | + hits = [] | |
| 174 | + low = text.lower() | |
| 175 | + if "js_scenario" in text: | |
| 176 | + hits.append("défilement simulé (js_scenario Scrapfly)") | |
| 177 | + if re.search(r"[?&]page=|[\"']page[\"']\s*[:=]|paged", low): | |
| 178 | + hits.append("pagination par numéro de page") | |
| 179 | + if re.search(r"[?&]offset=|[\"']offset[\"']", low): | |
| 180 | + hits.append("pagination par offset") | |
| 181 | + if "load_more" in low or "loadmore" in low: | |
| 182 | + hits.append("bouton « charger plus » rejoué") | |
| 183 | + roots = [k for k, v in constants.items() | |
| 184 | + if isinstance(v, (list, tuple)) and len(v) > 1 | |
| 185 | + and k in ("ROOTS", "PAGES", "SECTIONS", "SECTEURS", "CITIES", | |
| 186 | + "REGIONS", "URLS", "LISTS")] | |
| 187 | + if roots: | |
| 188 | + n = len(constants[roots[0]]) | |
| 189 | + hits.append(f"multi-racines ({n} pages de départ : {roots[0]})") | |
| 190 | + if not hits: | |
| 191 | + hits.append("page de liste unique (pas de pagination)") | |
| 192 | + return " ; ".join(hits) | |
| 193 | + | |
| 194 | + | |
| 195 | +def introspect_module(path: Path) -> list[dict]: | |
| 196 | + """Retourne une entrée par classe connecteur du module (souvent 1).""" | |
| 197 | + text = path.read_text(encoding="utf-8") | |
| 198 | + module = path.stem | |
| 199 | + try: | |
| 200 | + tree = ast.parse(text) | |
| 201 | + except SyntaxError: | |
| 202 | + return [] | |
| 203 | + | |
| 204 | + constants: dict = {} | |
| 205 | + for node in tree.body: | |
| 206 | + if isinstance(node, ast.Assign) and len(node.targets) == 1 \ | |
| 207 | + and isinstance(node.targets[0], ast.Name) \ | |
| 208 | + and node.targets[0].id.isupper(): | |
| 209 | + try: | |
| 210 | + constants[node.targets[0].id] = ast.literal_eval(node.value) | |
| 211 | + except (ValueError, TypeError, SyntaxError): | |
| 212 | + seg = ast.get_source_segment(text, node.value) or "" | |
| 213 | + urls = URL_RE.findall(seg) | |
| 214 | + constants[node.targets[0].id] = urls if len(urls) > 1 else \ | |
| 215 | + (urls[0] if urls else None) | |
| 216 | + | |
| 217 | + urls_all = [] | |
| 218 | + for u in URL_RE.findall(text): | |
| 219 | + u = u.rstrip('".') | |
| 220 | + host = u.split("//", 1)[-1].split("/", 1)[0] | |
| 221 | + if "." not in host: # fragment de f-string, pas une vraie URL | |
| 222 | + continue | |
| 223 | + if not any(h in u for h in INFRA_HOSTS) and u not in urls_all: | |
| 224 | + urls_all.append(u) | |
| 225 | + | |
| 226 | + endpoint = None | |
| 227 | + for name in ("BASE", "BASE_URL", "API", "API_URL", "API_BASE", "ROOT", | |
| 228 | + "SITE", "URL", "LIST_URL", "HOST"): | |
| 229 | + v = constants.get(name) | |
| 230 | + if isinstance(v, str) and v.startswith("http"): | |
| 231 | + endpoint = v | |
| 232 | + break | |
| 233 | + if not endpoint and urls_all: | |
| 234 | + endpoint = urls_all[0] | |
| 235 | + | |
| 236 | + budgets = {k: v for k, v in constants.items() | |
| 237 | + if isinstance(v, (int, float)) and not isinstance(v, bool) | |
| 238 | + and re.search(r"MAX|CAP|LIMIT|BUDGET|TTL|PER_PAGE|PAGES|DELAY", k)} | |
| 239 | + | |
| 240 | + backends, family = detect_backends(text) | |
| 241 | + entries = [] | |
| 242 | + for node in tree.body: | |
| 243 | + if not isinstance(node, ast.ClassDef): | |
| 244 | + continue | |
| 245 | + bases = {getattr(b, "id", getattr(b, "attr", "")) for b in node.bases} | |
| 246 | + if not (bases & {"BaseConnector"}) and not any( | |
| 247 | + b.endswith("Connector") for b in bases if b): | |
| 248 | + continue | |
| 249 | + attrs = {"request_delay": 0.6, "timeout": 30, "use_detail_cache": True, | |
| 250 | + "disabled": False, "source_id": ""} | |
| 251 | + for sub in node.body: | |
| 252 | + if isinstance(sub, ast.Assign) and len(sub.targets) == 1 \ | |
| 253 | + and isinstance(sub.targets[0], ast.Name): | |
| 254 | + try: | |
| 255 | + attrs[sub.targets[0].id] = ast.literal_eval(sub.value) | |
| 256 | + except (ValueError, TypeError, SyntaxError): | |
| 257 | + pass | |
| 258 | + if not attrs.get("source_id"): | |
| 259 | + continue | |
| 260 | + entries.append({ | |
| 261 | + "module": module, "path": f"louka/connectors/{module}.py", | |
| 262 | + "class": node.name, "class_doc": ast.get_docstring(node) or "", | |
| 263 | + "banner": banner_description(text, module), | |
| 264 | + "source_id": attrs["source_id"], "disabled": attrs["disabled"], | |
| 265 | + "request_delay": attrs["request_delay"], "timeout": attrs["timeout"], | |
| 266 | + "use_detail_cache": attrs["use_detail_cache"], | |
| 267 | + "endpoint": endpoint, "urls": urls_all[:4], "budgets": budgets, | |
| 268 | + "backends": backends, "backend_family": family, | |
| 269 | + "flavor": detect_flavor(text), | |
| 270 | + "pagination": detect_pagination(text, constants), | |
| 271 | + }) | |
| 272 | + return entries | |
| 273 | + | |
| 274 | + | |
| 275 | +# -- BD live ------------------------------------------------------------------- | |
| 276 | + | |
| 277 | +def db_stats(con: sqlite3.Connection, sid: str) -> dict: | |
| 278 | + parts = ", ".join( | |
| 279 | + f"sum(CASE WHEN active=1 AND {cond} THEN 1 ELSE 0 END) AS f_{col}" | |
| 280 | + for col, _label, cond in FIELDS) | |
| 281 | + row = con.execute( | |
| 282 | + f"SELECT count(*) AS total, coalesce(sum(active),0) AS act, " | |
| 283 | + f"min(first_seen) AS first_seen, max(last_seen) AS last_seen, {parts} " | |
| 284 | + f"FROM listings WHERE source=?", (sid,)).fetchone() | |
| 285 | + sample = con.execute( | |
| 286 | + "SELECT * FROM listings WHERE source=? AND active=1 " | |
| 287 | + "ORDER BY last_seen DESC LIMIT 1", (sid,)).fetchone() | |
| 288 | + if sample is None: | |
| 289 | + sample = con.execute( | |
| 290 | + "SELECT * FROM listings WHERE source=? ORDER BY last_seen DESC " | |
| 291 | + "LIMIT 1", (sid,)).fetchone() | |
| 292 | + | |
| 293 | + runs = con.execute( | |
| 294 | + "SELECT ts, ok, found, added, updated, removed, message FROM sync_log " | |
| 295 | + "WHERE source=? ORDER BY ts DESC LIMIT 60", (sid,)).fetchall() | |
| 296 | + ok_ts = sorted(r["ts"] for r in runs if r["ok"]) | |
| 297 | + cadence = None | |
| 298 | + if len(ok_ts) >= 3: | |
| 299 | + deltas = [b - a for a, b in zip(ok_ts, ok_ts[1:]) if b - a > 60] | |
| 300 | + if deltas: | |
| 301 | + cadence = statistics.median(deltas) | |
| 302 | + last_ok = next((r for r in runs if r["ok"]), None) | |
| 303 | + errors = [r for r in runs if not r["ok"]][:5] | |
| 304 | + return {"agg": row, "sample": sample, "runs": runs, "cadence": cadence, | |
| 305 | + "last_ok": last_ok, "errors": errors, | |
| 306 | + "err_count": sum(1 for r in runs if not r["ok"])} | |
| 307 | + | |
| 308 | + | |
| 309 | +# -- rendu des fiches ------------------------------------------------------------ | |
| 310 | + | |
| 311 | +def short_status(entry: dict, reg: list[dict]) -> str: | |
| 312 | + if entry["disabled"]: | |
| 313 | + return "désactivé (disabled=True)" | |
| 314 | + status = (reg[0].get("status") or "") if reg else "" | |
| 315 | + if status.startswith("actif (dégradé)"): | |
| 316 | + return "actif (dégradé)" | |
| 317 | + for p in ("actif", "suspendu", "non connectable"): | |
| 318 | + if status.startswith(p): | |
| 319 | + return p | |
| 320 | + return status.split("—")[0].strip() or "actif (hors registre)" | |
| 321 | + | |
| 322 | + | |
| 323 | +def history_lines(reg: list[dict], stats: dict) -> list[str]: | |
| 324 | + lines = [] | |
| 325 | + if stats["agg"]["first_seen"]: | |
| 326 | + lines.append(f"- {fmt_ts(stats['agg']['first_seen'])[:10]} — premières " | |
| 327 | + "annonces de la source ingérées dans la BD.") | |
| 328 | + seen = set() | |
| 329 | + for r in reg: | |
| 330 | + blob = " ".join(str(r.get(k, "")) for k in ("status", "notes")) | |
| 331 | + for m in DATE_RE.finditer(blob): | |
| 332 | + d = m.group(0) | |
| 333 | + if d in seen: | |
| 334 | + continue | |
| 335 | + seen.add(d) | |
| 336 | + ctx = blob[max(0, m.start() - 90): m.end() + 90] | |
| 337 | + ctx = re.sub(r"\s+", " ", ctx).strip() | |
| 338 | + lines.append(f"- {d} — mention au registre : « …{ctx}… »") | |
| 339 | + lines.append("- 2026-08-18 — vague d'enrichissement : standardisation de la " | |
| 340 | + "documentation des connecteurs (fiche générée par " | |
| 341 | + "`scripts/gen_connector_docs.py`).") | |
| 342 | + return lines | |
| 343 | + | |
| 344 | + | |
| 345 | +def render_fiche(entry: dict, reg: list[dict], stats: dict, now: str) -> str: | |
| 346 | + sid = entry["source_id"] | |
| 347 | + agg = stats["agg"] | |
| 348 | + main = reg[0] if reg else {} | |
| 349 | + name = main.get("name") or sid | |
| 350 | + region = main.get("region") or "—" | |
| 351 | + etat = short_status(entry, reg) | |
| 352 | + | |
| 353 | + out = [f"# {name} — connecteur `{sid}`", ""] | |
| 354 | + out.append(f"_Fiche générée automatiquement par " | |
| 355 | + f"`scripts/gen_connector_docs.py` le {now} — ne pas éditer à la " | |
| 356 | + f"main, régénérer._") | |
| 357 | + out.append("") | |
| 358 | + out.append(f"**État : {etat}** · Région : {region} · Backend : " | |
| 359 | + f"{entry['backend_family']} · Annonces actives : " | |
| 360 | + f"{agg['act']}/{agg['total']}") | |
| 361 | + out.append("") | |
| 362 | + | |
| 363 | + # -- Description ------------------------------------------------------------ | |
| 364 | + out.append("## Description de la source") | |
| 365 | + out.append("") | |
| 366 | + desc = entry["banner"] or entry["class_doc"].splitlines()[0] if ( | |
| 367 | + entry["banner"] or entry["class_doc"]) else "" | |
| 368 | + if desc: | |
| 369 | + out.append(desc) | |
| 370 | + out.append("") | |
| 371 | + out.append(f"- **Site** : {main.get('url', '—')}") | |
| 372 | + out.append(f"- **Page des annonces** : {main.get('listing_url', '—')}") | |
| 373 | + if main.get("sectors"): | |
| 374 | + out.append(f"- **Secteurs couverts** : {main['sectors']}") | |
| 375 | + out.append(f"- **Module** : `{entry['path']}` — classe `{entry['class']}`") | |
| 376 | + if len(reg) > 1: | |
| 377 | + others = ", ".join(f"`{r['id']}` ({r.get('name', '')})" for r in reg[1:]) | |
| 378 | + out.append(f"- **Entrées additionnelles du registre couvertes** : {others}") | |
| 379 | + out.append("") | |
| 380 | + | |
| 381 | + # -- Accès -------------------------------------------------------------------- | |
| 382 | + out.append("## Accès") | |
| 383 | + out.append("") | |
| 384 | + out.append(f"- **Type d'accès** : {entry['flavor']}") | |
| 385 | + out.append(f"- **Endpoint de base** : {entry['endpoint'] or '—'}") | |
| 386 | + if entry["urls"]: | |
| 387 | + out.append("- **URLs de départ (constantes du module)** : " | |
| 388 | + + " · ".join(entry["urls"])) | |
| 389 | + out.append("- **Authentification** : aucune — contenu public" | |
| 390 | + + (" (clé Scrapfly côté Lou-Ka)" if entry["backend_family"] == | |
| 391 | + "Scrapfly" else | |
| 392 | + " (clé Firecrawl côté Lou-Ka)" if entry["backend_family"] == | |
| 393 | + "Firecrawl" else "")) | |
| 394 | + out.append(f"- **Pagination** : {entry['pagination']}") | |
| 395 | + out.append(f"- **Backend anti-bot / rendu** : {' ; '.join(entry['backends'])}") | |
| 396 | + out.append(f"- **Politesse** : {entry['request_delay']} s entre requêtes, " | |
| 397 | + f"timeout {entry['timeout']} s, User-Agent identifiable " | |
| 398 | + f"`LouKaBot/1.0 (+https://www.lou-ka.com/bot)`") | |
| 399 | + out.append("") | |
| 400 | + | |
| 401 | + # -- Champs ------------------------------------------------------------------- | |
| 402 | + out.append("## Champs récupérés → schéma cible") | |
| 403 | + out.append("") | |
| 404 | + out.append(f"Le connecteur ({entry['backend_family']}, {entry['flavor']}) " | |
| 405 | + f"alimente les colonnes de la table `listings`. Complétude " | |
| 406 | + f"mesurée en SQL sur les {agg['act']} annonces actives ; exemple " | |
| 407 | + f"tiré d'une ligne réelle de la BD.") | |
| 408 | + out.append("") | |
| 409 | + out.append("| Colonne `listings` | Contenu | Renseignée (actives) | Exemple réel |") | |
| 410 | + out.append("|---|---|---|---|") | |
| 411 | + sample = stats["sample"] | |
| 412 | + for col, label, _cond in FIELDS: | |
| 413 | + ex = example_value(col, sample[col]) if sample is not None else "—" | |
| 414 | + out.append(f"| `{col}` | {label} | {pct(agg[f'f_{col}'], agg['act'])} " | |
| 415 | + f"| {ex} |") | |
| 416 | + out.append("") | |
| 417 | + | |
| 418 | + # -- Fréquence & budget --------------------------------------------------------- | |
| 419 | + out.append("## Fréquence & budget") | |
| 420 | + out.append("") | |
| 421 | + cad = fmt_secs(stats["cadence"]) if stats["cadence"] else "—" | |
| 422 | + out.append(f"- **Cadence observée** (médiane des passages OK, sync_log) : {cad}") | |
| 423 | + lo = stats["last_ok"] | |
| 424 | + if lo: | |
| 425 | + out.append(f"- **Dernier passage OK** : {fmt_ts(lo['ts'])} — " | |
| 426 | + f"{lo['found'] or 0} trouvées, +{lo['added'] or 0} / " | |
| 427 | + f"~{lo['updated'] or 0} / -{lo['removed'] or 0}") | |
| 428 | + else: | |
| 429 | + out.append("- **Dernier passage OK** : aucun dans les 60 derniers runs") | |
| 430 | + out.append(f"- **Throttling** : {entry['request_delay']} s entre requêtes " | |
| 431 | + f"(constante de classe `request_delay`)") | |
| 432 | + out.append(f"- **Cache des pages détail (BD `detail_cache`)** : " | |
| 433 | + f"{'activé' if entry['use_detail_cache'] else 'désactivé'} — " | |
| 434 | + f"évite de re-visiter les fiches inchangées") | |
| 435 | + if entry["budgets"]: | |
| 436 | + caps = ", ".join(f"`{k}` = {v}" for k, v in sorted(entry["budgets"].items())) | |
| 437 | + out.append(f"- **Caps / budgets du module** : {caps}") | |
| 438 | + out.append("") | |
| 439 | + | |
| 440 | + # -- Volumétrie ------------------------------------------------------------------- | |
| 441 | + out.append("## Volumétrie & complétude") | |
| 442 | + out.append("") | |
| 443 | + out.append(f"- **Annonces en BD** : {agg['total']} au total, " | |
| 444 | + f"**{agg['act']} actives**") | |
| 445 | + out.append(f"- **Première ingestion** : {fmt_ts(agg['first_seen'])[:10]} · " | |
| 446 | + f"**Dernière observation** : {fmt_ts(agg['last_seen'])[:10]}") | |
| 447 | + out.append(f"- **Complétude clé (actives)** : GPS " | |
| 448 | + f"{pct(agg['f_lat'], agg['act'])} · prix " | |
| 449 | + f"{pct(agg['f_price'], agg['act'])} · photos " | |
| 450 | + f"{pct(agg['f_images'], agg['act'])} · description " | |
| 451 | + f"{pct(agg['f_description'], agg['act'])}") | |
| 452 | + out.append(f"- **Runs journalisés (60 derniers)** : {len(stats['runs'])}, " | |
| 453 | + f"dont {stats['err_count']} en erreur") | |
| 454 | + out.append("") | |
| 455 | + | |
| 456 | + # -- Erreurs ------------------------------------------------------------------------ | |
| 457 | + out.append("## Erreurs connues & dépannage") | |
| 458 | + out.append("") | |
| 459 | + if stats["errors"]: | |
| 460 | + out.append("| Date | Message (sync_log) |") | |
| 461 | + out.append("|---|---|") | |
| 462 | + for r in stats["errors"]: | |
| 463 | + out.append(f"| {fmt_ts(r['ts'])} | {esc(r['message'] or '', 160)} |") | |
| 464 | + out.append("") | |
| 465 | + else: | |
| 466 | + out.append("Aucune erreur dans les 60 derniers runs journalisés.") | |
| 467 | + out.append("") | |
| 468 | + status = main.get("status", "") | |
| 469 | + if status and not status.strip() == "actif": | |
| 470 | + out.append(f"**Note du registre** : {status}") | |
| 471 | + out.append("") | |
| 472 | + out.append(f"Rejouer la source seule : `python3 run.py sync {sid}` · " | |
| 473 | + f"vérifier ensuite `sync_log` (`SELECT * FROM sync_log WHERE " | |
| 474 | + f"source='{sid}' ORDER BY ts DESC LIMIT 5;`).") | |
| 475 | + out.append("") | |
| 476 | + | |
| 477 | + # -- Licence ------------------------------------------------------------------------ | |
| 478 | + out.append("## Licence, attribution & conditions") | |
| 479 | + out.append("") | |
| 480 | + out.append("- Scraping poli d'annonces **publiques** (données factuelles : " | |
| 481 | + "prix, adresse, disponibilité) publiées par le gestionnaire sur " | |
| 482 | + "son propre site.") | |
| 483 | + out.append("- User-Agent **identifiable** avec page d'information et " | |
| 484 | + "contact : `LouKaBot/1.0 (+https://www.lou-ka.com/bot; " | |
| 485 | + "contact@spboucher.ai)` ; throttling " | |
| 486 | + f"{entry['request_delay']} s ; cache détail pour minimiser les " | |
| 487 | + "requêtes.") | |
| 488 | + out.append("- Chaque annonce affichée sur Lou-Ka **pointe vers l'annonce " | |
| 489 | + "d'origine** (colonne `url`) — la source garde le trafic de " | |
| 490 | + "conversion.") | |
| 491 | + out.append("- Retrait sur demande : contact@spboucher.ai.") | |
| 492 | + out.append("") | |
| 493 | + | |
| 494 | + # -- Historique ---------------------------------------------------------------------- | |
| 495 | + out.append("## Historique") | |
| 496 | + out.append("") | |
| 497 | + out.extend(history_lines(reg, stats)) | |
| 498 | + out.append("") | |
| 499 | + return "\n".join(out) | |
| 500 | + | |
| 501 | + | |
| 502 | +# -- programme principal ----------------------------------------------------------- | |
| 503 | + | |
| 504 | +def main() -> None: | |
| 505 | + now = datetime.now().strftime("%Y-%m-%d %H:%M") | |
| 506 | + registry = json.loads(SOURCES_JSON.read_text(encoding="utf-8"))["sources"] | |
| 507 | + by_connector: dict[str, list[dict]] = {} | |
| 508 | + for r in registry: | |
| 509 | + key = r.get("connector") or "" | |
| 510 | + if key: | |
| 511 | + by_connector.setdefault(key, []).append(r) | |
| 512 | + # l'entrée dont id == connector d'abord (entrée « principale ») | |
| 513 | + for key, lst in by_connector.items(): | |
| 514 | + lst.sort(key=lambda r: (r["id"] != key, r["id"])) | |
| 515 | + | |
| 516 | + con = sqlite3.connect(DB_PATH) | |
| 517 | + con.row_factory = sqlite3.Row | |
| 518 | + | |
| 519 | + entries: list[dict] = [] | |
| 520 | + for path in sorted(CONN_DIR.glob("*.py")): | |
| 521 | + if path.stem in SKIP_MODULES: | |
| 522 | + continue | |
| 523 | + entries.extend(introspect_module(path)) | |
| 524 | + entries.sort(key=lambda e: e["source_id"]) | |
| 525 | + | |
| 526 | + DOCS_DIR.mkdir(parents=True, exist_ok=True) | |
| 527 | + for old in DOCS_DIR.glob("*.md"): | |
| 528 | + old.unlink() | |
| 529 | + | |
| 530 | + index_rows = [] | |
| 531 | + covered = set() | |
| 532 | + tot_active = 0 | |
| 533 | + for entry in entries: | |
| 534 | + sid = entry["source_id"] | |
| 535 | + reg = by_connector.get(sid) or by_connector.get(entry["module"]) or [] | |
| 536 | + for r in reg: | |
| 537 | + covered.add(r["id"]) | |
| 538 | + stats = db_stats(con, sid) | |
| 539 | + (DOCS_DIR / f"{sid}.md").write_text( | |
| 540 | + render_fiche(entry, reg, stats, now), encoding="utf-8") | |
| 541 | + agg = stats["agg"] | |
| 542 | + tot_active += agg["act"] or 0 | |
| 543 | + lo = stats["last_ok"] | |
| 544 | + main_r = reg[0] if reg else {} | |
| 545 | + index_rows.append( | |
| 546 | + f"| [`{sid}`]({sid}.md) | {esc(main_r.get('name', sid), 40)} " | |
| 547 | + f"| {esc(main_r.get('region', '—'), 20)} " | |
| 548 | + f"| {esc(entry['flavor'], 34)} | {entry['backend_family']} " | |
| 549 | + f"| {agg['act']}/{agg['total']} " | |
| 550 | + f"| {pct(agg['f_lat'], agg['act'])} " | |
| 551 | + f"| {pct(agg['f_price'], agg['act'])} " | |
| 552 | + f"| {pct(agg['f_images'], agg['act'])} " | |
| 553 | + f"| {esc(short_status(entry, reg), 26)} " | |
| 554 | + f"| {fmt_ts(lo['ts']) if lo else '—'} |") | |
| 555 | + | |
| 556 | + # INDEX.md ------------------------------------------------------------------ | |
| 557 | + n_act = sum(1 for e in entries if not e["disabled"]) | |
| 558 | + idx = [ | |
| 559 | + "# Lou-Ka — Index des connecteurs", "", | |
| 560 | + f"_Généré automatiquement par `scripts/gen_connector_docs.py` le {now} " | |
| 561 | + f"— ne pas éditer à la main, régénérer._", "", | |
| 562 | + f"**{len(entries)} connecteurs documentés** ({n_act} activés, " | |
| 563 | + f"{len(entries) - n_act} désactivés) · **{tot_active} annonces " | |
| 564 | + f"actives** au total · registre : {len(registry)} entrées.", "", | |
| 565 | + "| Connecteur | Nom | Région | Type d'accès | Backend | Actives/Total " | |
| 566 | + "| GPS | Prix | Photos | État | Dernier sync OK |", | |
| 567 | + "|---|---|---|---|---|---|---|---|---|---|---|", | |
| 568 | + ] | |
| 569 | + idx.extend(index_rows) | |
| 570 | + leftovers = [r for r in registry if r["id"] not in covered] | |
| 571 | + if leftovers: | |
| 572 | + idx += ["", "## Entrées du registre sans module connecteur", "", | |
| 573 | + "Sources recensées mais non connectées (voir le champ `status` " | |
| 574 | + "du registre pour la raison détaillée) :", ""] | |
| 575 | + for r in sorted(leftovers, key=lambda x: x["id"]): | |
| 576 | + reason = esc((r.get("status") or "").split("—")[0], 60) | |
| 577 | + idx.append(f"- `{r['id']}` — {esc(r.get('name', ''), 60)} " | |
| 578 | + f"({reason or '—'})") | |
| 579 | + idx.append("") | |
| 580 | + (DOCS_DIR / "INDEX.md").write_text("\n".join(idx), encoding="utf-8") | |
| 581 | + con.close() | |
| 582 | + print(f"[gen_connector_docs] {len(entries)} fiches + INDEX.md écrits dans " | |
| 583 | + f"{DOCS_DIR}") | |
| 584 | + | |
| 585 | + | |
| 586 | +if __name__ == "__main__": | |
| 587 | + main() | |
| 588 | ||