SPB Git forge

spb/resto-ka

Public

Resto·Ka — tous les restaurants du Québec, menus complets et prix réels (famille ·Ka)

52commits 1branches 0releases
11.6 MBsize
maindefault branch
19 days agolast push
Python 69.3% TypeScript 16.7% CSS 7.9% JavaScript 4.7% HTML 1.4%
5.8 KB · 81 lines markdown
Rendered Raw Blame History
1# Sites web des restos (menus maison) — connecteur `site-resto`23_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._45**État : actif** · Palier (tier) : 3 · Backend : Firecrawl · Restos actifs : 86/8667## Description de la source89Connecteur « 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/<GUID> 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.1011- **Plateforme** : sites-web · **Site** : https://www.resto-ka.com/sources12- **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.13- **Contexte de prix** : dine-in14- **Module** : `restoka/connectors/siteresto.py` — `SiteRestoConnector`1516## Accès1718- **Type d'accès** : pages HTML (rendu serveur)19- **Endpoint de base** : https://{m.group(120- **URLs du module** : https://{m.group(121- **Pagination** : itération sur 11 racines (constante `_RESERVATION_DOMAINS`)22- **Backend anti-bot / rendu** : requests direct (session UA RestoKaBot, throttling poli) ; Firecrawl (HTML rendu, JavaScript exécuté)23- **Politesse** : 1.0 s entre requêtes, timeout 20 s, UA `RestoKaBot/1.0 (+https://www.resto-ka.com/bot)`24- **Authentification** : aucune — accès public/anonyme2526## Champs récupérés → schéma cible2728Le 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.2930| Colonne `restaurants` | Contenu | Renseignée (actives) | Exemple réel |31|---|---|---|---|32| `name` | Nom de l'établissement | 100 % | Chez Roger |33| `chain` | Chaîne / bannière | 5 % | — |34| `cuisines` | Cuisines (JSON, taxonomie §6.1) | 100 % | ["fruits-de-mer", "bbq-grillades", "cafe-dessert", "fast-food"] |35| `establishment_type` | Type d'établissement | 100 % | restaurant |36| `price_range` | Fourchette de prix | 100 % | $ |37| `address` | Adresse civique | 86 % | 2316 Rue Beaubien Est |38| `city` | Ville | 10 % | — |39| `region` | Région administrative | 100 % | Montréal |40| `postal_code` | Code postal | 45 % | — |41| `lat` | GPS (lat/lng) | 100 % | 45.5470572 |42| `phone` | Téléphone | 83 % | +1 514 593 4200 |43| `website` | Site web | 100 % | https://www.chezroger.ca/ |44| `hours` | Horaires structurés (JSON) | 50 % | {"osm": "Mo-Su 17:00-23:00", "mon": [["17:00", "23:00"]], "tue": [["17:00", "23:00"]], "w… |45| `services` | Services (JSON) | 100 % | ["salle"] |46| `dietary_options` | Options alimentaires (JSON) | 70 % | [] |47| `images` | Photos (JSON) | 0 % | — |48| `url` | URL de la fiche source | 100 % | https://www.chezroger.ca/restaurant/menus.html |4950**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).5152## Fréquence & budget5354- **Cadence déclarée (registre)** : hebdomadaire (batch incrémental), re-crawl mensuel55- **Cadence observée** (médiane sync_log) : ≈ 25 min56- **Dernier passage OK** : 2026-08-18 03:17 — 86 trouvées, +82 / ~3 / -05758## Volumétrie & complétude5960- **Fiches en BD** : 86 au total, **86 actives**61- **Première ingestion** : 2026-08-18 · **Dernière observation** : 2026-08-1862- **Complétude clé (actives)** : GPS 100 % · adresse 86 % · cuisines 100 % · horaires 50 % · site web 100 %63- **Runs journalisés (60 derniers)** : 3, dont 0 en erreur6465## Erreurs connues & dépannage6667Aucune erreur dans les 60 derniers runs journalisés.6869Rejouer 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;`).7071## Licence, attribution & conditions7273- **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.74- **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.75- Retrait sur demande : contact@spboucher.ai.7677## Historique7879- 2026-08-18 — premières fiches de la source ingérées dans la BD.80- 2026-08-18 — vague d'enrichissement : standardisation de la documentation des connecteurs (fiche générée par `scripts/gen_connector_docs.py`).81