Files
scrap/CLAUDE.md
2026-01-13 19:49:04 +01:00

186 lines
5.9 KiB
Markdown
Executable File

# 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 <url>
# Fetch a single URL (HTTP or Playwright)
pricewatch fetch <url> --http
pricewatch fetch <url> --playwright
# Parse HTML file with specific store parser
pricewatch parse <store> --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