Skip to content
# logisco — Logisco
- site: https://logisco.com/fr/appartements-a-louer (+ pages projets et pages unités)
- méthode: html
- annonces: 163 → 161 (2 unités retirées par la source entre les syncs)
- couverture après (sur 161 annonces): prix 100%, adresse 100%, dispo 100%, superficie 100%, commodités 100%
- fixture: ok · test: ok
- Cartes projet (.unitCard, comme avant) : titre, adresse, secteur, type
d'unité, prix, dispo, services (sr-only), photo de l'unité + photos projet.
- NOUVEAU — page unité (mise en cache via
self.detail, clé = hash du contenu
de la carte versionné v2:, plafond 150 vraies requêtes/sync) :
- JSON-LD
@type: apartment : adresse complète STRUCTURÉE avec no d'unité
et code postal (« 310-931 Rue de l’École, Lévis, G6W 0T4 »), étage
(floorLevel), téléphone du bureau de location -> details.contact.phone,
plan de l'unité (image) ajouté aux photos ;
- sommaire
.unitHeader-info : superficie structurée (« 1167 pi² ») ->
area_sqft explicite, étage -> details.floor, disponibilité (repli si la
carte n'en avait pas) ;
- 4 sections de commodités : Inclusions (dans le prix), Particularités de
l'unité, Services offerts (avec marqueurs « ($) » conservés), Espaces
communs — jusqu'à 40 items texte fidèles, dédupliqués avec ceux de la carte.
# Champs indisponibles à la source
- Animaux : aucune mention sur les pages unités ni projets ->
pets = None.
- Meublé : non exposé.
- lat/lng : la carte Google des pages unité passe par une URL de recherche
(pas de coordonnées dans le HTML).
- Chauffage/électricité/eau chaude : pas dans les listes d'inclusions type
(les inclusions listées sont p. ex. stationnement, climatisation).
# Fragilités
- 161 unités > plafond de 150 requêtes : au premier sync (ou après un bump de
version de clé), les ~11 dernières unités restent sans enrichissement jusqu'au
sync suivant (le cache absorbe ensuite tout : régime stable ≈ 0-10 requêtes).
- Cartes d'unités imbriquées sous des Vue : le helper
_text
(types=None) reste indispensable.
- Certaines valeurs JSON-LD contiennent des entités HTML (') : désencodées.
- Clé de cache versionnée (
v2:) : à bumper si l'extraction de la page unité
change.
# Améliorations apportées
- Enrichissement par page unité via
self.detail() (aucune visite avant) :
adresse complète avec no d'unité + code postal, area_sqft structuré,
details.floor, details.contact.phone, plan de l'unité, ~2x plus de
commodités (Inclusions/Particularités/Services/Espaces communs vs seulement
les icônes sr-only de la carte).
- Budget de requêtes réelles compté DANS
fetch_fn (les hits de cache ne
comptent pas), exception _DetailBudget pour ne jamais mettre en cache un
payload vide « faute de budget ».
# Échantillon avant/après
- Avant :
L'AMALGAM — Appartement 310 | 1860$ | 4½ | dispo now | 1167 pi² (dérivé du texte de la carte) | adresse « 931 Rue de l’École, Lévis » | details : ac, parking ext.
- Après :
L'AMALGAM — Appartement 310 | 1860$ | 4½ | dispo now | 1167 pi² (structuré) | adresse « 310-931 Rue de l’École, Lévis, G6W 0T4 » | details : ac, ascenseur, balcon/terrasse, rangement, parking int.+ext., étage 3, hookup laveuse-sécheuse, contact 418-564-4726 | 25+ commodités texte
# Lacune générique de normalisation (à traiter dans normalize.py, pas ici)
- « Entrée lave-vaisselle » (branchement) est classé
appliances.dishwasher = true — il faudrait un dishwasher_hookup analogue à washer_dryer_hookup.
- « Rangement supplémentaire ($) » (payant) donne
storage: true sans nuance
« en option » ; idem « Stationnement intérieur ($) ».