SPB Git

spb/lou-ka Public

Lou·Ka — tous les logements à louer du Québec, un seul endroit.

HTML 99.7%
4.2 KB

# 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 / + ».