# realstar — Realstar Management - site: https://www.realstar.ca/searchlisting?province=Quebec - méthode: firecrawl - annonces: 6 → 6 - couverture après (sur 6 annonces): prix 100%, adresse 100%, dispo 83%, superficie 83%, commodités 83% - fixture: ok · test: ok ## Champs extraits - Carte liste : nom, adresse complète, ville (mapping slug), lits/sdb/pi² (fourchette), fourchette de prix, vignette, **téléphone du bureau de location** (lien `tel:` structuré → `details.contact.phone`). - Fiche propriété : galerie photos rentcafe, description (2 premiers paragraphes), « Points forts de la propriété » → amenities. - **NOUVEAU — page `/floorplans`** (RentCafe, structurée : `#fp-container-*`, `.fp-availability`, `data-selenium-id`) : par plan — nom (« 4 ½ D »), chambres, pi², prix mensuel, nombre d'unités disponibles. En dérive : - `availability` réelle (« N unité(s) disponible(s) — plans… ») → `availability_date="now"` via finalize() ; - `price` = minimum des plans disponibles (au lieu de la fourchette carte), `price_label` fidèle ; - `area_sqft` + `unit_type` explicites quand un seul plan est disponible ; sinon superficies dans la description (finalize() en dérive le minimum). ## Champs indisponibles à la source - `pets` en valeur structurée (le point fort « ANIMAUX DE COMPAGNIE » est ambigu — laissé au normaliseur générique, qui ne le mappe pas car pas de verbe accepté/refusé). - lat/lng (la carte Google est initialisée en JS, aucune coordonnée dans le HTML rendu). - Date précise de disponibilité par unité (derrière le portail sécurisé RentCafe). - Meublé, étage, JSON-LD (absents). ## Fragilités - Tout passe par Firecrawl (Cloudflare + rendu client) : 1 rendu recherche + 2 rendus par propriété. Coût contrôlé par le cache `self.detail(...)` (clé = hash de la carte liste, incluant le prix) + plafond `max_renders=20` (exception `_BudgetReached`, rien de mis en cache si plafond atteint). - Rendu parfois incomplet : seconde chance avec `waitFor` plus long sur la page recherche. - Sélecteurs RentCafe (`fp-container`, `data-selenium-id`) : stables mais propres au thème Yardi. - `FIRECRAWL_API_KEY` absent ne lève plus au niveau du connecteur (nécessaire au rejeu hors-ligne des fixtures) ; en direct, Firecrawl répond 401. ## Améliorations apportées - `requests.post` module → `self.session.post` dans `_rendered` (les fixtures capturent désormais les 13 réponses Firecrawl). - Pages détail (fiche + plans) déplacées derrière `self.detail(...)` (cache BD) : plus de re-rendu Firecrawl à chaque sync si la carte n'a pas changé. - Ajout du parsing structuré de `/floorplans` : disponibilité réelle (0 % → 83 %), superficie (0 % → 83 %), prix « à partir de » réels des unités disponibles. - Téléphone du bureau → `details.contact.phone`. - Fixture + tests enregistrés (13 requêtes, 6 annonces). - 2026-08-08 — Expansion provinciale (lot 0) : `gatineau`, `hull` (secteur de Gatineau) et `sherbrooke` ajoutés à `_GM_CITIES` ; `max_properties` 8 → 12 (9 propriétés QC sur la page de recherche). +3 annonces : Heritage Lofts I&II (Gatineau, 1 550 $), Les Jardins Hauterive (Sherbrooke, 1 015 $ — propriété signalée dans reports/expansion/estrie.md) et Lumineau Appartements (Sherbrooke, 1 495 $). 6 → 9 annonces. Fixture réenregistrée (19 requêtes), 2 tests verts. ## Échantillon avant/après - AVANT : `Excelsior Apartments | 1645.0 | | dispo="" (date NULL) | area NULL | details sans contact` - APRÈS : `Excelsior Apartments | 1645.0 | dispo="5 unité(s) disponible(s) — 3 ½ G, 3 ½ A, 4 ½ D, 4 ½ O, 4 ½ T" → now | area 620 | contact.phone=514-447-6264` - APRÈS : `Bourg Du Village | 1750.0 | 4½ | "1 unité(s) disponible(s) — 4 ½ C" → now | area 918 pi²` (plan unique disponible → type + superficie explicites) - « Marc Chagall » : 0 unité disponible aux plans → dispo laissée vide (fidèle), prix = fourchette de la carte.