# Trouve-KA — exclusions de crawl # Author: Simon-Pierre Boucher # Contact: contact@spboucher.ai """Domaines jamais crawlés : plateformes globales (réseaux sociaux, app stores, CDN, moteurs) qui polluent le frontier sans jamais produire de contenu québécois indexable — la plupart exigent JS/login et leurs pages sont vides en fetch HTTP. Le budget de crawl est précieux (§12) : chaque slot dépensé sur apps.apple.com est un slot volé à un vrai site québécois. """ # Comparaison sur le domaine enregistrable ET ses sous-domaines. EXCLUDED_DOMAINS: frozenset[str] = frozenset({ # Réseaux sociaux "facebook.com", "fb.com", "instagram.com", "twitter.com", "x.com", "linkedin.com", "pinterest.com", "pinterest.ca", "tiktok.com", "snapchat.com", "reddit.com", "threads.net", "bsky.app", "mastodon.social", # Vidéo / streaming "youtube.com", "youtu.be", "vimeo.com", "dailymotion.com", "twitch.tv", "spotify.com", "soundcloud.com", # App stores / OS "apps.apple.com", "itunes.apple.com", "apple.com", "play.google.com", "microsoft.com", "chrome.google.com", # Moteurs / géants génériques "google.com", "google.ca", "bing.com", "yahoo.com", "duckduckgo.com", "amazon.com", "amazon.ca", "ebay.com", "ebay.ca", "aliexpress.com", "wikimedia.org", "wikidata.org", "archive.org", # wikipedia.org reste crawlable (contenu QC réel) # Infra / outils "d2cmedia.ca", # CDN d'images de concessionnaires — des milliers d'URLs, zéro texte "cloudflare.com", "wordpress.com", "wordpress.org", "blogspot.com", "wix.com", "squarespace.com", "shopify.com", "godaddy.com", "goo.gl", "bit.ly", "t.co", "ow.ly", "tinyurl.com", "gravatar.com", "addthis.com", "sharethis.com", "doubleclick.net", "googletagmanager.com", "google-analytics.com", # Cartes / avis génériques "maps.google.com", "waze.com", "tripadvisor.com", "tripadvisor.ca", "yelp.com", "yelp.ca", "booking.com", "airbnb.com", "airbnb.ca", "eventbrite.com", "eventbrite.ca", "meetup.com", }) def is_excluded_domain(domain: str) -> bool: """True si le domaine (ou un de ses parents) est dans la liste d'exclusion.""" d = domain.lower().rstrip(".") while d: if d in EXCLUDED_DOMAINS: return True _, _, d = d.partition(".") return False # --------------------------------------------------------------------------- # Pivot 2026-08-23 — Trouve·Ka devient le moteur de recherche du GROUPE KA. # Le périmètre de crawl est une ALLOWLIST stricte : seuls les sites de # l'écosystème KA sont découverts, crawlés et indexés. # # Exclus volontairement : api-ka.com (API pure, rien d'indexable), # forma-ka.com (aucune couche SEO/sitemap à ce jour), # administration-ka.com (console privée). KA_DOMAINS: frozenset[str] = frozenset({ "groupe-ka.com", "trouve-ka.com", "lou-ka.com", "immo-ka.com", "vrai-prix.com", "toit-ka.com", "valoplex.com", "auto-ka.com", "fabri-ka.com", "food-ka.com", "resto-ka.com", "sorti-ka.com", "crea-ka.com", "job-ka.com", }) def is_ka_domain(domain: str) -> bool: """Le domaine (ou l'un de ses parents) appartient-il au Groupe KA ?""" d = domain.lower().rstrip(".") while d: if d in KA_DOMAINS: return True _, _, d = d.partition(".") return False def is_in_scope(domain: str) -> bool: """Périmètre de crawl du moteur : domaines du Groupe KA uniquement.""" return is_ka_domain(domain)