# forsa — Gestion immobilière Forsa - site: https://www.gestionforsa.com (Squarespace) - méthode: html plat — sections « liste » de /logements-disponibles (1 requête/sync) + fiches détail par unité (cache BD, budget 20) - annonces: 12 (le chalet à la journée de St-Adolphe-d'Howard est exclu : location saisonnière 85-100 $/jour, pas un bail résidentiel) - couverture (sur 12 annonces): prix 100%, adresse 100%, dispo 100%, type 100%, ville 100%, images 100%, description 100% — superficie/GPS jamais publiés - fixture: ok (13 requêtes : liste + 12 détails) · test: ok (2 verts) ## Champs extraits - Page /logements-disponibles : 3 sections Squarespace « liste » (2½-3½ / 4½-5½ / maisons de ville & chalet), cartes `li.list-item` : - titre `list-item-content__title` « 2 1/2, Joliette - MAINTENANT » → unit_type (préfixe, via normalize_unit_type), ville (2e segment) et availability (après le tiret ou la 2e virgule, texte source : « MAINTENANT », « Septembre », « 1er DÉCEMBRE ») ; - description de la carte : 1er paragraphe = adresse civique (« 222, rue Lajoie Sud, app. 12 »), paragraphe avec $ = price_label brut (« 1 290 $ par mois (2 stationnements) ») ; l'espace de milliers est retiré avant parse_price ; - bouton « Détails » → page par unité ; le slug d'URL (ex. `222-12lajoiesud`) sert d'external_id stable. - Villes réelles tirées du titre de chaque carte, abréviations développées (St-Gabriel → Saint-Gabriel, St-Charles-Borromée → Saint-Charles-Borromée) ; une unité est à Montréal (2580A Sherbrooke Est) — conservée telle quelle. - Fiche détail (cache BD, `self.detail`) : bloc HTML le plus long = description riche (ENVIRONNEMENT / LOGEMENT / IMMEUBLE, Inclusions, Exclusions — textmine structure au finalize()) + galerie complète (img squarespace-cdn, max 30, paramètre ?format= retiré). - robots.txt : le groupe `User-agent: *` autorise les pages HTML mais interdit /api/ et les vues JSON → aucun appel à l'API Squarespace, HTML seulement. ## Champs indisponibles à la source - Superficie, GPS, animaux/meublé structurés : jamais publiés (les inclusions restent dans la description, structurées par textmine). - Pas de pagination : tout le parc annoncé tient sur une page. ## Fragilités - external_id = slug de page créé à la main par l'agence : une annonce republiée sous un autre slug devient une nouvelle annonce (acceptable, le slug est stable pendant la vie de l'annonce). - Format du titre non strictement uniforme (« - » vs « , » avant la dispo) : le parseur accepte les deux, mais un format inédit laisserait availability vide. - Le prix vit dans un paragraphe libre de la carte : si l'agence déplace le $ dans un autre paragraphe, l'adresse et le prix pourraient être intervertis (le 1er § sans $ = adresse). ## Échantillon - 222-12lajoiesud : 2½, Joliette, 595 $/mois (eau chaude incluse), MAINTENANT, 222 rue Lajoie Sud app. 12, 10 photos. - 165-8maskinonge : 4½, Saint-Gabriel, 1 290 $/mois (2 stationnements), 165 rue Maskinongé app. 8, 30 photos. - 2580asherbrookeest : 5½, Montréal, 1 950 $/mois, 2580A rue Sherbrooke Est, 23 photos.