SPB Git

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%
5.9 KB · 98 lines markdown
Rendered Raw Blame History
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