SPB Git

spb/lou-ka

Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

Expansion P3 — Outaouais (5 connecteurs +41 annonces, 10 non-connectables)

wandji (API /api/buildings découverte, 29) · gio (crawl-delay 3 respecté) ·
immnasr · quanta · leviu (portail Magex). Registre fusionné.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Simon-Pierre Boucher committed (Aug 9, 2026) parent f3d0e54 Browse files

82 changed files +12,412 −1

82 changed files
modified data/sources.json +1175 −1
@@ -1144,6 +1144,1180 @@
1144 1144 "connector": "urban_services",
1145 1145 "status": "actif",
1146 1146 "region": "Outaouais"
1147 + },
1148 + {
1149 + "id": "aalto",
1150 + "name": "Aalto Suites (Zibi / Dream)",
1151 + "url": "https://www.aaltosuites.ca",
1152 + "listing_url": "https://www.aaltosuites.ca/floorplans",
1153 + "sectors": "Gatineau (Hull — quartier Zibi)",
1154 + "connector": "aalto",
1155 + "status": "actif",
1156 + "region": "Outaouais"
1157 + },
1158 + {
1159 + "id": "agence_sherbrooke",
1160 + "name": "Agence de location Sherbrooke (groupe Prestiplex)",
1161 + "url": "https://agencedelocationsherbrooke.com",
1162 + "listing_url": "https://agencedelocationsherbrooke.com/",
1163 + "sectors": "Sherbrooke (Fleurimont, Mont-Bellevue, Les Nations), East Angus, Magog",
1164 + "connector": "agence_sherbrooke",
1165 + "status": "actif",
1166 + "region": "Estrie"
1167 + },
1168 + {
1169 + "id": "alouer_sherbrooke",
1170 + "name": "À Louer Sherbrooke",
1171 + "url": "https://www.alouersherbrooke.com",
1172 + "listing_url": "https://www.alouersherbrooke.com/appartements-a-louer/",
1173 + "sectors": "Sherbrooke (quartier Université)",
1174 + "connector": "alouer_sherbrooke",
1175 + "status": "actif",
1176 + "region": "Estrie"
1177 + },
1178 + {
1179 + "id": "appartements_rimouski",
1180 + "name": "Appartements Rimouski (Immeubles DTM)",
1181 + "url": "https://www.appartementsrimouski.com",
1182 + "listing_url": "https://www.appartementsrimouski.com/choisir-mon-logement",
1183 + "sectors": "Rimouski (Centre-ville, Rimouski-Est, Saint-Pie-X, Nazareth, Pointe-au-Père, Terrasse Arthur-Buies, Le Bic)",
1184 + "connector": "appartements_rimouski",
1185 + "status": "actif",
1186 + "region": "Bas-Saint-Laurent"
1187 + },
1188 + {
1189 + "id": "ascensio",
1190 + "name": "Groupe Ascensio",
1191 + "url": "https://groupeascensio.com",
1192 + "listing_url": "https://groupeascensio.com/logements-a-louer/",
1193 + "sectors": "Sherbrooke (Les Nations : Jacques-Cartier, Mont-Bellevue) — aussi Pont-Rouge (Capitale-Nationale)",
1194 + "connector": "ascensio",
1195 + "status": "actif",
1196 + "region": "Estrie"
1197 + },
1198 + {
1199 + "id": "atlas_immo",
1200 + "name": "Atlas société immobilière",
1201 + "url": "http://www.atlasimmo.ca",
1202 + "listing_url": "http://www.atlasimmo.ca/logements-a-louer-en-beauce.php",
1203 + "sectors": "Beauce : Saint-Georges, Saint-Victor, Notre-Dame-des-Pins — espaces commerciaux exclus",
1204 + "connector": "atlas_immo",
1205 + "status": "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",
1206 + "region": "Chaudière-Appalaches"
1207 + },
1208 + {
1209 + "id": "bestlife",
1210 + "name": "Les Gestions Bestlife",
1211 + "url": "https://lesgestionsbestlife.com",
1212 + "listing_url": "https://lesgestionsbestlife.com/appartements-a-louer-sherbrooke/",
1213 + "sectors": "Sherbrooke (Fleurimont, Mont-Bellevue, Rock Forest), East Angus, Richmond",
1214 + "connector": "bestlife",
1215 + "status": "actif",
1216 + "region": "Estrie"
1217 + },
1218 + {
1219 + "id": "boreal_abitibi",
1220 + "name": "Constructions Boréal Abitibi",
1221 + "url": "https://constructionsborealabitibi.com",
1222 + "listing_url": "https://constructionsborealabitibi.com/locations/",
1223 + "sectors": "Val-d'Or (3e Avenue, rue Giguère), Malartic (Dargis Ménard) — logements neufs",
1224 + "connector": "boreal_abitibi",
1225 + "status": "actif",
1226 + "region": "Abitibi-Témiscamingue"
1227 + },
1228 + {
1229 + "id": "carat_immobilier",
1230 + "name": "Carat Immobilier",
1231 + "url": "https://caratimmobilier.ca",
1232 + "listing_url": "https://caratimmobilier.ca/appartements/",
1233 + "sectors": "Rouyn-Noranda (quartiers Rouyn, Sacré-Cœur) — statuts « Loué » exclus",
1234 + "connector": "carat_immobilier",
1235 + "status": "actif",
1236 + "region": "Abitibi-Témiscamingue"
1237 + },
1238 + {
1239 + "id": "cite_immobilier",
1240 + "name": "Cité Immobilier",
1241 + "url": "https://citeimmobilier.com/accueil",
1242 + "listing_url": "https://citeimmobilier.com/immeubles",
1243 + "sectors": "Victoriaville",
1244 + "connector": "cite_immobilier",
1245 + "status": "actif",
1246 + "region": "Centre-du-Québec"
1247 + },
1248 + {
1249 + "id": "cosoltec",
1250 + "name": "Cosoltec (Evado, Le Monroe, Natür)",
1251 + "url": "https://www.cosoltec.com/fr",
1252 + "listing_url": "https://www.cosoltec.com/fr/espaces-disponibles",
1253 + "sectors": "Sainte-Thérèse, Blainville, Saint-Jérôme",
1254 + "connector": "cosoltec",
1255 + "status": "actif",
1256 + "region": "Laurentides"
1257 + },
1258 + {
1259 + "id": "custeau_centro",
1260 + "name": "Groupe Custeau / Espace Centro (Le MW)",
1261 + "url": "https://www.groupecusteau.com",
1262 + "listing_url": "https://espacecentro.com/appartements-le-mw/",
1263 + "sectors": "Sherbrooke (centre-ville — tour Le MW, 64+ unités)",
1264 + "status": "non connectable actuellement — le sélecteur de plans d'Espace Centro marque les 128 unités « rented » (0 disponible) ; les prix « à partir de » par type sont du marketing statique sans dispo ; re-vérifier en période de location (le connecteur vaudrait la peine si des unités se libèrent)",
1265 + "region": "Estrie"
1266 + },
1267 + {
1268 + "id": "desmarais",
1269 + "name": "Immeubles Desmarais",
1270 + "url": "https://www.immeublesdesmarais.ca",
1271 + "listing_url": "https://www.immeublesdesmarais.ca/logements",
1272 + "sectors": "Gatineau (Hull, Aylmer, Buckingham)",
1273 + "connector": "desmarais",
1274 + "status": "actif",
1275 + "region": "Outaouais"
1276 + },
1277 + {
1278 + "id": "dynamic",
1279 + "name": "Gestion immobilière Dynamic",
1280 + "url": "https://lesgestionsdynamic.com",
1281 + "listing_url": "https://lesgestionsdynamic.com/a-louer/",
1282 + "sectors": "Sherbrooke (Fleurimont, Les Nations), Magog",
1283 + "connector": "dynamic",
1284 + "status": "actif",
1285 + "region": "Estrie"
1286 + },
1287 + {
1288 + "id": "elite",
1289 + "name": "Elite Immobilier",
1290 + "url": "https://eliteimmobilier.ca",
1291 + "listing_url": "https://eliteimmobilier.ca/trouver-un-logement/",
1292 + "sectors": "Gatineau (Aylmer, Plateau)",
1293 + "connector": "elite",
1294 + "status": "actif",
1295 + "region": "Outaouais"
1296 + },
1297 + {
1298 + "id": "elk",
1299 + "name": "ELK Property Management",
1300 + "url": "http://www.elkproperty.com",
1301 + "listing_url": "http://www.elkproperty.com/residential_new.php?typeID=1",
1302 + "sectors": "Gatineau (Hull, Plateau)",
1303 + "connector": "elk",
1304 + "status": "actif",
1305 + "region": "Outaouais"
1306 + },
1307 + {
1308 + "id": "evoludev",
1309 + "name": "Groupe Evoludev",
1310 + "url": "https://location.groupeevoludev.com",
1311 + "listing_url": "https://location.groupeevoludev.com/",
1312 + "sectors": "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",
1313 + "connector": "evoludev",
1314 + "status": "actif",
1315 + "region": "Lanaudière"
1316 + },
1317 + {
1318 + "id": "floria",
1319 + "name": "Gestion Floria",
1320 + "url": "https://gestionfloria.ca",
1321 + "listing_url": "https://gestionfloria.ca/secteurs/",
1322 + "sectors": "Magog (Flanc-Sud/Mont-Orford, Solea), Sherbrooke (Plateau McCrea), Coaticook",
1323 + "connector": "floria",
1324 + "status": "actif",
1325 + "region": "Estrie"
1326 + },
1327 + {
1328 + "id": "forsa",
1329 + "name": "Gestion immobilière Forsa",
1330 + "url": "https://www.gestionforsa.com",
1331 + "listing_url": "https://www.gestionforsa.com/logements-disponibles",
1332 + "sectors": "Joliette, Saint-Charles-Borromée, Saint-Gabriel, Montréal",
1333 + "connector": "forsa",
1334 + "status": "actif",
1335 + "region": "Lanaudière"
1336 + },
1337 + {
1338 + "id": "garic",
1339 + "name": "Garic Gestion Immobilière",
1340 + "url": "https://garic.ca",
1341 + "listing_url": "https://garic.ca/a-louer/",
1342 + "sectors": "Gatineau (Hull, Vieux-Gatineau, Aylmer, Masson-Angers, Buckingham, Templeton), Thurso",
1343 + "connector": "garic",
1344 + "status": "actif",
1345 + "region": "Outaouais"
1346 + },
1347 + {
1348 + "id": "gestimmo_estrie",
1349 + "name": "Gestimmo Estrie",
1350 + "url": "https://gestimmoestrie.com",
1351 + "listing_url": "https://gestimmoestrie.com/a-louer/",
1352 + "sectors": "Sherbrooke (Fleurimont, Mont-Bellevue), Lennoxville, Coaticook, Magog",
1353 + "connector": "gestimmo_estrie",
1354 + "status": "actif",
1355 + "region": "Estrie"
1356 + },
1357 + {
1358 + "id": "gestion_fauvel",
1359 + "name": "Gestion Fauvel",
1360 + "url": "https://gestionfauvel.com",
1361 + "listing_url": "https://gestionfauvel.com/logements-a-louer/",
1362 + "sectors": "Drummondville, Saint-Léonard-d'Aston, Notre-Dame-du-Bon-Conseil",
1363 + "connector": "gestion_fauvel",
1364 + "status": "actif",
1365 + "region": "Centre-du-Québec"
1366 + },
1367 + {
1368 + "id": "gestion_habitation",
1369 + "name": "Gestion Habitation",
1370 + "url": "https://gestionhabitation.ca",
1371 + "listing_url": "https://gestionhabitation.ca/a-louer/",
1372 + "sectors": "Val-d'Or (Centre-ville, Val-des-Bois), Amos (Centre-ville), Malartic — cartes « NON DISPONIBLE » exclues",
1373 + "connector": "gestion_habitation",
1374 + "status": "actif",
1375 + "region": "Abitibi-Témiscamingue"
1376 + },
1377 + {
1378 + "id": "gestion_isr",
1379 + "name": "Gestion ISR",
1380 + "url": "https://www.gestion-isr.com",
1381 + "listing_url": "https://location.gestion-isr.com",
1382 + "sectors": "Drummondville, Saint-Nicéphore, Wickham, Notre-Dame-du-Bon-Conseil",
1383 + "connector": "gestion_isr",
1384 + "status": "actif",
1385 + "region": "Centre-du-Québec"
1386 + },
1387 + {
1388 + "id": "gestion_laprise",
1389 + "name": "Gestion Laprise",
1390 + "url": "https://gestionlaprise.com/immobilier/",
1391 + "listing_url": "https://gestionlaprise.com/immobilier/logement-statut/a-louer/",
1392 + "sectors": "Baie-Comeau, Forestville (Haute-Côte-Nord) — location 31 jours et plus ; unités hôtelières (nuitée) et locaux commerciaux exclus",
1393 + "connector": "gestion_laprise",
1394 + "status": "actif",
1395 + "region": "Côte-Nord"
1396 + },
1397 + {
1398 + "id": "gestion_legrand",
1399 + "name": "Gestion Le Grand",
1400 + "url": "https://gestionlegrand.ca",
1401 + "listing_url": "https://gestionlegrand.ca/a-louer/",
1402 + "sectors": "Drummondville, Saint-Nicéphore",
1403 + "connector": "gestion_legrand",
1404 + "status": "actif",
1405 + "region": "Centre-du-Québec"
1406 + },
1407 + {
1408 + "id": "gestion_traversy",
1409 + "name": "Gestion Immobilière Lionel Traversy",
1410 + "url": "https://gestionltraversy.com",
1411 + "listing_url": "https://gestionltraversy.com/logements-a-louer/",
1412 + "sectors": "Trois-Rivières, Drummondville, Laval",
1413 + "connector": "",
1414 + "status": "non connectable — 0 logement résidentiel publié : la page /logements-a-louer/ (blocs texte manuels, thème WPResidence) n'affiche qu'une annonce de bureaux commerciaux (exclue)",
1415 + "region": "Centre-du-Québec"
1416 + },
1417 + {
1418 + "id": "gestion_valco",
1419 + "name": "Gestion Valco",
1420 + "url": "https://gestionvalco.ca",
1421 + "listing_url": "https://gestionvalco.ca/logements-a-louer/",
1422 + "sectors": "Trois-Rivières, Shawinigan, Nicolet, Louiseville, Saint-Narcisse",
1423 + "connector": "gestion_valco",
1424 + "status": "actif",
1425 + "region": "Mauricie"
1426 + },
1427 + {
1428 + "id": "gia_t",
1429 + "name": "GIA-T — Gestion Immobilière Abitibi-Témiscamingue",
1430 + "url": "https://gia-t.com",
1431 + "listing_url": "https://gia-t.com/location/",
1432 + "sectors": "Rouyn-Noranda (Vieux Noranda, centre-ville, secteur Cégep/UQAT) — locaux commerciaux exclus",
1433 + "connector": "gia_t",
1434 + "status": "actif",
1435 + "region": "Abitibi-Témiscamingue"
1436 + },
1437 + {
1438 + "id": "girs",
1439 + "name": "GIRS — Gestion Immobilière de la Rive Sud",
1440 + "url": "https://www.girs.ca",
1441 + "listing_url": "https://www.girs.ca/location",
1442 + "sectors": "Scott, Saint-Isidore, La Guadeloupe (Chaudière-Appalaches) + Carleton-sur-Mer, New Richmond (Gaspésie)",
1443 + "connector": "girs",
1444 + "status": "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)",
1445 + "region": "Chaudière-Appalaches"
1446 + },
1447 + {
1448 + "id": "godbout",
1449 + "name": "Gestion A. Godbout",
1450 + "url": "https://appartementsgranby.com",
1451 + "listing_url": "https://appartementsgranby.com/nos-immeubles/",
1452 + "sectors": "Granby (Terrasse Haute-Ville 125 et 135, rue St-Michel)",
1453 + "status": "non connectable actuellement — plateforme « plogg immobilier » : les tableaux d'appartements des 2 immeubles affichent 100% COMPLET / PAS DISPONIBLE, aucun loyer publié (colonne $ vide) et la recherche (form-manager.php) renvoie 403 ; re-vérifier quand des unités se libèrent",
1454 + "region": "Montérégie"
1455 + },
1456 + {
1457 + "id": "groupe_jacques",
1458 + "name": "Groupe Jacques",
1459 + "url": "https://www.groupejacques.com",
1460 + "listing_url": "https://www.groupejacques.com/fr/appartements/appartements-a-louer/",
1461 + "sectors": "Victoriaville",
1462 + "connector": "groupe_jacques",
1463 + "status": "actif",
1464 + "region": "Centre-du-Québec"
1465 + },
1466 + {
1467 + "id": "groupe_robin",
1468 + "name": "Groupe Robin",
1469 + "url": "https://grouperobin.com",
1470 + "listing_url": "https://grouperobin.com/appartement/",
1471 + "sectors": "Trois-Rivières (District 55), Saint-Hyacinthe",
1472 + "connector": "groupe_robin",
1473 + "status": "actif",
1474 + "region": "Mauricie"
1475 + },
1476 + {
1477 + "id": "groupe_theoret",
1478 + "name": "Groupe Théorêt (Gestion Immobilière)",
1479 + "url": "https://locationappartement.ca",
1480 + "listing_url": "https://locationappartement.ca/appartements-%C3%A0-louer",
1481 + "sectors": "Shawinigan, Grand-Mère, Terrebonne, Charlemagne, Laval, Montréal, Sainte-Thérèse",
1482 + "connector": "groupe_theoret",
1483 + "status": "actif",
1484 + "region": "Mauricie"
1485 + },
1486 + {
1487 + "id": "habitat_honguedo",
1488 + "name": "Habitat Honguedo",
1489 + "url": "https://habitat-honguedo.com",
1490 + "listing_url": "https://habitat-honguedo.com/appartements-a-louer-a-gaspe/",
1491 + "sectors": "Gaspé (centre-ville, rue Baker) — 3½ à 5½, électricité/chauffage/stationnement inclus",
1492 + "connector": null,
1493 + "status": "non connectable — page « Appartements à louer » en texte libre affichant « Aucun appartement disponible pour le moment » depuis juillet 2020 (dernière mise à jour : 19 février 2024) ; aucun format d'annonce structuré observable, y compris dans tous les instantanés Wayback 2021-2024 — impossible d'écrire un parseur fiable. À re-vérifier périodiquement (acteur dominant du long terme à Gaspé)",
1494 + "region": "Gaspésie"
1495 + },
1496 + {
1497 + "id": "habitations_jeanne",
1498 + "name": "Les Habitations Jeanne",
1499 + "url": "https://www.leshabitationsjeanne.com",
1500 + "listing_url": "https://www.leshabitationsjeanne.com/appartements-meubles",
1501 + "sectors": "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",
1502 + "connector": "habitations_jeanne",
1503 + "status": "actif",
1504 + "region": "Côte-Nord"
1505 + },
1506 + {
1507 + "id": "hestia",
1508 + "name": "Hestia Groupe immobilier",
1509 + "url": "https://www.gestionhestia.com",
1510 + "listing_url": "https://www.gestionhestia.com/location/",
1511 + "sectors": "Trois-Rivières",
1512 + "connector": "hestia",
1513 + "status": "actif",
1514 + "region": "Mauricie"
1515 + },
1516 + {
1517 + "id": "immeubles_aeb",
1518 + "name": "Immeubles AEB",
1519 + "url": "https://immeublesaeb.com",
1520 + "listing_url": "https://immeublesaeb.com/logements",
1521 + "sectors": "Saguenay (Chicoutimi, Jonquière, Arvida, La Baie, Laterrière) + St-Honoré — lofts, chambres et 2½–6½, volet logement étudiant",
1522 + "connector": "immeubles_aeb",
1523 + "status": "actif",
1524 + "region": "Saguenay–Lac-Saint-Jean"
1525 + },
1526 + {
1527 + "id": "immeubles_db",
1528 + "name": "Les Immeubles D.B. Busque-Massé",
1529 + "url": "https://immeublesdb.com",
1530 + "listing_url": "https://immeublesdb.com/logements-a-louer/",
1531 + "sectors": "Sherbrooke (secteurs Nord, Est, Centre-ville, Ouest)",
1532 + "connector": "immeubles_db",
1533 + "status": "actif",
1534 + "region": "Estrie"
1535 + },
1536 + {
1537 + "id": "immeubles_dcl",
1538 + "name": "Les Immeubles DCL",
1539 + "url": "https://www.lesimmeublesdcl.com",
1540 + "listing_url": "https://www.lesimmeublesdcl.com/logements-a-louer",
1541 + "sectors": "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",
1542 + "connector": "immeubles_dcl",
1543 + "status": "actif",
1544 + "region": "Abitibi-Témiscamingue"
1545 + },
1546 + {
1547 + "id": "immeubles_ouellet",
1548 + "name": "Les Immeubles Vianney Ouellet & Fils",
1549 + "url": "https://immeublesouellet.com",
1550 + "listing_url": "https://immeublesouellet.com/location/",
1551 + "sectors": "Rimouski (secteurs Cégep/Institut Maritime/Hôpital, Paul-Hubert, UQAR, résidentiel — 28 immeubles) — commercial exclu",
1552 + "connector": "immeubles_ouellet",
1553 + "status": "actif — parc quasi plein : 1 unité libre sur 81 le 2026-08-09, volume normalement faible",
1554 + "region": "Bas-Saint-Laurent"
1555 + },
1556 + {
1557 + "id": "immofidelite",
1558 + "name": "Groupe Immobilier Fidélité",
1559 + "url": "https://www.immofidelite.com",
1560 + "listing_url": "https://www.immofidelite.com/residentiel-a-louer/appartementslogements/",
1561 + "sectors": "Thetford Mines",
1562 + "connector": null,
1563 + "status": "non connectable — aucune annonce résidentielle de marché : l'unique propriété « à louer » du site (constante de 2021 à 2026 d'après la Wayback Machine) est le Village Liberté, une résidence pour retraités avec services (repas, surveillance médicale) hors périmètre Lou-Ka, publiée sans prix ni unités ; les catégories condos/maisons à louer sont vides et le reste du catalogue est commercial ou à vendre. À re-vérifier périodiquement",
1564 + "region": "Chaudière-Appalaches"
1565 + },
1566 + {
1567 + "id": "immogex",
1568 + "name": "Immogex",
1569 + "url": "https://immogex.com",
1570 + "listing_url": "https://immogex.com/%C3%A0-louer",
1571 + "sectors": "Drummondville",
1572 + "connector": "immogex",
1573 + "status": "actif",
1574 + "region": "Centre-du-Québec"
1575 + },
1576 + {
1577 + "id": "info_logement",
1578 + "name": "Info-Logement",
1579 + "url": "https://www.info-logement.com",
1580 + "listing_url": "https://www.info-logement.com/logements/tous",
1581 + "sectors": "Joliette, Saint-Charles-Borromée, Notre-Dame-des-Prairies, Berthierville",
1582 + "connector": "info_logement",
1583 + "status": "actif",
1584 + "region": "Lanaudière"
1585 + },
1586 + {
1587 + "id": "jutras",
1588 + "name": "Habitations Jutras",
1589 + "url": "https://jutras.com",
1590 + "listing_url": "https://jutras.com/condos-a-louer/",
1591 + "sectors": "Drummondville, Nicolet, Notre-Dame-du-Bon-Conseil, Sherbrooke, East Angus",
1592 + "connector": "jutras",
1593 + "status": "actif",
1594 + "region": "Centre-du-Québec"
1595 + },
1596 + {
1597 + "id": "kass",
1598 + "name": "KASS Property Management",
1599 + "url": "https://kassproperties.com",
1600 + "listing_url": "https://kassproperties.com/city/gatineau/",
1601 + "sectors": "Gatineau (Hull, Aylmer)",
1602 + "connector": "kass",
1603 + "status": "actif",
1604 + "region": "Outaouais"
1605 + },
1606 + {
1607 + "id": "katasa",
1608 + "name": "Groupe Katasa",
1609 + "url": "https://katasa.ca",
1610 + "listing_url": "https://katasa.ca/portfolio_cat/apartments/",
1611 + "sectors": "Gatineau (Aylmer)",
1612 + "connector": "katasa",
1613 + "status": "actif",
1614 + "region": "Outaouais"
1615 + },
1616 + {
1617 + "id": "labonte",
1618 + "name": "Gestion Labonté",
1619 + "url": "https://www.gestionlabonte.com",
1620 + "listing_url": "https://www.gestionlabonte.com/logements",
1621 + "sectors": "Sherbrooke (Centre-ville, Est, Ouest)",
1622 + "connector": "labonte",
1623 + "status": "actif",
1624 + "region": "Estrie"
1625 + },
1626 + {
1627 + "id": "lacite",
1628 + "name": "La Cité Gatineau (Adam Real Estate)",
1629 + "url": "https://lacitegatineau.com",
1630 + "listing_url": "https://lacitegatineau.com/plans-des-appartements/",
1631 + "sectors": "Gatineau",
1632 + "connector": "lacite",
1633 + "status": "actif",
1634 + "region": "Outaouais"
1635 + },
1636 + {
1637 + "id": "le_baronet",
1638 + "name": "Le Baronet",
1639 + "url": "https://lebaronet.com",
1640 + "listing_url": "https://lebaronet.com/etage-1/",
1641 + "sectors": "Sainte-Marie (angle rue Notre-Dame Sud / rue Baronet — 87 condos locatifs en 2 phases)",
1642 + "connector": "le_baronet",
1643 + "status": "actif",
1644 + "region": "Chaudière-Appalaches"
1645 + },
1646 + {
1647 + "id": "lelaureat",
1648 + "name": "Résidences Le Lauréat",
1649 + "url": "https://www.residences-lelaureat.com",
1650 + "listing_url": "https://www.residences-lelaureat.com/",
1651 + "sectors": "Sherbrooke (quartier Université — 2145, Galt Ouest)",
1652 + "connector": "lelaureat",
1653 + "status": "actif",
1654 + "region": "Estrie"
1655 + },
1656 + {
1657 + "id": "location_saguenay",
1658 + "name": "Location Saguenay",
1659 + "url": "https://locationsaguenay.com",
1660 + "listing_url": "https://locationsaguenay.com/appartement-a-louer-chicoutimi/",
1661 + "sectors": "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",
1662 + "connector": "location_saguenay",
1663 + "status": "actif",
1664 + "region": "Saguenay–Lac-Saint-Jean"
1665 + },
1666 + {
1667 + "id": "logement_mauricie",
1668 + "name": "Logement Mauricie (regroupement de propriétaires)",
1669 + "url": "http://logementmauricie.com",
1670 + "listing_url": "http://logementmauricie.com/trois-rivieres/",
1671 + "sectors": "Trois-Rivières, Cap-de-la-Madeleine, Shawinigan, Shawinigan-Sud",
1672 + "connector": "logement_mauricie",
1673 + "status": "actif",
1674 + "region": "Mauricie"
1675 + },
1676 + {
1677 + "id": "logispro",
1678 + "name": "LogisPro Rimouski",
1679 + "url": "https://logisprorimouski.com",
1680 + "listing_url": "https://logisprorimouski.com/nos-logements/",
1681 + "sectors": "Rimouski (rue William-Price/parc Beauséjour, rue St-Laurent Ouest, rue Saint-Jean-Baptiste Est)",
1682 + "connector": "logispro",
1683 + "status": "actif",
1684 + "region": "Bas-Saint-Laurent"
1685 + },
1686 + {
1687 + "id": "matinale",
1688 + "name": "Gestion Matinale",
1689 + "url": "https://gestionmatinale.com",
1690 + "listing_url": "https://gestionmatinale.com/a-louer/appartements-logements/",
1691 + "sectors": "Sherbrooke, Magog, Orford, Sainte-Catherine-de-Hatley, Stukely-Sud",
1692 + "connector": "matinale",
1693 + "status": "actif",
1694 + "region": "Estrie"
1695 + },
1696 + {
1697 + "id": "may_bourg",
1698 + "name": "Gestion May Bourg",
1699 + "url": "https://maybourg.com",
1700 + "listing_url": "https://maybourg.com/repertoire-de-logements/",
1701 + "sectors": "Bécancour",
1702 + "connector": "may_bourg",
1703 + "status": "actif",
1704 + "region": "Centre-du-Québec"
1705 + },
1706 + {
1707 + "id": "medway",
1708 + "name": "Groupe Medway",
1709 + "url": "https://condosmedway.ca",
1710 + "listing_url": "https://condosmedway.ca/condos-a-louer/",
1711 + "sectors": "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",
1712 + "connector": "medway",
1713 + "status": "actif",
1714 + "region": "Bas-Saint-Laurent"
1715 + },
1716 + {
1717 + "id": "mka",
1718 + "name": "MKA Gestion Immobilière",
1719 + "url": "https://mkagestion.com",
1720 + "listing_url": "https://mkagestion.com/nos-immeubles/?type=a-louer",
1721 + "sectors": "Granby (Faubourg du Séminaire), Sherbrooke",
1722 + "status": "non connectable — fiches immeubles de type brochure : le filtre ?type=a-louer ne filtre rien côté serveur (8 immeubles identiques), aucune disponibilité, aucun prix, aucun type d'unité structuré, CTA « Nous contacter » sans lien ; rien d'exploitable sans inventer",
1723 + "region": "Montérégie"
1724 + },
1725 + {
1726 + "id": "mkar",
1727 + "name": "Gestion Immobilière MKAR",
1728 + "url": "https://gestionimmobilieremkar.ca",
1729 + "listing_url": "https://gestionimmobilieremkar.ca/proprietes-gestion-immobiliere-mkar/",
1730 + "sectors": "Saguenay (Jonquière, Chicoutimi, La Baie, Lac Kénogami) + Alma et Chambord — 2½–6½, lofts, chambres/colocation ; prix jamais publiés par la source",
1731 + "connector": "mkar",
1732 + "status": "actif",
1733 + "region": "Saguenay–Lac-Saint-Jean"
1734 + },
1735 + {
1736 + "id": "montagnais",
1737 + "name": "Le Montagnais, résidences étudiantes",
1738 + "url": "https://www.lemontagnais.com",
1739 + "listing_url": "https://www.lemontagnais.com/logement/",
1740 + "sectors": "Sherbrooke (Campus principal, Campus de la santé, Campus Centro, Campus Mont-Bellevue, Résidences E et G)",
1741 + "connector": "montagnais",
1742 + "status": "actif",
1743 + "region": "Estrie"
1744 + },
1745 + {
1746 + "id": "morin",
1747 + "name": "Constructions Morin",
1748 + "url": "https://constructionsmorin.com",
1749 + "listing_url": "https://constructionsmorin.com/appartements-a-louer/",
1750 + "sectors": "Sherbrooke (St-Élie/Rock-Forest, Fleurimont), Ascot Corner, East Angus, Windsor, Lac-Mégantic",
1751 + "connector": "morin",
1752 + "status": "actif",
1753 + "region": "Estrie"
1754 + },
1755 + {
1756 + "id": "nicolyn",
1757 + "name": "Société Nicolyn",
1758 + "url": "https://societenicolyn.com",
1759 + "listing_url": "https://societenicolyn.com/recherche/",
1760 + "sectors": "Trois-Rivières, Cap-de-la-Madeleine, Gentilly, Victoriaville",
1761 + "connector": "",
1762 + "status": "non connectable — 0 annonce publiée sur le site (le moteur de recherche interne, post_type locator, retourne « Aucun résultat disponible ») ; le lien « Appartements à louer » redirige vers Facebook Marketplace ; les pages d'immeubles ne publient ni prix ni vacances",
1763 + "region": "Mauricie"
1764 + },
1765 + {
1766 + "id": "novelo",
1767 + "name": "Les Appartements Novelo",
1768 + "url": "https://appartementsnovelo.com",
1769 + "listing_url": "https://appartementsnovelo.com/louer-un-appartement/",
1770 + "sectors": "Saguenay (Jonquière/Arvida — rue Langelier) — lofts, 3½, 4½ et 5½ rénovés, offre par type avec prix « à partir de »",
1771 + "connector": "novelo",
1772 + "status": "actif",
1773 + "region": "Saguenay–Lac-Saint-Jean"
1774 + },
1775 + {
1776 + "id": "odyssee",
1777 + "name": "Groupe Odyssée (Le Vivo, Novium, Quantum…)",
1778 + "url": "https://www.groupeodyssee.com",
1779 + "listing_url": "https://www.groupeodyssee.com/projets-locatifs-neufs/",
1780 + "sectors": "Sherbrooke (Rock Forest, Fleurimont, Jacques-Cartier, Plateau McCrea, Université)",
1781 + "status": "non connectable — le corporatif et les 10 pages portfolio sont des brochures de projets sans disponibilités ni prix ; le microsite levivosherbrooke.com vérifié est aussi une vitrine sans inventaire ; re-vérifier si un module de disponibilités apparaît",
1782 + "region": "Estrie"
1783 + },
1784 + {
1785 + "id": "osgoode",
1786 + "name": "Osgoode Properties",
1787 + "url": "https://www.osgoodeproperties.com",
1788 + "listing_url": "https://www.osgoodeproperties.com/apartments-for-rent-gatineau",
1789 + "sectors": "Gatineau (Hull)",
1790 + "connector": "osgoode",
1791 + "status": "actif",
1792 + "region": "Outaouais"
1793 + },
1794 + {
1795 + "id": "prestiplex",
1796 + "name": "Prestiplex",
1797 + "url": "https://prestiplex.com",
1798 + "listing_url": "https://prestiplex.com/nos-logements-a-louer/",
1799 + "sectors": "Sherbrooke, Magog, East Angus",
1800 + "status": "non connectable — le site n'affiche plus d'inventaire (ancienne page d'annonces en 404, sitemap property réduit à une fiche « test ») ; le portail actif du groupe est agencedelocationsherbrooke.com, couvert par le connecteur agence_sherbrooke",
1801 + "region": "Estrie"
1802 + },
1803 + {
1804 + "id": "projection_immo",
1805 + "name": "Projection Immobilière",
1806 + "url": "https://www.projectionimmobiliere.com",
1807 + "listing_url": "https://www.projectionimmobiliere.com/residentiel",
1808 + "sectors": "Amqui (15 immeubles), Matane (10), Rimouski (2) — granularité immeuble, sans prix ; commercial (Lac-au-Saumon) et court terme exclus",
1809 + "connector": "projection_immo",
1810 + "status": "actif — 1 immeuble disponible le 2026-08-09 ; parc quasi plein, volume normalement faible",
1811 + "region": "Bas-Saint-Laurent"
1812 + },
1813 + {
1814 + "id": "proplex",
1815 + "name": "Gestion immobilière Proplex (Immobilier 3C)",
1816 + "url": "https://gestionimmobiliereproplex.com",
1817 + "listing_url": "https://gestionimmobiliereproplex.com/a-louer/",
1818 + "sectors": "Saint-Jérôme (Bellefeuille), Blainville (Chambéry), Mirabel (Saint-Canut)",
1819 + "connector": "",
1820 + "status": "non connectable — la page /a-louer/ ne pointe que vers 3 billets WordPress de mars 2023 (St-Jérôme, Blainville, Mirabel) contenant seulement secteur + téléphone : aucun prix, type d'unité, disponibilité ni annonce par logement (pages EN identiques)",
1821 + "region": "Laurentides"
1822 + },
1823 + {
1824 + "id": "serviceplus",
1825 + "name": "Gestion immobilière Service Plus",
1826 + "url": "https://appartsherbrooke.com",
1827 + "listing_url": "https://appartsherbrooke.com/rechercher-un-appartement/",
1828 + "sectors": "Sherbrooke (8 immeubles : Candiac, Wilson, Cabana, Fraser…)",
1829 + "status": "non connectable actuellement — même plateforme « plogg immobilier » que Gestion A. Godbout : les 8 pages immeuble ont des tableaux d'appartements VIDES (0 ligne), aucun prix publié, et le POST du formulaire de recherche renvoie 403 ; re-vérifier périodiquement",
1830 + "region": "Estrie"
1831 + },
1832 + {
1833 + "id": "siagi",
1834 + "name": "SIA Gestion Immobilière",
1835 + "url": "https://www.siagi.ca",
1836 + "listing_url": "https://www.siagi.ca/listings",
1837 + "sectors": "Sherbrooke — aussi Laval et La Prairie (Grand Montréal)",
1838 + "connector": "siagi",
1839 + "status": "actif",
1840 + "region": "Estrie"
1841 + },
1842 + {
1843 + "id": "souleymane",
1844 + "name": "Gestion Souleymane",
1845 + "url": "https://gestionsouleymane.com",
1846 + "listing_url": "https://gestionsouleymane.com/a-louer",
1847 + "sectors": "Gatineau (Hull, Aylmer, Masson-Angers, Buckingham, Plateau)",
1848 + "connector": "souleymane",
1849 + "status": "actif",
1850 + "region": "Outaouais"
1851 + },
1852 + {
1853 + "id": "stb_immobilier",
1854 + "name": "STB Immobilier",
1855 + "url": "https://stbimmobilier.com",
1856 + "listing_url": "https://stbimmobilier.com/locations-residentielles/",
1857 + "sectors": "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",
1858 + "connector": "stb_immobilier",
1859 + "status": "actif",
1860 + "region": "Bas-Saint-Laurent"
1861 + },
1862 + {
1863 + "id": "uptimo",
1864 + "name": "Uptimo Gestion immobilière",
1865 + "url": "https://www.uptimo.ca",
1866 + "listing_url": "https://www.uptimo.ca/logements-a-louer/",
1867 + "sectors": "Sherbrooke (Fleurimont, Mont-Bellevue, Jacques-Cartier), Magog",
1868 + "connector": "uptimo",
1869 + "status": "actif",
1870 + "region": "Estrie"
1871 + },
1872 + {
1873 + "id": "gio",
1874 + "name": "Gestion Immobilière de l'Outaouais (GIO)",
1875 + "url": "https://gioinc.ca",
1876 + "listing_url": "https://gioinc.ca/a-louer/",
1877 + "sectors": "Gatineau (Plateau, Hull — boul. du Plateau, av. des Oliviers)",
1878 + "connector": "gio",
1879 + "status": "actif",
1880 + "region": "Outaouais"
1881 + },
1882 + {
1883 + "id": "hro",
1884 + "name": "Habitations des Rivières de l'Outaouais",
1885 + "url": "https://habitationsrivieresoutaouais.com",
1886 + "listing_url": "https://habitationsrivieresoutaouais.com/nos-logements/",
1887 + "sectors": "Gatineau, Aylmer, Hull, Buckingham, Masson-Angers",
1888 + "connector": null,
1889 + "status": "non connectable — fiches immeubles de type brochure (rue Larouche, rue Maclaren…) : description du bâtiment et typologies « 1cc/2cc/3cc » mais aucune unité disponible, aucun loyer ni disponibilité ; parc communautaire (programme Accès-Logis SHQ) attribué par demande, pas d'annonces de marché",
1890 + "region": "Outaouais"
1891 + },
1892 + {
1893 + "id": "immnasr",
1894 + "name": "Les Immeubles Michel Nazair",
1895 + "url": "https://www.immnasr.com",
1896 + "listing_url": "https://www.immnasr.com/ (section À LOUER en accueil)",
1897 + "sectors": "Gatineau (Mont-Fleuri, Val-Tétreau, Côte d'Azur)",
1898 + "connector": "immnasr",
1899 + "status": "actif — très petit parc (3 fiches le 2026-08-09), mais fiches complètes (loyer, dispo, chambres, surface, photos)",
1900 + "region": "Outaouais"
1901 + },
1902 + {
1903 + "id": "immotop",
1904 + "name": "ImmoTop",
1905 + "url": "https://immotop.ca",
1906 + "listing_url": "https://immotop.ca/ (pages projets Desrosiers, Nuvo, Oasis)",
1907 + "sectors": "Gatineau (Templeton, Plateau, Aylmer) + Ottawa",
1908 + "connector": null,
1909 + "status": "non connectable — gros parc en gestion (Desrosiers 192 log., Nuvo 504, Oasis…) mais AUCUNE annonce publique : les pages projets sont des ancres marketing sans prix ni disponibilité, seul un formulaire « demande de location » existe ; garder en veille, gros gain potentiel si un inventaire s'ouvre",
1910 + "region": "Outaouais"
1911 + },
1912 + {
1913 + "id": "leviu",
1914 + "name": "Le VIU / VIU2 (Groupe Heafey)",
1915 + "url": "https://www.leviu.ca",
1916 + "listing_url": "https://peweb.magextechnologies.com/RentalListings/Lsae1/Groupe-Heafey",
1917 + "sectors": "Gatineau (Hull, centre-ville — 199, rue Laurier)",
1918 + "connector": "leviu",
1919 + "status": "actif — inventaire des unités disponibles via le portail Proprio Expert (Magex) ; distinct du connecteur heafey (Resimo, We 2/We 3/Loggia)",
1920 + "region": "Outaouais"
1921 + },
1922 + {
1923 + "id": "lib_emd",
1924 + "name": "Lib Aylmer (EMD-Bâtimo)",
1925 + "url": "https://lelib.ca",
1926 + "listing_url": "https://lelib.ca/lib-aylmer/",
1927 + "sectors": "Gatineau (Aylmer — 200, boul. Wilfrid-Lavigne) ; complexe 55+",
1928 + "connector": null,
1929 + "status": "non connectable — site vitrine sans inventaire : la page Lib Aylmer annonce « 160 condos locatifs, 2½ au 5½, occupation immédiate » et une promo « 2 mois gratuits », mais ne publie ni prix, ni liste d'unités, ni disponibilités (location par formulaire/téléphone) ; idem pour les autres complexes Lib. EMD-Bâtimo est déjà couvert côté Équinoxe (equinoxe_batimo)",
1930 + "region": "Outaouais"
1931 + },
1932 + {
1933 + "id": "maitre_carre",
1934 + "name": "Maître Carré",
1935 + "url": "https://maitrecarre.ca",
1936 + "listing_url": null,
1937 + "sectors": "Gatineau (présence locative signalée par guidehabitation.ca)",
1938 + "connector": null,
1939 + "status": "non connectable — site corporatif (projets, impact, expertises, certification BCorp) sans aucune section d'annonces résidentielles à louer : aucun prix, aucune unité, aucune page de location identifiable",
1940 + "region": "Outaouais"
1941 + },
1942 + {
1943 + "id": "mcs5",
1944 + "name": "Groupe MCS5",
1945 + "url": "https://groupemcs5.com",
1946 + "listing_url": "https://groupemcs5.com/fr/logements-a-louer-gatineau-aylmer-hull-outaouais",
1947 + "sectors": "Gatineau, Aylmer, Hull",
1948 + "connector": null,
1949 + "status": "non connectable — la page « Location de logements » ne contient aucun inventaire (texte marketing « centaines de portes » + bouton « Contactez-nous ») : aucun prix, aucune fiche, aucune annonce au 2026-08-09 ; à re-vérifier périodiquement",
1950 + "region": "Outaouais"
1951 + },
1952 + {
1953 + "id": "mkg_prestige",
1954 + "name": "MK Gestion Prestige",
1955 + "url": "https://mkgprestige.com",
1956 + "listing_url": "https://mkgprestige.com/trouver-un-logement/",
1957 + "sectors": "Outaouais / Gatineau",
1958 + "connector": null,
1959 + "status": "non connectable — page « Trouver un logement » (filtres secteur/prix/espace + carte) sans aucune propriété publiée : l'endpoint AJAX du thème (admin-ajax, action filterEntreprises) retourne une liste vide (maxPages 0) et le CPT WordPress « proprietes » exposé en REST est vide ; rien à parser sans inventer. À re-vérifier périodiquement",
1960 + "region": "Outaouais"
1961 + },
1962 + {
1963 + "id": "penates",
1964 + "name": "Gestion Immobilière Pénates et Lares",
1965 + "url": "https://gestionimmobilierepl.com",
1966 + "listing_url": "https://gestionimmobilierepl.com/%C3%A0-louer-%C3%A0-gatineau",
1967 + "sectors": "Gatineau, Hull, Aylmer, Chelsea, Cantley, Val-des-Monts, Thurso, Masson-Angers, Buckingham",
1968 + "connector": null,
1969 + "status": "non connectable — l'ancienne page /à-louer répond 404 (GoDaddy) et la page restante « À louer à Gatineau » est un texte purement SEO/marketing : aucune annonce, aucun prix, aucune fiche de logement",
1970 + "region": "Outaouais"
1971 + },
1972 + {
1973 + "id": "quanta",
1974 + "name": "Gestion Quanta",
1975 + "url": "https://gestionquanta.ca",
1976 + "listing_url": "https://gestionquanta.ca/",
1977 + "sectors": "Gatineau (Hull, Plateau, Côte d'Azur, Aylmer)",
1978 + "connector": "quanta",
1979 + "status": "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)",
1980 + "region": "Outaouais"
1981 + },
1982 + {
1983 + "id": "six80",
1984 + "name": "Appartements Six80",
1985 + "url": "https://appartementsix80.com",
1986 + "listing_url": "https://appartementsix80.com/choisissez-votre-appartement/",
1987 + "sectors": "Gatineau (Hull — 680, boul. Saint-Joseph)",
1988 + "connector": null,
1989 + "status": "non connectable — la page « Choisissez votre appartement » se réduit au widget JS Smart Condo Plans (smartcondoplans.silo.immo, building « six80 ») : aucun prix ni unité dans le HTML, et l'API du widget (v2/building/get-building-data / get-building-units) répond 500 « Server Error » hors session navigateur (seul get-labels passe) ; il faudrait un navigateur headless pour un seul immeuble",
1990 + "region": "Outaouais"
1991 + },
1992 + {
1993 + "id": "tourliv",
1994 + "name": "Tourliv (Rizzo Capital)",
1995 + "url": "https://tourliv.com",
1996 + "listing_url": "https://tourliv.com",
1997 + "sectors": "Gatineau",
1998 + "connector": null,
1999 + "status": "non connectable — tourliv.com ne sert plus qu'une redirection JavaScript vers /lander (page de stationnement de domaine GoDaddy) : le site du projet (tour locative, livraison 2026) est hors ligne ; à re-vérifier à la livraison",
2000 + "region": "Outaouais"
2001 + },
2002 + {
2003 + "id": "vallees",
2004 + "name": "Gestion des Vallées",
2005 + "url": "https://gestiondesvallees.com",
2006 + "listing_url": "https://gestiondesvallees.com/a-louer-chelsea/",
2007 + "sectors": "Val-des-Monts, Chelsea",
2008 + "connector": null,
2009 + "status": "non connectable — la section « À louer » ne publie que des locaux COMMERCIAUX du centre Mont-Valois (loyer « Sur demande ») et une page Chelsea de prévente figée en 2018-2019 (« Disponibilité: 2019 », « Images à venir », loyer « selon la demande ») ; la variante /a-louer-chelsea-2/ répond 403 ; aucune annonce résidentielle avec loyer/dispo",
2010 + "region": "Outaouais"
2011 + },
2012 + {
2013 + "id": "wandji",
2014 + "name": "Gestion Immobilière Wandji",
2015 + "url": "https://wandji-immobilier.com",
2016 + "listing_url": "https://wandji-immobilier.com/proprietes",
2017 + "sectors": "Gatineau (Hull, Aylmer, Plateau, Buckingham, Masson-Angers), Papineauville",
2018 + "connector": "wandji",
2019 + "status": "actif",
2020 + "region": "Outaouais"
2021 + },
2022 + {
2023 + "id": "quartier_plus",
2024 + "name": "Le Quartier Plus",
2025 + "url": "https://www.lequartierplus.com",
2026 + "listing_url": "https://www.lequartierplus.com/plans-et-visites-virtuelles/",
2027 + "sectors": "Thetford Mines (140-180 rue Kingsville) — complexe 55+ autonome, 3 phases ; phase 3 (59 unités « Construction 2026 ») en prélocation",
2028 + "connector": "quartier_plus",
2029 + "status": "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",
2030 + "region": "Chaudière-Appalaches"
2031 + },
2032 + {
2033 + "id": "beaulieu_groupe",
2034 + "name": "Beaulieu Groupe Immobilier (BGI)",
2035 + "url": "https://beaulieugroupeimmobilier.com",
2036 + "listing_url": "https://beaulieugroupeimmobilier.com/batiment/?category=residentiel",
2037 + "sectors": "Rimouski (5 immeubles résidentiels dont 24 logements neufs au 418 rue Alcide-C.-Horth) — commercial exclu",
2038 + "connector": "beaulieu_groupe",
2039 + "status": "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",
2040 + "region": "Bas-Saint-Laurent"
2041 + },
2042 + {
2043 + "id": "louer_saguenay",
2044 + "name": "Louer Saguenay",
2045 + "url": "https://louersaguenay.com",
2046 + "listing_url": "https://louersaguenay.com/location-loft-appartement-jonquiere/",
2047 + "sectors": "Saguenay / centre-ville de Jonquière (rue Saint-Dominique) — lofts et appartements ; locaux commerciaux exclus",
2048 + "connector": "louer_saguenay",
2049 + "status": "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é)",
2050 + "region": "Saguenay–Lac-Saint-Jean"
2051 + },
2052 + {
2053 + "id": "gestion_jdm",
2054 + "name": "JDM Gestion immobilière",
2055 + "url": "https://gestionjdm.ca",
2056 + "listing_url": "https://gestionjdm.ca/logement/",
2057 + "sectors": "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",
2058 + "connector": "gestion_jdm",
2059 + "status": "actif — annonces à granularité immeuble (badge « Disponible », description, caractéristiques, photos) ; prix jamais publiés",
2060 + "region": "Bas-Saint-Laurent"
2061 + },
2062 + {
2063 + "id": "immeubles_bois",
2064 + "name": "Les Immeubles Bois",
2065 + "url": "https://immeublesbois.ca",
2066 + "listing_url": "https://immeublesbois.ca/residentiel/",
2067 + "sectors": "Rimouski (23 immeubles affichés, 320+ logements 1½–5½) — commercial exclu",
2068 + "connector": "immeubles_bois",
2069 + "status": "actif — annonces « catalogue » (1 par immeuble : adresse + photo) : la source ne publie ni prix, ni disponibilités, ni typologies (location par téléphone)",
2070 + "region": "Bas-Saint-Laurent"
2071 + },
2072 + {
2073 + "id": "alias_appartements",
2074 + "name": "Alias Appartements",
2075 + "url": "https://www.aliasappartements.com",
2076 + "listing_url": "https://www.aliasappartements.com",
2077 + "sectors": "Saguenay / Jonquière (rue des Mouettes, près du Mont-Jacob) — projet unique de 80 unités 4½ en 4 phases (Groupe Boudreault)",
2078 + "connector": "alias_appartements",
2079 + "status": "actif — 1 annonce « catalogue » à granularité projet (type 4½, à partir de 1575 $, caractéristiques, photos) ; disponibilités par formulaire seulement",
2080 + "region": "Saguenay–Lac-Saint-Jean"
2081 + },
2082 + {
2083 + "id": "luxuor",
2084 + "name": "Les Immeubles Luxuor",
2085 + "url": "https://www.lesimmeublesluxuor.com",
2086 + "listing_url": "https://www.lesimmeublesluxuor.com/42logements",
2087 + "sectors": "Saguenay : rue des Golfeurs à Chicoutimi (42 + 16 logements), Quadrex, résidence étudiante La Fabrique à Jonquière (12 unités 4½)",
2088 + "connector": "luxuor",
2089 + "status": "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)",
2090 + "region": "Saguenay–Lac-Saint-Jean"
2091 + },
2092 + {
2093 + "id": "gestion77",
2094 + "name": "Gestion Immobilière 7/7",
2095 + "url": "https://www.gestion77.com",
2096 + "listing_url": "https://www.gestion77.com/location-appartement-meuble",
2097 + "sectors": "Saguenay / Chicoutimi (centre-ville, UQAC/Cégep) — meublé tout inclus",
2098 + "connector": null,
2099 + "status": "non connectable — hors périmètre long terme : spécialiste du meublé tout inclus dont les boutons « Réserver En Ligne » pointent vers des fiches Airbnb (fr.airbnb.ca/rooms/…) = location courte durée ; le sitemap ne contient que 3 pages catégories (maisons-villas, studios-condos, appartements meublés) sans fiche d'annonce long terme structurée (vérifié 2026-08-09). À re-vérifier si une offre 12 mois structurée apparaît",
2100 + "region": "Saguenay–Lac-Saint-Jean"
2101 + },
2102 + {
2103 + "id": "gestion_gt",
2104 + "name": "Gestion Immeubles GT (GIGT)",
2105 + "url": "https://www.gestionimmeublesgt.ca",
2106 + "listing_url": "https://www.lokia.ca/lokia/appartements-alma",
2107 + "sectors": "Alma (4 secteurs : Collège, Centre/Carrefour, Hôpital, Centre Mario-Tremblay) — 3½ à 5½",
2108 + "connector": null,
2109 + "status": "non connectable — le site Wix propre est une vitrine sans aucune fiche d'annonce : présentation des 4 secteurs, brochure PDF à télécharger et formulaire de contact seulement (vérifié 2026-08-09) ; les annonces réelles passent par lokia.ca (chaîne de résidences RPA multi-régions, exclue du périmètre) et Facebook. À re-vérifier si le site publie un jour ses propres fiches",
2110 + "region": "Saguenay–Lac-Saint-Jean"
2111 + },
2112 + {
2113 + "id": "maltais",
2114 + "name": "Gestion Immobilière Maltais",
2115 + "url": "https://www.gestionimmobilieremaltais.ca",
2116 + "listing_url": null,
2117 + "sectors": "Alma, Métabetchouan, Saint-Bruno (Lac-Saint-Jean) — ~150 appartements revendiqués (« +80 locations d'appartements » affiché)",
2118 + "connector": null,
2119 + "status": "non connectable — vitrine Webflow sans aucune annonce résidentielle : le site ne détaille que la location d'entrepôts à Saint-Bruno et des compteurs marketing (« +80 locations d'appartements », « 150 locations d'entrepôts ») ; aucune page, fiche ou liste de logements à louer (vérifié 2026-08-09). Parc réel important — à re-vérifier périodiquement",
2120 + "region": "Saguenay–Lac-Saint-Jean"
2121 + },
2122 + {
2123 + "id": "beaulieu_gestion",
2124 + "name": "Beaulieu Gestion Immobilière",
2125 + "url": "https://www.beaulieugestion.ca",
2126 + "listing_url": "https://www.beaulieugestion.ca/#appartements",
2127 + "sectors": "Rivière-du-Loup, Saint-Antonin, Cacouna — 3½ à 5½ + maisons unifamiliales (13 adresses énumérées)",
2128 + "connector": null,
2129 + "status": "non connectable — page unique statique (11,5 Ko, jQuery/Cloudflare) qui se contente d'énumérer 13 adresses en texte : aucune fiche par immeuble, aucun prix, aucune disponibilité, aucune photo attribuable à une adresse (« Je recherche un logement » = formulaire) — rien à parser en annonces, même au sens catalogue (vérifié 2026-08-09). À re-vérifier périodiquement ; distinct de Beaulieu Groupe Immobilier (Rimouski, connecteur beaulieu_groupe) et des Immeubles Beaulieu et Collin (immeubles_bc)",
2130 + "region": "Bas-Saint-Laurent"
2131 + },
2132 + {
2133 + "id": "logements_cote_sud",
2134 + "name": "Les Logements Côte du Sud (LCS) inc.",
2135 + "url": "https://www.logementscotesud.com",
2136 + "listing_url": "https://www.logementscotesud.com/logements2025.html",
2137 + "sectors": "Montmagny + La Pocatière — 152 logements abordables (OBNL, gère aussi coops et Habitations de la Rivière Saint-Nicolas 60+)",
2138 + "connector": null,
2139 + "status": "non connectable — site statique artisanal (Dreamweaver) : la liste des immeubles est intégralement marquée « COMPLET » (parc plein permanent) et l'état « disponible » n'a JAMAIS été observé (l'instantané Wayback 2016 n'affichait aucun statut ; aucune autre archive de la page liste) — impossible d'écrire un parseur de disponibilités véridique ni d'enregistrer une fixture non vide ; l'URL de la page change en outre chaque année (logements2025.html) et certains immeubles relèvent de coops/60+ à critères d'attribution. Les fiches (types + prix 623-635 $) sont du catalogue d'immeubles complets. À re-vérifier périodiquement (vérifié 2026-08-09)",
2140 + "region": "Chaudière-Appalaches"
2141 + },
2142 + {
2143 + "id": "immo_jem",
2144 + "name": "Immo-Jem inc.",
2145 + "url": "https://immo-jem.ca",
2146 + "listing_url": "https://immo-jem.ca/a_louer_a_sainte-marie.html",
2147 + "sectors": "Sainte-Marie (« Le Faubourg des Berges », 72 logements revendiqués), Saint-Bernard, Saint-Lambert-de-Lauzon, Pintendre — 3½ à 5½",
2148 + "connector": null,
2149 + "status": "non connectable — site statique HTML artisanal : pages descriptives par secteur (prose marketing + carrousels de photos + Street View), AUCUNE liste d'unités, aucun prix, aucune disponibilité, pas de robots.txt ni de structure d'annonce (vérifié 2026-08-09) ; les annonces réelles passent par LesPAC/téléphone. Un des plus gros proprios traditionnels de Sainte-Marie : bon candidat partenariat direct plutôt que scraping ; à re-vérifier périodiquement",
2150 + "region": "Chaudière-Appalaches"
2151 + },
2152 + {
2153 + "id": "mcf_immo",
2154 + "name": "MCF Immobilier (Groupe MCF / Marcel Charest et Fils)",
2155 + "url": "https://www.mcfimmo.ca",
2156 + "listing_url": "https://www.mcfimmo.ca",
2157 + "sectors": "Montmagny (« La Traversée », maison de chambres + logements) ; projets à Lévis et Saint-Pascal (BSL)",
2158 + "connector": null,
2159 + "status": "non connectable — inventaire vide : la section « À LOUER » du site Wix affiche « Nouvelles offres à venir prochainement » sans aucune fiche reliée ; les pages fiches restantes du sitemap (à-louer-2…7-la-traversée, à-louer-logement-montmagny, copie-de-place-rachel-…) sont des VESTIGES ORPHELINS datés « DISPONIBLE LE 1ER JUILLET 2021 » (contenu dupliqué, non reliés à la navigation, sitemap figé au 2025-02-04) — rien d'actuel à parser (vérifié 2026-08-09). Adossé à un constructeur régional : à re-vérifier quand les projets Montmagny/Lévis livreront",
2160 + "region": "Chaudière-Appalaches"
2161 + },
2162 + {
2163 + "id": "lm_gestion",
2164 + "name": "LM Gestion Immobilière",
2165 + "url": "https://lmgestionimmobiliere.com",
2166 + "listing_url": null,
2167 + "sectors": "Saguenay — ~700 unités gérées (revendiqué)",
2168 + "connector": null,
2169 + "status": "non connectable — site toujours HORS LIGNE : lmgestionimmobiliere.com et www. renvoient 404 « ConnectYourDomain Error | Wix.com » (domaine Wix déconnecté), aucune annonce accessible — re-vérifié le 2026-08-09 (état identique au recensement du 2026-08-08). Gros parc : re-vérifier périodiquement, un connecteur se justifierait si le site revient en vie",
2170 + "region": "Saguenay–Lac-Saint-Jean"
2171 + },
2172 + {
2173 + "id": "alexandre_pelletier",
2174 + "name": "Les Immeubles Alexandre Pelletier",
2175 + "url": "https://lesimmeublesalexandrepelletier.ca",
2176 + "listing_url": null,
2177 + "sectors": "Matane — 650+ logements et 50 000 pi² commerciaux (revendiqué : acteur dominant de Matane)",
2178 + "connector": null,
2179 + "status": "non connectable — re-vérifié le 2026-08-09 : certificat TLS TOUJOURS expiré (SSL certificate problem: certificate has expired) ; en ignorant le TLS, le site (GoDaddy Website Builder, one-pager) ne contient que présentation, galerie de photos, formulaire de contact et liens Facebook (« Les Résidences du Campus ») — AUCUNE section d'annonces ni fiche de logement ; les disponibilités passent par Facebook/téléphone. Gros parc : re-vérifier périodiquement, un connecteur se justifierait si une section d'annonces apparaît",
2180 + "region": "Bas-Saint-Laurent"
2181 + },
2182 + {
2183 + "id": "moderno",
2184 + "name": "Moderno Construction",
2185 + "url": "https://moderno.immo",
2186 + "listing_url": "https://moderno.immo/logements-a-louer",
2187 + "sectors": "Joliette (Aqua Roca, Domaine du Sentier Riverain) — condos locatifs neufs",
2188 + "connector": "moderno",
2189 + "status": "actif",
2190 + "region": "Lanaudière"
2191 + },
2192 + {
2193 + "id": "acceslogis_gb",
2194 + "name": "Accès Logis GB",
2195 + "url": "https://acceslogisgb.com",
2196 + "listing_url": "https://acceslogisgb.com/#logements",
2197 + "sectors": "Joliette, Sainte-Élisabeth, Saint-Ambroise-de-Kildare, Crabtree, Berthierville + Shawinigan (rue Frigon)",
2198 + "connector": "acceslogis_gb",
2199 + "status": "actif",
2200 + "region": "Lanaudière / Mauricie"
2201 + },
2202 + {
2203 + "id": "ferrovia",
2204 + "name": "Ferrovia (condos locatifs Mirabel)",
2205 + "url": "https://www.ferroviamirabel.com",
2206 + "listing_url": "https://www.ferroviamirabel.com/disponibilites-phase-4/",
2207 + "sectors": "Mirabel (Saint-Janvier) — 4 phases, tables wpDataTables par phase (prix non publiés à ce jour)",
2208 + "connector": "ferrovia",
2209 + "status": "actif",
2210 + "region": "Laurentides"
2211 + },
2212 + {
2213 + "id": "habitations_sf",
2214 + "name": "Les Habitations SF (S&F Gestion)",
2215 + "url": "https://www.leshabitationssf.com",
2216 + "listing_url": "https://www.leshabitationssf.com/",
2217 + "sectors": "Saint-Charles-Borromée/Joliette, Saint-Félix-de-Valois, Piedmont",
2218 + "connector": "habitations_sf",
2219 + "status": "actif",
2220 + "region": "Lanaudière"
2221 + },
2222 + {
2223 + "id": "lambert",
2224 + "name": "Société Immobilière Lambert",
2225 + "url": "https://lambertimmobilier.com",
2226 + "listing_url": "https://lambertimmobilier.com/logements-disponibles/",
2227 + "sectors": "Louiseville, Yamachiche — petit parc, cartes sans dispo",
2228 + "connector": "lambert",
2229 + "status": "actif",
2230 + "region": "Mauricie"
2231 + },
2232 + {
2233 + "id": "fournelle",
2234 + "name": "Appartements Fournelle (Groupe Fournelle)",
2235 + "url": "https://www.groupefournelle.com",
2236 + "listing_url": "https://www.groupefournelle.com/appartements-fournelle/",
2237 + "sectors": "Bécancour (Domaine de l'Île — 8plex neuf vue sur le fleuve, secteur Sainte-Angèle)",
2238 + "connector": "fournelle",
2239 + "status": "actif",
2240 + "region": "Centre-du-Québec"
2241 + },
2242 + {
2243 + "id": "gestion_buro",
2244 + "name": "Gestion immobilière Buro",
2245 + "url": "https://gestionburo.com",
2246 + "listing_url": "https://gestionburo.com/logements",
2247 + "sectors": "Trois-Rivières, Bécancour (gestion pour propriétaires)",
2248 + "connector": null,
2249 + "status": "non connectable — la page « Logements à louer » (GoDaddy Website Builder) ne contient aucune annonce : elle renvoie explicitement vers la page Facebook de l'entreprise (« Veuillez vous rendre sur notre page Facebook pour voir tous nos logements disponibles ») ; scraper Facebook est hors des pratiques Lou-Ka. À re-vérifier si un portail web apparaît",
2250 + "region": "Mauricie"
2251 + },
2252 + {
2253 + "id": "gestion_nordsud",
2254 + "name": "Gestion immobilière Nord-Sud",
2255 + "url": "https://www.gestionnordsud.com",
2256 + "listing_url": "https://www.gestionnordsud.com/logements-louer/",
2257 + "sectors": "Trois-Rivières (rue Sylvain, voisin UQTR)",
2258 + "connector": null,
2259 + "status": "non connectable — la page « Logements à louer » (builder « Outil de création de site ») liste les immeubles avec des tableaux Prix/Disponibilité dont toutes les cases sont « COMPLET » et les prix vides ($ sans montant) ; bandeau « Nous aurons très peu de logements à louer cette année… liste d'attente par texto au 819-698-1821 ». Aucune annonce exploitable ni format structuré à parser. À re-vérifier périodiquement",
2260 + "region": "Mauricie"
2261 + },
2262 + {
2263 + "id": "gestion_immologis",
2264 + "name": "Gestion Immo-Logis",
2265 + "url": "https://www.gestionimmologis.com",
2266 + "listing_url": "https://www.gestionimmologis.com/louer",
2267 + "sectors": "Victoriaville, Princeville, Plessisville, Saint-Ferdinand",
2268 + "connector": null,
2269 + "status": "non connectable — le portail /louer (site custom léger, boîtes .location-box propres et parsables) n'affiche que 4 fiches, toutes marquées « Complet », dont 2 chambres à Plessisville (575 $/525 $) et 2 logements 4½ à Saint-Ferdinand (975 $) ; aucune annonce disponible. Techniquement connectable en 30 min si l'inventaire se libère — à re-vérifier périodiquement",
2270 + "region": "Centre-du-Québec"
2271 + },
2272 + {
2273 + "id": "danelly",
2274 + "name": "Groupe Immobilier Danelly",
2275 + "url": "https://www.groupeimmobilierdanelly.com",
2276 + "listing_url": "https://www.groupeimmobilierdanelly.com/logements-%C3%A0-louer-plans",
2277 + "sectors": "Louiseville (111 et 121 Rang de la Petite-Rivière, ~38 logements neufs)",
2278 + "connector": null,
2279 + "status": "non connectable — site Wix vitrine : les pages « logements à louer plans » ne contiennent que des plans et photos des 2 immeubles, sans liste d'unités, sans prix ni disponibilités ; les seules mentions (« 3 1/2 libre dès maintenant », « À partir de 880 $ par mois ») sont dans une bannière d'accueil en image/texte marketing non daté. Rien de structuré à parser. À re-vérifier périodiquement",
2280 + "region": "Mauricie"
2281 + },
2282 + {
2283 + "id": "quartier_du_moulin",
2284 + "name": "Quartier du Moulin",
2285 + "url": "https://www.quartierdumoulin.com",
2286 + "listing_url": "https://www.quartierdumoulin.com/phase-2",
2287 + "sectors": "Repentigny (893-895 rue Notre-Dame) — mono-projet neuf, 2 phases",
2288 + "connector": null,
2289 + "status": "non connectable — site promotionnel Webflow mono-projet : aucune annonce d'unité ; la phase 2 publie seulement des prix « à partir de » par typologie (3½ 1 250 $, 4½ 1 695 $, 5½ 1 875 $) et « DISPONIBLE FÉVRIER-MARS 2026 », la phase 1 rien du tout — pas d'inventaire, pas d'external_id possible, disponibilité invérifiable. À re-vérifier si un portail d'unités apparaît",
2290 + "region": "Lanaudière"
2291 + },
2292 + {
2293 + "id": "condos_laurentides",
2294 + "name": "Condos Laurentides (Le Rocher / Le Rivya)",
2295 + "url": "https://www.condoslaurentides.com",
2296 + "listing_url": "https://www.condoslaurentides.com/le-rocher/condos/",
2297 + "sectors": "Saint-Jérôme (195 Barrette, 545 Castonguay ; Le Rivya à venir 2028)",
2298 + "connector": null,
2299 + "status": "non connectable — aucun condo annoncé : le site l'écrit lui-même (« il n'y a actuellement aucun condo annoncé — ça pourrait être en janvier-février ») et fonctionne par formulaire d'intérêt/réservation ; de plus le parc Rocher 1-2 est un produit 55+/retraités (« unités parfaites pour des gens à la retraite ») en marge du périmètre Lou-Ka, et Le Rivya n'ouvre qu'en 2028. À re-vérifier périodiquement",
2300 + "region": "Laurentides"
2301 + },
2302 + {
2303 + "id": "rou_bec",
2304 + "name": "Gestions des immeubles Rou-Bec",
2305 + "url": "https://rou-bec.com",
2306 + "listing_url": "https://rou-bec.com/rentals/",
2307 + "sectors": "Shawinigan, Trois-Rivières, Nicolet, Grand-Mère",
2308 + "connector": null,
2309 + "status": "non connectable — catalogue Avada (post cards Fusion) essentiellement « For Sale » (immeubles à vendre) ; côté location, 1-2 cartes « For Rent » sans page détail, aux champs vides (« -- Nb Chambre · -- Pi2 · $Contactez-nous »), sans type d'unité ni disponibilité, dans un markup Fusion non sémantique (divs de titres imbriqués sans classes de données). Rien d'assez fiable pour un parseur. À re-vérifier périodiquement",
2310 + "region": "Mauricie"
2311 + },
2312 + {
2313 + "id": "developlex",
2314 + "name": "Déveloplex",
2315 + "url": "https://www.developlex.ca",
2316 + "listing_url": "https://www.developlex.ca/appartements-%C3%A0-louer",
2317 + "sectors": "Deux-Montagnes, Saint-Jérôme, Lachute, Sainte-Julienne, Saint-Eustache (~15 immeubles)",
2318 + "connector": null,
2319 + "status": "non connectable — répertoire d'immeubles Wix sans annonces d'unités : la page « appartements à louer » liste les immeubles et chaque fiche immeuble est du marketing statique (« Location disponible maintenant ! », inclusions) sans prix, sans unités, sans dates — aucun prix publié nulle part sur le site et disponibilité non datée/invérifiable. À re-vérifier si un portail d'unités apparaît",
2320 + "region": "Laurentides"
1147 2321 }
1148 2322 ]
1149 −}
\ No newline at end of file
2323 +}
added louka/connectors/gio.py +272 −0
@@ -0,0 +1,272 @@
1 +# -----------------------------------------------------------------------------
2 +# Lou-Ka — Agrégateur de logements à louer (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# connectors/gio.py : connecteur Gestion Immobilière de l'Outaouais (gioinc.ca)
5 +# Gestionnaire du Plateau à Gatineau (boul. du Plateau, av. des Oliviers…).
6 +# WordPress/Elementor : la page /a-louer/ rend côté serveur une boucle
7 +# Elementor (e-loop-item-<postid>, CPT « proprietes ») avec prix, ville,
8 +# adresse, nombre de pièces et lien vers la fiche /proprietes/<slug>/.
9 +# La fiche détail (via cache BD) ajoute : titre, mention « Toutes les
10 +# charges comprises », type (Résidentiel/Commercial — le commercial est
11 +# exclu), salles de bain, description bilingue et le bloc « Aperçu »
12 +# structuré (stationnement, durée du bail, animaux, meublé, électroménagers,
13 +# taille) ainsi que la galerie de photos quand elle existe.
14 +# robots.txt : Crawl-delay 3 (respecté via request_delay) et Disallow /*?
15 +# — le connecteur ne visite que des URLs sans chaîne de requête.
16 +# -----------------------------------------------------------------------------
17 +from __future__ import annotations
18 +
19 +import hashlib
20 +import re
21 +
22 +from bs4 import BeautifulSoup
23 +
24 +from ..schema import Listing, normalize_unit_type, parse_price, strip_accents
25 +from .base import BaseConnector
26 +
27 +BASE = "https://gioinc.ca"
28 +LIST_URL = f"{BASE}/a-louer/"
29 +
30 +_SIZE_SUFFIX = re.compile(r"-\d{2,4}x\d{2,4}(?=\.(?:jpg|jpeg|png|webp)$)", re.I)
31 +# image générique du site (og:image), jamais une photo du logement
32 +_GENERIC_IMG = re.compile(r"GIO-1200x628|logo", re.I)
33 +_BG_URL_RE = re.compile(r"url\((['\"]?)(https?://[^)'\"]+)\1\)")
34 +
35 +# libellés du bloc « Aperçu » : une valeur qui est elle-même un libellé
36 +# signifie que le champ précédent est vide sur la fiche
37 +_APERCU_LABELS = re.compile(
38 + r"^(Services inclus|Stationnement inclus|Durée du bail|Date d’emménagement|"
39 + r"Animaux acceptés|L’unité d’habitation|Taille \(pieds carrés\)|Meublé|"
40 + r"Électroménagers|Air conditionné|Espace extérieur privé|Fumeurs acceptés|"
41 + r"Immeuble|Commodités dans l’immeuble)$")
42 +
43 +
44 +def _oui_non(raw: str) -> bool | None:
45 + k = strip_accents((raw or "").strip().lower())
46 + if k.startswith("oui") or k in ("yes",):
47 + return True
48 + if k.startswith("non") or k in ("no",):
49 + return False
50 + return None
51 +
52 +
53 +class GioConnector(BaseConnector):
54 + source_id = "gio"
55 + request_delay = 3.0 # robots.txt : Crawl-delay 3
56 + max_details = 40 # garde-fou fiches détail (vraies requêtes)
57 +
58 + def fetch(self) -> list[Listing]:
59 + soup = BeautifulSoup(self.get(LIST_URL).text, "html.parser")
60 + listings: dict[str, Listing] = {}
61 + for card in soup.select('div[data-elementor-type="loop-item"]'):
62 + try:
63 + self._parse_card(card, listings)
64 + except Exception:
65 + continue
66 +
67 + # fiches détail (cache BD) : description, aperçu structuré, photos
68 + self._fetched = 0
69 + for lst in listings.values():
70 + key = hashlib.sha1(
71 + f"{lst.title}|{lst.price_label}|{lst.availability}|{lst.url}"
72 + .encode("utf-8")).hexdigest()
73 + try:
74 + payload = self.detail(lst.external_id, key,
75 + lambda u=lst.url: self._fetch_detail(u))
76 + except Exception:
77 + continue
78 + self._apply_detail(lst, payload)
79 +
80 + # le commercial n'est identifiable que sur la fiche -> filtre final
81 + return [l for l in listings.values()
82 + if l.details.get("property_kind") != "Commercial"]
83 +
84 + # -- carte de la boucle Elementor ------------------------------------------
85 + def _parse_card(self, card, listings: dict[str, Listing]) -> None:
86 + link = card.select_one('a.elementor-button[href*="/proprietes/"]')
87 + if not link:
88 + return
89 + url = link["href"]
90 + # id de billet WordPress stable : classe « post-2320 »
91 + ext_id = ""
92 + for cls in card.get("class", []):
93 + m = re.match(r"^post-(\d+)$", cls)
94 + if m:
95 + ext_id = m.group(1)
96 + if not ext_id or ext_id in listings:
97 + return
98 +
99 + status = link.get_text(strip=True) # « Disponible »
100 + if re.search(r"lou[ée]", status, re.I):
101 + return
102 +
103 + # widgets texte dans l'ordre : prix, ville, adresse, « Pièces: n »
104 + price_label = city = address = rooms_label = ""
105 + for w in card.select(".elementor-widget-text-editor .elementor-widget-container"):
106 + txt = re.sub(r"\s+", " ", w.get_text(" ", strip=True))
107 + if not txt:
108 + continue
109 + if "$" in txt and not price_label:
110 + price_label = txt
111 + elif re.search(r"pi[eè]ces?\s*:", txt, re.I):
112 + rooms_label = txt
113 + elif not city:
114 + city = txt
115 + elif not address:
116 + address = txt
117 +
118 + unit_type = ""
119 + m = re.search(r"pi[eè]ces?\s*:\s*(\d+)", rooms_label, re.I)
120 + rooms = int(m.group(1)) if m else None
121 + # « Pièces » du site = nombre de chambres (671-102 « 1 chambre » -> 1)
122 + if rooms:
123 + unit_type = normalize_unit_type(f"{rooms} chambres")
124 +
125 + details: dict = {}
126 + if rooms:
127 + details["bedrooms"] = rooms
128 +
129 + listings[ext_id] = Listing(
130 + source=self.source_id,
131 + external_id=ext_id,
132 + url=url,
133 + title=address or url.rstrip("/").rsplit("/", 1)[-1],
134 + address=f"{address}, {city}" if address and city else address,
135 + city=city or "Gatineau",
136 + unit_type=unit_type,
137 + price=parse_price(price_label),
138 + price_label=price_label,
139 + availability=status,
140 + details=details,
141 + )
142 +
143 + # -- fiche détail ------------------------------------------------------------
144 + def _fetch_detail(self, url: str) -> dict:
145 + if self._fetched >= self.max_details:
146 + raise RuntimeError("budget de fiches détail atteint")
147 + self._fetched += 1
148 + html = self.get(url).text
149 + soup = BeautifulSoup(html, "html.parser")
150 + out: dict = {}
151 +
152 + h1 = soup.find("h1")
153 + if h1:
154 + out["title"] = h1.get_text(" ", strip=True)
155 +
156 + text = soup.get_text("\n", strip=True)
157 +
158 + # adresse complète avec code postal : « 671 boulevard du Plateau,
159 + # Gatineau, QC J9J 4K5 (Afficher sur la carte) »
160 + m = re.search(r"\n([^\n]+,\s*[^\n]+?,\s*QC[^\n(]*)", text)
161 + if m:
162 + out["address"] = re.sub(r"\s+", " ", m.group(1)).strip()
163 +
164 + # « Résidentiel » ou « Commercial » + « Pièces: n | Salles de bain: n »
165 + m = re.search(r"\b(Résidentiel|Commercial)\b", text)
166 + if m:
167 + out["kind"] = m.group(1)
168 + m = re.search(r"Salles? de bain\s*:?\s*(\d+)", text)
169 + if m:
170 + out["bathrooms"] = int(m.group(1))
171 + if re.search(r"Toutes les charges comprises", text, re.I):
172 + out["all_inclusive"] = True
173 +
174 + # description : entre « Description » et « Aperçu »
175 + m = re.search(r"\nDescription\n(.*?)\nAperçu\n", text, re.S)
176 + if m:
177 + desc = re.sub(r"[ \t]+", " ", m.group(1)).strip()
178 + out["description"] = desc[:2500]
179 +
180 + # bloc « Aperçu » : paires libellé/valeur rendues en lignes successives
181 + m = re.search(r"\nAperçu\n(.*?)\n(?:Êtes-vous|Comment pouvons)", text, re.S)
182 + apercu = m.group(1) if m else ""
183 + for label, key in [
184 + (r"Animaux acceptés", "pets_raw"),
185 + (r"Meublé", "furnished_raw"),
186 + (r"Fumeurs acceptés", "smoking_raw"),
187 + (r"Stationnement inclus", "parking_raw"),
188 + (r"Durée du bail", "lease_raw"),
189 + (r"Électroménagers", "appliances_raw"),
190 + (r"Services inclus", "services_raw"),
191 + (r"Taille \(pieds carrés\)", "area_raw")]:
192 + mm = re.search(label + r"\n([^\n]+)", apercu)
193 + if mm and not _APERCU_LABELS.match(mm.group(1).strip()):
194 + out[key] = mm.group(1).strip()
195 +
196 + # galerie : diaporama de la fiche (div.slide, background-image) +
197 + # images du contenu ; jamais l'og:image générique ni les icônes
198 + images: list[str] = []
199 +
200 + def _add(u: str) -> None:
201 + if not u.startswith("http"):
202 + u = BASE + u
203 + if _GENERIC_IMG.search(u) or u.lower().endswith(".svg"):
204 + return
205 + if "/wp-content/uploads/" not in u:
206 + return
207 + u = _SIZE_SUFFIX.sub("", u)
208 + if u not in images:
209 + images.append(u)
210 +
211 + for div in soup.select("div.slide div[style], [style*='background']"):
212 + m_bg = _BG_URL_RE.search(div.get("style", ""))
213 + if m_bg:
214 + _add(m_bg.group(2))
215 + for im in soup.select('img[src*="/wp-content/uploads/"]'):
216 + _add(im["src"])
217 + out["images"] = images[:30]
218 + return out
219 +
220 + def _apply_detail(self, lst: Listing, d: dict) -> None:
221 + if not d:
222 + return
223 + if d.get("title"):
224 + lst.title = d["title"]
225 + if d.get("address"):
226 + lst.address = d["address"]
227 + if d.get("kind"):
228 + lst.details["property_kind"] = d["kind"]
229 + if d.get("bathrooms"):
230 + lst.details["bathrooms"] = d["bathrooms"]
231 + if d.get("description"):
232 + lst.description = d["description"]
233 + # le nombre de chambres écrit par l'agence (titre ou en-tête de la
234 + # description) prime sur le compteur « Pièces » de la carte, parfois
235 + # en décalage (ex. fiche 3 chambres avec Pièces: 2)
236 + head = f"{lst.title} | {(lst.description or '')[:80]}"
237 + m = re.search(r"(\d+)\s*chambres?\b", head, re.I)
238 + if m:
239 + lst.unit_type = normalize_unit_type(f"{m.group(1)} chambres")
240 + lst.details["bedrooms"] = int(m.group(1))
241 + if d.get("images"):
242 + lst.images = d["images"]
243 + pets = _oui_non(d.get("pets_raw", ""))
244 + if pets is not None:
245 + lst.pets = "oui" if pets else "non"
246 + furn = _oui_non(d.get("furnished_raw", ""))
247 + if furn is not None:
248 + lst.furnished = furn
249 + smoking = _oui_non(d.get("smoking_raw", ""))
250 + if smoking is not None:
251 + lst.details["smoking"] = smoking
252 + if d.get("parking_raw"):
253 + lst.details["parking"] = {"raw": d["parking_raw"]}
254 + if d.get("lease_raw"):
255 + lst.details["lease"] = d["lease_raw"]
256 + amen: list[str] = []
257 + if d.get("all_inclusive"):
258 + amen.append("Toutes les charges comprises")
259 + if d.get("services_raw"):
260 + amen.append(f"Services inclus : {d['services_raw']}")
261 + if _oui_non(d.get("appliances_raw", "")):
262 + amen.append("Électroménagers inclus")
263 + if amen:
264 + lst.amenities = list(dict.fromkeys(lst.amenities + amen))
265 + m = re.match(r"^([\d\s,.]+)$", d.get("area_raw", "") or "")
266 + if m:
267 + try:
268 + area = float(m.group(1).replace(" ", "").replace(",", "."))
269 + if 80 <= area <= 20000:
270 + lst.area_sqft = area
271 + except ValueError:
272 + pass
added louka/connectors/immnasr.py +183 −0
@@ -0,0 +1,183 @@
1 +# -----------------------------------------------------------------------------
2 +# Lou-Ka — Agrégateur de logements à louer (province de Québec)
3 +# Auteur : Simon-Pierre Boucher — contact@spboucher.ai
4 +# connectors/immnasr.py : connecteur Les Immeubles Michel Nazair (immnasr.com)
5 +# Petit gestionnaire de Gatineau (Mont-Fleuri, Val-Tétreau…). Vieux site
6 +# « SiteBuilder » (Website.com) rendu serveur : la section À LOUER de
7 +# l'accueil aligne, pour chaque logement, un bloc texte structuré
8 +# (« Loyer: 1 325 $/mois », « Disponibilité: 1er octobre 2026 », « Nombre de
9 +# chambres à coucher », « Surface », « Prises laveuse et sécheuse », « Coût
10 +# approx. électricité/énergie », « Description: » bilingue) suivi d'un bloc
11 +# adresse (« 183, du Mont-Fleuri, Gatineau QC »). Les carrousels de photos
12 +# (CDN dotezcdn.com) précèdent les blocs : chaque galerie est rattachée à
13 +# son logement par le numéro civique en tête des attributs alt
14 +# (« 183_Facade… », « 31-2 Salon… », « 8_H-Dupuis… »).
15 +# external_id = adresse en slug (le site n'expose aucun identifiant).
16 +# -----------------------------------------------------------------------------
17 +from __future__ import annotations
18 +
19 +import re
20 +
21 +from bs4 import BeautifulSoup
22 +
23 +from ..schema import Listing, normalize_unit_type, parse_area_sqft, parse_price, strip_accents
24 +from .base import BaseConnector
25 +
26 +BASE = "https://www.immnasr.com"
27 +
28 +_NBSP = " "
29 +
30 +
31 +def _slug(text: str) -> str:
32 + s = strip_accents(text.lower())
33 + s = re.sub(r"[^a-z0-9]+", "-", s).strip("-")
34 + return s
35 +
36 +
37 +def _civic(address: str) -> str:
38 + m = re.match(r"\s*(\d+)", address)
39 + return m.group(1) if m else ""
40 +
41 +
42 +class ImmnasrConnector(BaseConnector):
43 + source_id = "immnasr"
44 + request_delay = 1.0
45 + max_images = 20
46 +
47 + def fetch(self) -> list[Listing]:
48 + soup = BeautifulSoup(self.get(f"{BASE}/").text, "html.parser")
49 +
50 + # 1) galeries : liste ordonnée de (préfixes alt, [urls])
51 + galleries: list[tuple[list[str], list[str]]] = []
52 + for car in soup.select("div.element"):
53 + imgs = car.select(".carousel img[src]")
54 + if not imgs:
55 + continue
56 + alts, urls = [], []
57 + for im in imgs:
58 + alt = (im.get("alt") or "").strip()
59 + if alt:
60 + alts.append(alt)
61 + u = (im.get("src") or "").strip()
62 + if u.startswith("//"):
63 + u = "https:" + u
64 + if u.startswith("http") and u not in urls:
65 + urls.append(u)
66 + if urls:
67 + galleries.append((alts, urls))
68 +
69 + # 2) blocs annonces : élément texte « Loyer: … » suivi de l'adresse
70 + elements = soup.select("div.element")
71 + listings: dict[str, Listing] = {}
72 + for i, el in enumerate(elements):
73 + txt = el.get_text("\n", strip=True).replace(_NBSP, " ")
74 + if not re.match(r"^\s*Loyer\s*:", txt):
75 + continue
76 + # l'adresse est le prochain élément texte court « …, Gatineau QC »
77 + address = ""
78 + for nxt in elements[i + 1:i + 3]:
79 + t = re.sub(r"\s+", " ", nxt.get_text(" ", strip=True)
80 + .replace(_NBSP, " ")).strip()
81 + if re.search(r",\s*(Gatineau|Hull|Aylmer)\b", t, re.I) and len(t) < 90:
82 + address = t
83 + break
84 + if not address:
85 + continue
86 + ext_id = _slug(address)
87 + if not ext_id or ext_id in listings:
88 + continue
89 + try:
90 + listings[ext_id] = self._parse_block(txt, address, ext_id, galleries)
91 + except Exception:
92 + continue
93 +
94 + return list(listings.values())
95 +
96 + def _parse_block(self, txt: str, address: str, ext_id: str,
97 + galleries: list[tuple[list[str], list[str]]]) -> Listing:
98 + flat = re.sub(r"[ \t]+", " ", txt)
99 +
100 + def _field(label: str) -> str:
101 + m = re.search(label + r"\s*:?\s*\n?(.+?)(?:\n[A-ZÀ-Ü][^\n]*:|\Z)",
102 + flat, re.S)
103 + return re.sub(r"\s+", " ", m.group(1)).strip() if m else ""
104 +
105 + m = re.search(r"Loyer\s*:\s*([\d\s]+)\s*\$", flat)
106 + price_label = f"{m.group(1).strip()} $ / mois" if m else ""
107 +
108 + # « Disponibilité: 1 / er / octobre / 2026 » (exposant sur sa propre
109 + # ligne) : capturer jusqu'au libellé suivant puis aplatir
110 + m = re.search(r"Disponibilit[ée]\s*:\s*(.*?)\s*(?:\nNombre|\nSurface|\Z)",
111 + flat, re.S | re.I)
112 + availability = re.sub(r"\s+", " ", m.group(1)).strip(" .") if m else ""
113 +
114 + m = re.search(r"chambres? à coucher\s*:\s*\n?([^\n]+)", flat, re.I)
115 + bedrooms_raw = re.sub(r"\s+", " ", m.group(1)).strip() if m else ""
116 +
117 + m = re.search(r"Surface\s*:\s*\n?([^\n]+)", flat, re.I)
118 + surface_raw = re.sub(r"\s+", " ", m.group(1)).strip() if m else ""
119 +
120 + m = re.search(r"(?:Prises? laveuse[^:]*)\s*:\s*\n?([^\n]+)", flat, re.I)
121 + washer_raw = re.sub(r"\s+", " ", m.group(1)).strip() if m else ""
122 +
123 + m = re.search(r"Co[ûu]t approx\.[^:]*:\s*\n?([^\n]+)", flat, re.I)
124 + energy_raw = re.sub(r"\s+", " ", m.group(1)).strip() if m else ""
125 +
126 + m = re.search(r"Description\s*:\s*(.+)$", flat, re.S | re.I)
127 + description = ""
128 + if m:
129 + description = re.sub(r"[ \t]+", " ", m.group(1)).strip()[:2500]
130 +
131 + # type d'unité : maison/bungalow écrit par l'agence, sinon n chambres
132 + unit_type = ""
133 + if re.search(r"\b(bungalow|maison)\b", description, re.I):
134 + unit_type = "Maison"
135 + else:
136 + mb = re.match(r"(\d+)", bedrooms_raw)
137 + if mb:
138 + unit_type = normalize_unit_type(f"{mb.group(1)} chambres")
139 +
140 + details: dict = {}
141 + if bedrooms_raw:
142 + mb = re.match(r"(\d+)", bedrooms_raw)
143 + if mb:
144 + details["bedrooms"] = int(mb.group(1))
145 + details["bedrooms_raw"] = bedrooms_raw
146 + if energy_raw:
147 + details["energy_cost"] = energy_raw
148 +
149 + amenities: list[str] = []
150 + if washer_raw.lower().startswith("oui"):
151 + amenities.append("Prises laveuse et sécheuse")
152 +
153 + # galerie associée par numéro civique en tête des alt
154 + civic = _civic(address)
155 + images: list[str] = []
156 + if civic:
157 + for alts, urls in galleries:
158 + heads = [re.match(r"[\w]+", strip_accents(a.replace("Façade", "")).strip())
159 + for a in alts]
160 + prefixes = {re.match(r"(\d+)", a.strip()).group(1)
161 + for a in alts if re.match(r"(\d+)", a.strip())}
162 + _ = heads
163 + if civic in prefixes:
164 + images = urls[: self.max_images]
165 + break
166 +
167 + return Listing(
168 + source=self.source_id,
169 + external_id=ext_id,
170 + url=f"{BASE}/#{ext_id}",
171 + title=address,
172 + address=address,
173 + city="Gatineau",
174 + unit_type=unit_type,
175 + price=parse_price(price_label),
176 + price_label=price_label,
177 + availability=availability,
178 + area_sqft=parse_area_sqft(surface_raw),
179 + description=description,
180 + amenities=amenities,
181 + details=details,
182 + images=images,
183 + )
added louka/connectors/leviu.py +145 −0
Large diff (145 lines) is not loaded by default to keep the page fast.Load diff
added louka/connectors/quanta.py +133 −0
Large diff (133 lines) is not loaded by default to keep the page fast.Load diff
added louka/connectors/wandji.py +183 −0
Large diff (183 lines) is not loaded by default to keep the page fast.Load diff
added reports/connectors/gio.md +26 −0
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
added reports/connectors/immnasr.md +26 −0
Large diff (26 lines) is not loaded by default to keep the page fast.Load diff
added reports/connectors/leviu.md +24 −0
Large diff (24 lines) is not loaded by default to keep the page fast.Load diff
added reports/connectors/quanta.md +25 −0
Large diff (25 lines) is not loaded by default to keep the page fast.Load diff
added reports/connectors/wandji.md +29 −0
Large diff (29 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/acceslogis_gb.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/alexandre_pelletier.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/alias_appartements.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/beaulieu_gestion.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/beaulieu_groupe.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/condos_laurentides.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/custeau_centro.json +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/danelly.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/developlex.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/ferrovia.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/fournelle.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/gestion77.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/gestion_buro.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/gestion_gt.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/gestion_immologis.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/gestion_jdm.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/gestion_nordsud.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/gio.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/godbout.json +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/habitations_sf.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/hro.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/immeubles_bois.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/immnasr.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/immo_jem.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/immotop.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/lambert.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/leviu.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/lib_emd.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/lm_gestion.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/logements_cote_sud.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/louer_saguenay.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/luxuor.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/maitre_carre.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/maltais.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/mcf_immo.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/mcs5.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/mka.json +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/mkg_prestige.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/moderno.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/odyssee.json +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/penates.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/prestiplex.json +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/quanta.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/quartier_du_moulin.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/quartier_plus.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/rou_bec.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/serviceplus.json +9 −0
Large diff (9 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/six80.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/tourliv.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/vallees.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added reports/sources-entries/wandji.json +10 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/4579aa3d6d68b87dc877.html +999 −0
Large diff (1,000 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/6ccc9c48fde49354c0cd.html +1027 −0
Large diff (1,028 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/9845944e15c7eb13b43f.html +992 −0
Large diff (993 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/a011d7e65e01fd92ed29.html +1035 −0
Large diff (1,036 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/db2a62a02e8a8f120ecb.html +826 −0
Large diff (827 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/expected.json +75 −0
Large diff (76 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/f10975ef37951582bab3.html +1040 −0
Large diff (1,041 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/gio/index.json +44 −0
Large diff (45 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/immnasr/6e12d4db7d596ff3002e.html +1991 −0
Large diff (1,991 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/immnasr/expected.json +47 −0
Large diff (48 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/immnasr/index.json +9 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/leviu/b57a16419a5e427d3936.html +897 −0
Large diff (897 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/leviu/expected.json +33 −0
Large diff (34 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/leviu/index.json +9 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/quanta/ecdc315125af9c7fa8a5.html +200 −0
Large diff (200 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/quanta/expected.json +33 −0
Large diff (34 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/quanta/index.json +9 −0
Large diff (10 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/wandji/6d5f675753792fe3dee1.json +1 −0
Large diff (2 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/wandji/expected.json +411 −0
Large diff (412 lines) is not loaded by default to keep the page fast.Load diff
added tests/fixtures/wandji/index.json +9 −0
Large diff (11 lines) is not loaded by default to keep the page fast.Load diff
Menu

Theme