186 lines
5.9 KiB
Markdown
Executable File
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
|