# Sites web des restos (menus maison) — connecteur `site-resto` _Fiche générée automatiquement par `scripts/gen_connector_docs.py` le 2026-08-18 06:06 — ne pas éditer à la main, régénérer._ **État : actif** · Palier (tier) : 3 · Backend : Firecrawl · Restos actifs : 86/86 ## Description de la source Connecteur « sites web des restos » (Palier 3) — capte les MENUS MAISON des restaurants découverts par OSM qui publient un site web. Pipeline par site (budget par passage, incrémental via detail_cache) : 1. GET la page d'accueil (requests direct, UA RestoKaBot). 2. DÉTECTION DE PLATEFORME (CLAUDE.md §9 P3) : si le site embarque UEAT (order.ueat.io/integration/ ou *.order-online.ai), le GUID est consigné dans data/ueat-discovered.json — le connecteur UEAT (Palier 1, menu structuré parfait) le couvrira au prochain passage. Aucune fiche émise ici. 3. Sinon : trouver le lien « menu/carte », récupérer la page (Firecrawl en secours pour les sites JS, budget limité) ou le PDF du menu. 4. Structuration par Claude Haiku 4.5 (restoka/menullm.py) — sorties structurées JSON + validation STRICTE des prix. 5. Émettre une fiche `site-resto` clonée de la fiche OSM avec le menu ; la déduplication masque la fiche OSM derrière elle. Contexte de prix produit : DINE-IN (menu affiché par le resto lui-même — la référence idéale, §6.2). price_source: site-resto. Les fiches déjà captées sont RÉÉMISES depuis la base à chaque passage (délai de grâce) et re-crawlées après REFRESH_DAYS. - **Plateforme** : sites-web · **Site** : https://www.resto-ka.com/sources - **Extraction (registre)** : Crawl des sites web publiés par les restos découverts via OSM : détection de plateforme (UEAT → GUID consigné dans ueat-discovered.json), sinon page menu HTML (requests, Firecrawl en secours pour le JS) ou PDF → structuration par Claude Haiku 4.5 (sorties structurées JSON) → validation stricte des prix (≥5 plats avec prix, ≥40 % des items, 0,50–500 $). Budget de 250 sites/passage, re-crawl mensuel. - **Contexte de prix** : dine-in - **Module** : `restoka/connectors/siteresto.py` — `SiteRestoConnector` ## Accès - **Type d'accès** : pages HTML (rendu serveur) - **Endpoint de base** : https://{m.group(1 - **URLs du module** : https://{m.group(1 - **Pagination** : itération sur 11 racines (constante `_RESERVATION_DOMAINS`) - **Backend anti-bot / rendu** : requests direct (session UA RestoKaBot, throttling poli) ; Firecrawl (HTML rendu, JavaScript exécuté) - **Politesse** : 1.0 s entre requêtes, timeout 20 s, UA `RestoKaBot/1.0 (+https://www.resto-ka.com/bot)` - **Authentification** : aucune — accès public/anonyme ## Champs récupérés → schéma cible Le connecteur alimente la table `restaurants` (et `menus` le cas échéant). Complétude mesurée en SQL sur les 86 fiches actives ; exemple tiré d'une ligne réelle de la BD. | Colonne `restaurants` | Contenu | Renseignée (actives) | Exemple réel | |---|---|---|---| | `name` | Nom de l'établissement | 100 % | Chez Roger | | `chain` | Chaîne / bannière | 5 % | — | | `cuisines` | Cuisines (JSON, taxonomie §6.1) | 100 % | ["fruits-de-mer", "bbq-grillades", "cafe-dessert", "fast-food"] | | `establishment_type` | Type d'établissement | 100 % | restaurant | | `price_range` | Fourchette de prix | 100 % | $ | | `address` | Adresse civique | 86 % | 2316 Rue Beaubien Est | | `city` | Ville | 10 % | — | | `region` | Région administrative | 100 % | Montréal | | `postal_code` | Code postal | 45 % | — | | `lat` | GPS (lat/lng) | 100 % | 45.5470572 | | `phone` | Téléphone | 83 % | +1 514 593 4200 | | `website` | Site web | 100 % | https://www.chezroger.ca/ | | `hours` | Horaires structurés (JSON) | 50 % | {"osm": "Mo-Su 17:00-23:00", "mon": [["17:00", "23:00"]], "tue": [["17:00", "23:00"]], "w… | | `services` | Services (JSON) | 100 % | ["salle"] | | `dietary_options` | Options alimentaires (JSON) | 70 % | [] | | `images` | Photos (JSON) | 0 % | — | | `url` | URL de la fiche source | 100 % | https://www.chezroger.ca/restaurant/menus.html | **Menus** : 86 menus rattachés (4667 items, 1 contexte(s) de prix, dernière capture 2026-08-18T07:17:34Z) — table `menus` (sections → items → options, prix CAD). ## Fréquence & budget - **Cadence déclarée (registre)** : hebdomadaire (batch incrémental), re-crawl mensuel - **Cadence observée** (médiane sync_log) : ≈ 25 min - **Dernier passage OK** : 2026-08-18 03:17 — 86 trouvées, +82 / ~3 / -0 ## Volumétrie & complétude - **Fiches en BD** : 86 au total, **86 actives** - **Première ingestion** : 2026-08-18 · **Dernière observation** : 2026-08-18 - **Complétude clé (actives)** : GPS 100 % · adresse 86 % · cuisines 100 % · horaires 50 % · site web 100 % - **Runs journalisés (60 derniers)** : 3, dont 0 en erreur ## Erreurs connues & dépannage Aucune erreur dans les 60 derniers runs journalisés. Rejouer la source seule : `python3 run.py sync site-resto` · vérifier `sync_log` (`SELECT * FROM sync_log WHERE source='site-resto' ORDER BY ts DESC LIMIT 5;`). ## Licence, attribution & conditions - **Cadre d'accès (registre, `acces_legal`)** : Sites publics de première partie (le menu affiché par le resto lui-même — la voie la plus légitime, CLAUDE.md §15). UA identifiable RestoKaBot, 1 req/s, aucun contournement. - **Scraping / API** : User-Agent identifiable `RestoKaBot/1.0 (+https://www.resto-ka.com/bot; contact@spboucher.ai)`, throttling poli, aucun contournement d'accès ; les fiches pointent vers la source d'origine. - Retrait sur demande : contact@spboucher.ai. ## Historique - 2026-08-18 — premières fiches de la source ingérées dans la BD. - 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`).