spb/fabri-ka Public
Agrégateur de produits québécois — www.fabri-ka.com
HTML 57.9%
Python 18.6%
TypeScript 15.6%
CSS 7.8%
1# Stratégie de découverte continue — écosystème ecommerce québécois23Objectif : maintenir et faire croître en continu le registre de boutiques qui alimente4Fabri-Ka (`data/stores.json`), au-delà de la récolte initiale. La stratégie est5entièrement codée dans `scripts/` et rejouable.67## Le pipeline (implémenté)89```10Annuaires sources (certifications, associations, marques régionales)11 ↓ scripts/harvest.py — sitemaps/API/pagination → data/raw/<source>.jsonl12Extraction des liens sortants + signaux (nom, postal, téléphone, région)13 ↓ scripts/aggregate.py — normalisation domaine + dédup + provenance14Candidats uniques (data/enriched/candidates.jsonl)15 ↓ scripts/verify.py — fetch page d'accueil (cache data/verify_cache/)16Détection ecommerce (plateforme + endpoint catalogue public + panier)17 + vérification localisation QC (code postal G/H/J, indicatifs 418/514/450/819/…,18 TLD .quebec, mentions, wording « fabriqué au Québec »)19 ↓ scripts/build_registry.py — classification origine A–E avec évidence20Registre canonique (data/stores.json)21 ↓ fabrika/ingest.py — connecteurs par plateforme, catalogue complet22Base produits (data/fabrika.db, diff par hash, désactivation avec délai de grâce)23 ↓ récursion : nouveaux liens « nos détaillants / partenaires » → harvest24```2526## Principes qui ont le plus rapporté27281. **Sources à haut levier d'abord.** Une certification provinciale (Aliments du29 Québec : 1 001 entreprises ; Les Produits du Québec : 339) vaut des centaines de30 recherches manuelles, et fournit en prime une **preuve d'origine**.312. **Sitemaps avant scraping.** 80 % des annuaires québécois sont des WordPress ;32 leurs sitemaps exposent directement les fiches membres (`/entreprises/*`,33 `/createurs/*`, `/membre/*`…). Coût : une requête XML.343. **API cachées des cartes interactives.** Les répertoires « carte » (WP Google Maps,35 FacetWP, Storepoint) ont presque toujours un endpoint JSON public36 (ex. AMBQ : `/wp-json/wpgmza/v1/markers` → 328 adresses complètes).374. **Marketplaces locales = listes de marques.** Signé Local et Boutique Métiers38 d'art exposent leurs vendeurs via l'endpoint Shopify public `products.json`39 (champ `vendor`) : 240 + 89 marques québécoises d'un coup.405. **Redirections affiliées à résoudre.** Les répertoires-cadeaux passent par des41 trackers (affiliationfocus) : suivre la redirection donne le vrai domaine.426. **Maillage régional.** Chaque région a sa marque agroalimentaire avec annuaire43 (Zone Boréale, Gaspésie Gourmande, Croquez Outaouais, Goûtez-y!, Arrêts44 Gourmands, Créateurs de saveurs, Laurentides j'en mange, Le Goût de la45 Côte-Nord…) — c'est LE correctif des angles morts hors Montréal/Québec.467. **Balayage moteur × (catégorie × région)** pour la longue traîne : ~100 requêtes47 FR bien construites ont ajouté ~150 domaines absents de tout annuaire.4849## Boucle d'exploitation continue (recommandée)5051| Fréquence | Action | Commande |52|---|---|---|53| 6 h | Resync des catalogues produits (déjà en prod) | `run.py watch 360` (PM2) |54| Hebdo | Re-harvest des annuaires sources + delta verify | `harvest.py && aggregate.py && verify.py && build_registry.py` |55| Hebdo | Retry des boutiques en erreur (429/timeout) | relance auto par le watcher |56| Mensuel | Balayage recherche nouvelles requêtes (catégorie × région × « nouveau ») | agents de recherche |57| Mensuel | Résolution nom→domaine des marques sans site connu (signelocal/BMAQ vendors) | recherche ciblée |58| Trimestriel | Revue des sources mortes/nouvelles (marchés de Noël, salons, expos) | scouting |5960## Détection par l'infrastructure ecommerce6162- **Shopify** : `/products.json` public = signal ET connecteur. ⚠️ limite de débit63 par IP partagée entre toutes les boutiques Shopify + fingerprinting TLS64 (python-requests se fait bloquer sous volume, `curl` passe) → throttle global65 0,7 s/req et transport curl.66- **WooCommerce** : `/wp-json/wc/store/v1/products` (Store API publique) — la moitié67 des boutiques QC détectées ; certaines la désactivent (fallback : rendu Firecrawl).68- **Squarespace** : `?format=json` sur les pages collection.69- **Wix** (125 détectées) : pas d'endpoint catalogue public simple — **connecteur à70 écrire** (API `wixstores` ou rendu Firecrawl). Plus gros stock non connecté.71- Recherche inversée possible (non exploitée encore) : requêtes72 `site:myshopify.com` + mots QC, certificats CT logs, et listes publiques de73 domaines .quebec.7475## Angles morts connus (et comment les combler)76771. **Artisans CMAQ (~1 000)** : répertoire en session JS — utiliser Firecrawl/rendu78 navigateur sur `repertoire_artisan.php`, ou OCR du catalogue du Salon des métiers d'art.792. **Manufacturiers industriels vente directe** : absents des annuaires grand80 public. Pistes : successeur d'ICRIQ, répertoire STIQ, liste Investissement81 Québec « Achetons québécois », annuaires de zones industrielles/parcs technos.823. **Nord-du-Québec** : quasi vide en ecommerce alimentaire ; couvrir via artisanat83 autochtone (coops cries/inuites : Wachiya, boutiques de pourvoiries).844. **Boutiques sans annuaire ni SEO** (Instagram-only) : exiger un site web est un85 biais assumé du produit ; suivre quand même les liens Linktree/Instagram lors86 des balayages.875. **Vendeurs Etsy québécois** : ToS d'Etsy interdit le scraping ; alternative =88 les artisans y affichant leur site propre finissent par apparaître via les89 salons/marchés récoltés.906. **Fermes en circuit court** (paniers ASC) : le Réseau des fermiers·ères de91 famille (fermierdefamille.ca) a un répertoire à intégrer.9293## Mesure de couverture9495À chaque itération, `aggregate.py` imprime les domaines uniques par source ;96suivre la courbe des **nouveaux domaines par itération** (voir research_report.md).97Critère d'arrêt d'une source : <5 % de nouveauté sur deux passes consécutives.98