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>
82 changed files +12,412 −1
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