SPB Git

spb/lou-ka Public

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

HTML 99.7%
4.3 KB

# logisbourg — Logisbourg

# Champs extraits

  • Liste (tableau ASP) : grandeur, date de dispo (attribut TITLE), étage, prix, inclusions (icônes ALT : chauffage, eau chaude, électricité, semi-meublé).
  • Fiche appartement.asp (mise en cache via self.detail, clé = hash de la ligne du tableau, plafond 80 vraies requêtes/sync) :
    • adresse complète AVEC no d'unité (nomComplexeAdresse : « 4855, 6e Avenue Ouest #403 ») — nouveau ;
    • lat/lng structurés (google.maps.LatLng(...)) — nouveau ;
    • superficie structurée (encadré #superficie_encadre) -> area_sqft explicite (plus fiable que le 1er « NNN pi » de la page) — nouveau ;
    • téléphone du bureau de location (lien tel: du formulaire de visite) -> details.contact.phone — nouveau ;
    • caractéristiques de l'appartement : ALT des icônes + texte visible (« Balcon 60 pi² », « Entrées laveuse/sécheuse incluses », « Un stationnement extérieur », « Revêtements : … ») ;
    • caractéristiques de l'immeuble (items <li> : Bell Fibe, Intercom, service d'urgence 24/7…) en commodités + texte en description ;
    • description enrichie : paragraphe de présentation du complexe (#DescriptionComplexe) + caractéristiques immeuble + services optionnels (ex. « Stationnement extérieur au coût de 50$/mois » -> parking.price dérivé par finalize) — avant, seule la section « Caractéristiques immeuble » était captée ;
    • images (galerie de l'immeuble), comme avant.

# Champs indisponibles à la source

  • Animaux (aucune mention sur le site) -> pets = None.
  • Meublé : seul « semi-meublé » (poêle + réfrigérateur inclus) est exposé via l'icône ALT « Poêle et réfrigérateur inclus » ; pas d'unité meublée.
  • Pas d'API JSON ni de sitemap exploitable (site ASP old-school) ; pas de superficie sur la page liste (fiche seulement).

# Fragilités

  • HTML ASP non structuré : parsing par regex sur les classes de cellules (Grandeur, DateDispo, Prix…) — un changement de gabarit casserait le connecteur (le test fixture le détecterait).
  • Le serveur n'annonce pas de charset : l'UTF-8 est forcé (_get_text).
  • Adresses en exposants (6<SUP>e</SUP>) recousues par _fix_sup.
  • Clé de cache des fiches versionnée (v3:) : bump nécessaire si l'extraction de la fiche change, sinon les anciens payloads restent servis.

# Améliorations apportées

  • Fiches désormais servies par self.detail() (cache BD) : ~1 requête/sync en régime stable au lieu de 10 fetches systématiques ; plafond max_details=80 compté DANS fetch_fn (les hits de cache ne comptent pas).
  • Nouveaux champs : lat/lng, area_sqft structuré, no d'unité dans l'adresse, details.contact.phone, revêtements, items immeuble en commodités, description 3 volets (complexe + immeuble + services optionnels).
  • Conservation des ALT d'icônes (« Entrées laveuse/sécheuse incluses ») en plus du texte visible : garde la détection washer_dryer_hookup de normalize.

# Échantillon avant/après

  • Avant : 4855, 6e Avenue Ouest — 4½ | 1215$ | dispo 2026-09-01 | 990 pi² (dérivé du texte) | pas de lat/lng | pas de contact | desc = caractéristiques immeuble seulement
  • Après : 4855, 6e Avenue Ouest #403 — 4½ | 1215$ | dispo 2026-09-01 | 990 pi² (structuré) | lat 46.841064 / lng -71.264786 | contact 418-623-4006 | details : hookup laveuse-sécheuse, balcon, rangement, stationnement ext., étage 3 | desc = présentation du complexe + immeuble + services optionnels

# Lacune générique de normalisation (à traiter dans normalize.py, pas ici)

  • « Entrée lave-vaisselle incluse » (le branchement, pas l'appareil) est classé appliances.dishwasher = true par _AMENITY_RULES — il faudrait une règle dishwasher_hookup analogue à washer_dryer_hookup.
  • « Entrées lave-vaisselle et laveuse/sécheuse inclus » (formulation combinée) n'est pas reconnu par le motif hookup entrees? (?:de )?laveuse — couvert ici uniquement parce que l'ALT séparé « Entrées laveuse/sécheuse incluses » est aussi émis.