# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## Project Overview **PriceWatch** - Application Python de suivi de prix e-commerce (Amazon, Cdiscount, extensible à d'autres sites). L'objectif est de construire une application modulaire et testable en CLI pour tracker les prix de produits, avec scraping robuste (HTTP + Playwright fallback), avant d'ajouter une base de données et une interface web. **Langue du projet**: Les commentaires de code et discussions sont en français. ## Commands ### Development Setup ```bash # Install dependencies (when pyproject.toml exists) pip install -e . # Install Playwright browsers playwright install ``` ### CLI Commands (To be implemented) ```bash # Main scraping pipeline pricewatch run --yaml scrap_url.yaml --out scraped_store.json # Detect store from URL pricewatch detect # Fetch a single URL (HTTP or Playwright) pricewatch fetch --http pricewatch fetch --playwright # Parse HTML file with specific store parser pricewatch parse --in fichier.html # System health check pricewatch doctor # All commands support --debug flag for detailed logging ``` ### Testing ```bash # Run all tests pytest # Run tests for a specific store pytest tests/stores/amazon/ pytest tests/stores/cdiscount/ # Run with coverage pytest --cov=pricewatch ``` ## Architecture Le projet suit une architecture modulaire stricte: ``` pricewatch/ app/ core/ schema.py # Modèle Pydantic ProductSnapshot (canonique) registry.py # Détection automatique du store depuis URL io.py # Lecture YAML / écriture JSON logging.py # Configuration des logs scraping/ http_fetch.py # Récupération HTTP simple pw_fetch.py # Récupération Playwright (fallback anti-bot) stores/ base.py # Classe abstraite BaseStore amazon/ store.py # Implémentation AmazonStore selectors.yml # Sélecteurs XPath/CSS fixtures/ # Fichiers HTML de test cdiscount/ store.py # Implémentation CdiscountStore selectors.yml # Sélecteurs XPath/CSS fixtures/ # Fichiers HTML de test cli/ main.py # CLI Typer tests/ # Tests pytest par module/store scrap_url.yaml # Fichier de configuration des URLs à scraper scraped_store.json # Sortie du scraping scraped/ # Dossier pour HTML/screenshots de debug ``` ### Core Concepts **ProductSnapshot (Pydantic model)** - Modèle canonique contenant: - Métadonnées: `source`, `url`, `fetched_at` - Données produit: `title`, `price`, `currency`, `shipping_cost`, `stock_status`, `reference`, `images`, `category`, `specs` - Debug: `method` (http/playwright), `errors`, `notes`, `status` **BaseStore (Abstract)** - Chaque store doit implémenter: - `match(url) -> score`: Détection du site - `canonicalize(url)`: Normalisation de l'URL - `extract_reference(...)`: Extraction de la référence produit (ASIN, SKU) - `fetch(...)`: Récupération de la page - `parse(...) -> ProductSnapshot`: Parsing vers le modèle canonique **Registry** - Système de détection automatique qui teste tous les stores enregistrés avec `match()` et sélectionne celui avec le meilleur score. **Scraping Strategy**: 1. Tenter HTTP d'abord (rapide) 2. Si échec (403, captcha, etc.), fallback Playwright 3. Logging systématique: méthode, durée, taille HTML, erreurs 4. Sauvegarde optionnelle HTML/screenshot pour debug ### Configuration Files **scrap_url.yaml** - Input: ```yaml urls: - "https://www.amazon.fr/dp/EXAMPLE" - "https://www.cdiscount.com/EXAMPLE" options: use_playwright: true headful: false save_html: true save_screenshot: true timeout_ms: 60000 ``` **scraped_store.json** - Output: Liste de ProductSnapshot sérialisés en JSON. **selectors.yml** (par store) - Contient les sélecteurs XPath/CSS pour extraire chaque champ du ProductSnapshot. ## Technical Requirements - **Python**: 3.12 - **CLI Framework**: Typer - **Data Validation**: Pydantic - **Scraping**: requests + Playwright Python - **Testing**: pytest avec fixtures HTML - **Target**: Application finale en Docker ## Development Rules 1. **Justification technique**: Chaque décision doit être justifiée en 1-3 phrases 2. **Documentation obligatoire**: Maintenir README.md, TODO.md, CHANGELOG.md à jour à chaque étape 3. **Code exécutable**: Chaque étape livrée doit être testable avec des exemples CLI 4. **Robustesse**: Les erreurs (403, captcha, anti-bot) sont attendues - prioriser l'observabilité 5. **Pas d'optimisation prématurée**: Implémenter ce qui est demandé, pas plus 6. **Tests**: pytest obligatoire, au moins un fixture HTML par store 7. **Logs détaillés**: Méthode, durée, taille HTML, erreurs systématiquement loggées 8. **Ne jamais crasher silencieusement**: En cas d'échec, remplir `snapshot.debug.errors` ## Playwright Specifics - Mode headless/headful via CLI - Sauvegarde HTML optionnelle dans `scraped/` - Screenshot optionnel pour debug - Timeout configurable - Mode debug renforcé avec logs détaillés ## Testing Strategy - Tests de parsing sur fixtures HTML réels - Un dossier `tests/` par store - Tests unitaires des fonctions `match()`, `canonicalize()`, `extract_reference()` - Tests d'intégration du pipeline complet ## Future Roadmap (Non implémenté) Les étapes suivantes sont prévues mais pas encore codées: 1. Base de données PostgreSQL + Alembic 2. Worker + planification (Redis + RQ ou Celery) 3. Web UI responsive, dark theme type Gruvbox 4. Historique prix avec graphiques 5. Alertes (baisse prix, retour stock) 6. Système de plugins pour nouveaux stores ## Notes - SQLite sera utilisé initialement avant PostgreSQL - L'application finale sera conteneurisée (Docker) - Playwright pourra tourner dans Docker - Le projet est en phase 1: CLI d'abord, infrastructure ensuite