loftsmtl — Lofts MTL (Rentsync/LiftSystem)
- site: https://www.loftsmtl.com (API api.theliftsystem.com/v2/search, client_id 773)
- méthode: json-api (inventaire immeubles) + html (pages immeubles : unités + commodités)
- annonces: 7 → 7
- couverture après (sur 7 annonces): prix 100%, adresse 100%, dispo 100%, superficie 86%, commodités 100%
- fixture: ok · test: ok (2 passed)
Champs extraits
- API LiftSystem (par immeuble) : nom, adresse + code postal (nouveau), ville/quartier, lat/lng structurés (nouveau),
pet_friendlybooléen → pets "oui"/"non" (nouveau), téléphone du gestionnaire → details.contact.phone (nouveau), description overview (FR+EN), permalink. - Page immeuble (par unité, div.suite) : type, numéro, prix ($/mo), pi² →
area_sqftstructuré (nouveau ; cellule .suite-sqft, avant : texte d'amenity parsé par finalize), salles de bain, disponibilité (« Immediate Occupancy »…), photos, id stablesuite-NNNNNN. - Section « Amenities » de la page immeuble (nouveau) : Suite Amenities (Balconies, Concrete floors, Dishwasher, Dryer/Washer in suite, Fridge, Stove…) + Building Amenities (lockers, No Smoking allowed, secured entry, Permit Parking…) → dérivations riches : appliances{fridge,stove,dishwasher,washer_dryer}, storage, balcony/elevator, smoking=false, parking.
Champs indisponibles à la source
- Superficie absente sur 1 unité sur 7 (cellule sqft à 0 chez la source).
- Inclusions (chauffage/électricité/eau chaude) : jamais énoncées.
- Étage : non publié.
- Meublé : seulement suggéré dans le
building_headertexte (« Furnished loft in the Plateau ») — trop ambigu pour être affirmé par unité, non utilisé. parking{indoor,outdoor,additional}de l'API : null sur les 4 immeubles.
Fragilités
- Jeton
auth_tokenpublic de l'API embarqué dans le site : peut tourner. - Le permalink API pointe parfois /apartments/ alors que la page vit sous /residential/ (repli déjà en place).
- Labels d'amenities en anglais : la dérivation canonique dépend des motifs EN de normalize (dishwasher/washer/no smoking OK ; « secured entry », « Concrete floors » restent non mappés — affichés tels quels).
- 4 immeubles seulement ; le filtre
_CITY_MAPdoit suivre si Lofts MTL ajoute des villes.
Améliorations apportées
- lat/lng, code postal, pets (booléen structuré), téléphone de contact — tous depuis l'API.
area_sqftstructuré depuis la cellule .suite-sqft (garde-fou ≥80).- Commodités passées de 2 items techniques (« 1 salle(s) de bain », « 614 pi² ») à ~18 items réels par unité → details passe de
{}à{appliances{…}, balcony/elevator, storage, smoking:false, parking, contact, pets}.
Échantillon avant/après
Lofts du Main — unité 200 (1295 $, Studio, Immediate Occupancy, 614 pi²)
- avant : pets=None, details=
{}, amenities=["1 salle(s) de bain","614 pi²"], lat/lng absents, address=3827 Boulevard Saint-Laurent - après : pets=
oui, details={"appliances":{"fridge":true,"stove":true,"dishwasher":true,"washer_dryer":true},"balcony":true,"storage":true,"smoking":false,"parking":{"available":true},"contact":{"phone":"514-806-7673"},"pets":"oui"}, lat=45.5157/lng=-73.5762, address=3827 Boulevard Saint-Laurent, H2W 1X9
Lofts Parc Avenue — unité 302 (2020 $, 3½, 1117 pi²)
- avant : details=
{}; après : appliances complets, elevator=true, storage=true, smoking=false, pets=oui, lat/lng, code postal H2V 4H1