# lynk_olymbec — Lynk par Olymbec (Lynk De la Savane) - site: https://www.lynk.ca/lynk-dls/units (+ /floorplans, /floorplans/, /lynk-dls) - méthode: firecrawl (repli — accès direct avec en-têtes navigateur quand Cloudflare laisse passer) - annonces: 4 → 4 - couverture après (sur 4 annonces): prix 100%, adresse 100%, dispo 75%, superficie 75%, commodités 100% - fixture: ok · test: ok ## Champs extraits - /lynk-dls/units : prix marketing « à partir de » par type (repli), icônes « dans mon unité » (chauffage — thermostat individuel, électricité, eau chaude, climatisation, internet fibre 1,5G, laveuse-sécheuse/lave-vaisselle/ réfrigérateur/micro-ondes Whirlpool, four et cuisinière, luminaires et stores) et liste « aménagements et matériaux » (acoustique, quartz…) — SCRAPÉES au lieu de la liste codée en dur — photos RentCafe. - /lynk-dls/floorplans (RentCafe) — NOUVEAU : attributs STRUCTURÉS `data-floorplan-size/sqft/price` par plan -> `area_sqft` (min de la fourchette + « Superficie : 657 à 829 pi² » en commodité) et PRIX RÉELS (« de 1 650 $ à 2 293 $ par mois » — le marketing affichait 1 700 $ pour le 3½, RentCafe publie 1 650 $). - Pages de plan (via `self.detail`, clé = attributs du plan, plafond 10 vraies requêtes/sync) — NOUVEAU : unités disponibles (« # 923 — Disponible maintenant ») -> disponibilité RÉELLE par type + liste des numéros d'unités dans la description. - /lynk-dls : description du projet, « services et commodités » de l'immeuble (piscine extérieure chauffée, salle de fitness, concierge, salon vip*, stationnement intérieur*, chargeurs VE*…) scrapées, téléphone (lien `tel:`) -> `details.contact.phone` (514-737-5965). - Correspondance plans -> types : Studio→Studio, 1 ch.→3½, 2 ch.→4½, 3 ch.→5½ (les deux plans 3 chambres agrégés sous 5½). ## Champs indisponibles à la source - Studio : aucune unité disponible côté RentCafe (bouton « contactez-nous » seulement) -> dispo vide et superficie absente pour ce type (d'où 75 %) ; seul le prix marketing 1 380 $ existe. - lat/lng : aucune coordonnée dans les pages. - Animaux, meublé : non publiés. ## Fragilités - Cloudflare : l'accès direct passe par intermittence ; sinon Firecrawl (FIRECRAWL_API_KEY requis). ~4-6 requêtes rendues par sync (pages plan amorties par le cache `self.detail`). - ATTENTION : Firecrawl réécrit les href en ABSOLU alors que l'accès direct les laisse RELATIFS -> `urljoin` systématique (c'était la cause d'un échec silencieux de l'extraction des unités). - Chaque plan apparaît 2x dans le HTML (desktop+mobile) : déduplication par slug pour ne pas doubler les unités. - Granularité conservée : 1 annonce par TYPE (ids `dls-studio`, `dls-3.5`…), pas par unité — schéma d'external_id inchangé. ## Améliorations apportées - SUPPRESSION des valeurs semi-inventées : `availability="Disponible"` codé en dur remplacé par la dispo réelle RentCafe (« Disponible maintenant » ou vide si inconnue) ; liste AMENITIES codée en dur remplacée par le scraping des 3 sections réelles du site. - Prix réels par fourchette RentCafe (structurés), superficie structurée, unités disponibles nominatives, contact téléphonique, description réelle. ## Échantillon avant/après - Avant : `Lynk De la Savane — 3½ | 1700$ « à partir de 1700 $ » (marketing) | dispo « Disponible » (codée en dur) | superficie None | 12 commodités codées en dur` - Après : `Lynk De la Savane — 3½ | 1650$ « de 1 650 $ à 2 293 $ par mois » (RentCafe) | dispo « Disponible maintenant » (réelle) | 657 pi² (attribut structuré, fourchette 657-829 en commodité) | ~30 commodités scrapées (unité + immeuble) | description + « 7 unité(s) disponible(s) : #923, … » | contact 514-737-5965` ## Lacunes génériques de normalisation (à traiter dans normalize.py, pas ici) - Les items marqués « * » (« salon vip* », « stationnement intérieur* » = frais additionnels) sont dérivés sans nuance payant/inclus. - `price_label` en fourchette « de X $ à Y $ » n'active pas `price_from` (le prix affiché est bien le plancher) — `price_is_from` ne reconnaît que « à partir de / from / + ».