# ----------------------------------------------------------------------------- # Immo-Ka — Agrégateur de maisons à vendre (province de Québec) # Auteur : Simon-Pierre Boucher — contact@spboucher.ai # connectors/avecuncourtier.py : portail « avec un courtier » de la Chambre # immobilière de l'Outaouais (avecuncourtier.com). Couvre TOUT l'Outaouais # (Gatineau → Maniwaki/Pontiac) d'un coup — c'est le portail MLS régional de # la chambre, pas une agence unique. Recherche rendue SERVEUR (plateforme # Concrete5, Tonik Web Studio), paginée par ?page=N (12 cartes/page, ~341 # pages). Chaque carte porte déjà : n° MLS (Centris), adresse, ville/secteur, # type, aire habitable, prix et photo. # # ENRICHISSEMENT DÉTAIL (v2) : /fr/proprietes/details/{mls}-{slug} est rendue # serveur : galerie complète (/centris/photos/{mls}/{n}.jpg, ordre d'origine), # description + Addendas, GPS (data-lat/data-lon), accordéons « Proximité », # « Dimension des pièces » (4 col.), « Taxes et dépenses » + « Bâtiment et # intérieur » (paires td/td : chambres, sdb, aire habitable en m², terrain, # année, évaluations…), visites libres, courtier(s) inscripteur(s) + agence # réelle (RE/MAX Vision, Exit…). Cache BD via _detailutil.enrich. # # source_id « cio_ag_outaouais » : l'infixe _ag_ active la dédup Centris # (db.refresh_dedup, sources %_ag_%). Comme le portail agrège les inscriptions # des bannières déjà couvertes (RE/MAX, Royal LePage, Via Capitale, Proprio # Direct…), la dédup masque les fiches dont le n° Centris est déjà porté par # une source canonique ; seules les inscriptions d'agences NON couvertes de # l'Outaouais restent visibles. Aucun double-comptage. # ----------------------------------------------------------------------------- from __future__ import annotations import html as _html import os import re from .base import BaseConnector from . import _detailutil as du from ..normalize import parse_price from ..schema import PropertyListing SITE = "https://avecuncourtier.com" LISTING = SITE + "/fr/proprietes" MAX_PAGES = int(os.environ.get("IMMOKA_AUC_MAX_PAGES", "400")) AGENCY = "Chambre immobilière de l'Outaouais" # fiches détail (re)lues au plus par cycle — cache BD (key v2). ~1 400 fiches # publiées → ~5 cycles de rattrapage, puis seules les nouvelles sont lues. DETAIL_LIMIT = int(os.environ.get("IMMOKA_AUC_DETAIL_LIMIT", os.environ.get("IMMOKA_DETAIL_LIMIT", "300"))) # une carte commence par