# immomarketing — IMMOMARKETING / Immoappart - site: https://immoappart.ca (11 pages de secteurs Québec + Grand Montréal → fiches /appartement//) - méthode: html - annonces: 82 → 82 - couverture après (sur 82 annonces): prix 100%, adresse 99%, dispo 98%, superficie 0%, commodités 99% - fixture: ok · test: ok ## Champs extraits - lat/lng : 100% (attributs `data-lat`/`data-lng` de la carte interactive de chaque fiche — structurés) - description complète : conteneur `.the-content` (promotions, inclusions de loisirs, « Informations supplémentaires ») au lieu du og:description tronqué → finalize() dérive maintenant pets (« Animaux non acceptés » → non, 53/82), smoking (Non-fumeur), contact{phone,email}, parking, ac, pool, gym… - amenities : liste « Inclusions » dédiée de la fiche (dropdown) au lieu de toutes les puces de `main` (moins de bruit marketing) - spécifications structurées « Caractéristiques de l'immeuble » : Prix (repli de price_label), Pièces (repli de unit_type), Chambre/Salle de bain (ajoutées à la description) - adresse : h2 « numéro + rue » sans virgule finale maintenant accepté (ex. « 570, Charest est » de JB Laliberté) - title, unit_type, price/price_label (bandeau), availability (« Date de disponibilité »), images — inchangés ## Champs indisponibles à la source - superficie : jamais affichée (aucun champ « Superficie » sur les fiches, vérifié sur Québec/Montréal/Laval) - 1 fiche sans adresse civique (Le Président I & II, Montréal), 2 fiches avec « Date de disponibilité » vide (Le Loumii) - « Date de déménagement » du dropdown : signification ambiguë (souvent passée) — non utilisée - pas de custom post type dans /wp-json/ (types WP standards seulement) ## Fragilités - 82 fiches à visiter, MAIS le connecteur passe maintenant par self.detail() : clé = hash du texte de la carte liste (adresse+prix+type+badge) → seules les fiches nouvelles/modifiées sont re-téléchargées (budget max_details=120 vraies requêtes, comptées dans fetch_fn) - Si un changement de la fiche n'affecte pas la carte liste (ex. description seulement), il n'est vu qu'au prochain changement de carte - LACUNE GÉNÉRIQUE (normalize.py) : le crédit promotionnel « Crédit de 1 000 $ Éclaire » matche la règle electricity (`eclaire\b`) → inclusions.electricity=true à tort sur les fiches Cité M ; de même « 2 espaces pour seulement 150 $ » donne parking.price=50 (le motif `(\d+)\s*\$` coupe le nombre après la fenêtre de 40 caractères) ## Améliorations apportées - Cache BD des fiches détail (self.detail) — ~93 requêtes seulement au premier sync, quasi 0 ensuite - GPS structuré sur 100% des annonces (nouveau) - pets/smoking/contact/parking dérivés grâce à la description complète (avant : og:description tronqué, pets=None partout) - amenities propres (liste « Inclusions » officielle) + specs chambres/salles de bain dans la description - correction d'adresse pour les h2 sans virgule finale ## Échantillon avant/après - CITÉ M 4½ AVANT : desc=og(600c), amenities=15 puces mélangées, pets=None, lat=None, details={ac,pool,gym,storage,parking{intérieur}} - CITÉ M 4½ APRÈS : desc=`.the-content`(1718c)+`2 chambre(s), 2 salle(s) de bain.`, amenities=10 « Inclusions », pets=`non`, smoking=false, contact{418-575-6158, citem@immomarketing.ca}, parking{intérieur, included:false}, lat/lng=46.83891/-71.312 - JB Laliberté AVANT : address=`` · APRÈS : `570, Charest est`