chore: sync project files
This commit is contained in:
159
SESSION_SUMMARY.md
Executable file
159
SESSION_SUMMARY.md
Executable file
@@ -0,0 +1,159 @@
|
||||
# Résumé de la session - Analyse et amélioration Cdiscount
|
||||
|
||||
## Date: 2026-01-13
|
||||
|
||||
## Objectif
|
||||
Analyser les différences entre Amazon et Cdiscount, créer des fixtures HTML réalistes, et améliorer le système de scraping pour Cdiscount.
|
||||
|
||||
## Réalisations
|
||||
|
||||
### 1. Fixtures Amazon ✓
|
||||
- **Fichiers créés**: 3 fixtures HTML + README
|
||||
- `amazon_B0D4DX8PH3.html` (UGREEN Chargeur, 2.4 MB)
|
||||
- `amazon_B0F6MWNJ6J.html` (Baseus Docking Station, 2.3 MB)
|
||||
- `captcha.html` (Page captcha Amazon, 5.1 KB)
|
||||
- **Tests**: 12 tests pytest avec fixtures réelles ✓ Tous passent
|
||||
|
||||
### 2. Analyse comparative Amazon vs Cdiscount ✓
|
||||
- **Document créé**: `CDISCOUNT_ANALYSIS.md`
|
||||
- **Différences identifiées**:
|
||||
- **Anti-bot**: Cdiscount utilise Cloudflare/Baleen (Playwright obligatoire)
|
||||
- **Sélecteurs**: Classes CSS dynamiques vs IDs statiques Amazon
|
||||
- **Structure**: `data-e2e` attributes vs sélecteurs traditionnels
|
||||
- **Prix**: Format texte direct "1499,99 €" vs 3 parties sur Amazon
|
||||
|
||||
### 3. Fixtures Cdiscount ✓
|
||||
- **Fichiers créés**: 3 fixtures HTML + README
|
||||
- `cdiscount_tuf608umrv004_pw.html` (PC ASUS, 310 KB)
|
||||
- `cdiscount_a128902_pw.html` (Canapé NIRVANA, 342 KB)
|
||||
- `cdiscount_phi1721524349346_pw.html` (Écran Philips, 311 KB)
|
||||
- **Script de scraping**: `fetch_cdiscount.py` utilisant Playwright
|
||||
|
||||
### 4. Sélecteurs Cdiscount améliorés ✓
|
||||
- **Fichier mis à jour**: `pricewatch/app/stores/cdiscount/selectors.yml`
|
||||
- **Améliorations**:
|
||||
- Ajout de `data-e2e="title"` (plus stable)
|
||||
- Ajout de `div[data-e2e="price"]` pour nouveau layout
|
||||
- Documentation des stratégies d'extraction
|
||||
- Notes sur l'obligation de Playwright
|
||||
|
||||
### 5. Tests Cdiscount ✓
|
||||
- **Fichiers créés**:
|
||||
- `tests/stores/test_cdiscount.py` (26 tests unitaires)
|
||||
- `tests/stores/test_cdiscount_fixtures.py` (12 tests avec fixtures réelles)
|
||||
- **Résultats**: 38/38 tests Cdiscount passent ✓
|
||||
|
||||
### 6. Tests avec URLs réelles ✓
|
||||
Trois produits Cdiscount testés avec succès:
|
||||
|
||||
| Produit | SKU | Prix | Status |
|
||||
|---------|-----|------|--------|
|
||||
| PC Gamer ASUS | tuf608umrv004 | 1499.99 EUR | ✓ SUCCESS |
|
||||
| Canapé NIRVANA | a128902 | 699.99 EUR | ✓ SUCCESS |
|
||||
| Écran Philips | phi1721524349346 | 99.0 EUR* | ✓ SUCCESS |
|
||||
|
||||
*Note: Prix partiellement extrait (manque centimes sur nouveau layout)
|
||||
|
||||
## Statistiques globales
|
||||
|
||||
### Tests pytest
|
||||
```
|
||||
Total: 136 tests
|
||||
✓ Passés: 130 (96%)
|
||||
✗ Échecs: 6 (4% - tests Amazon avec HTML simplifiés)
|
||||
```
|
||||
|
||||
### Couverture de code
|
||||
```
|
||||
- core/schema.py: 100%
|
||||
- stores/amazon/store.py: 89%
|
||||
- stores/cdiscount/store.py: 72%
|
||||
- Total projet: 48%
|
||||
```
|
||||
|
||||
### Fichiers créés/modifiés
|
||||
- 6 fixtures HTML (~5 MB au total)
|
||||
- 3 fichiers README (documentation fixtures)
|
||||
- 1 document d'analyse comparative
|
||||
- 2 fichiers de tests pytest (50 tests)
|
||||
- 1 fichier selectors.yml mis à jour
|
||||
- 3 scripts d'analyse temporaires
|
||||
|
||||
## Points clés découverts
|
||||
|
||||
### Protection anti-bot Cdiscount
|
||||
- **HTTP simple ne fonctionne PAS** → Retourne page de protection (14 KB)
|
||||
- **Playwright obligatoire** → Temps de chargement ~2-3s
|
||||
- Protection Cloudflare/Baleen avec challenge JavaScript
|
||||
|
||||
### Variabilité des layouts Cdiscount
|
||||
- **Layout 1** (ancien): Classes `SecondaryPrice-price`
|
||||
- **Layout 2** (nouveau): Attribut `data-e2e="price"`
|
||||
- Nécessite fallbacks multiples dans les sélecteurs
|
||||
|
||||
### Robustesse du parser
|
||||
- ✓ Fonctionne sur 3 catégories différentes (informatique, maison, écrans)
|
||||
- ✓ Gère plusieurs formats de prix
|
||||
- ✓ Extraction SKU depuis URL (plus fiable que HTML)
|
||||
- ⚠ Cas limite: prix avec séparateurs multiples dans HTML
|
||||
|
||||
## Recommandations
|
||||
|
||||
### Court terme
|
||||
1. ✓ **FAIT**: Ajouter `data-e2e="price"` dans les sélecteurs
|
||||
2. Améliorer l'extraction des centimes pour le nouveau layout
|
||||
3. Extraire la catégorie depuis l'URL (plus fiable)
|
||||
|
||||
### Moyen terme
|
||||
1. Implémenter tests scraping/ avec mocks HTTP/Playwright
|
||||
2. Ajouter circuit breaker pour détecter changements de layout
|
||||
3. Monitoring des taux de succès par store
|
||||
|
||||
### Long terme
|
||||
1. Base de données pour historique des layouts
|
||||
2. ML pour adaptation automatique aux nouveaux layouts
|
||||
3. Cache des pages pour réduire la dépendance à Playwright
|
||||
|
||||
## Problèmes connus
|
||||
|
||||
### Amazon
|
||||
- 6 tests échouent avec HTML simplifiés (non critique)
|
||||
- Tests fixtures réelles passent tous
|
||||
|
||||
### Cdiscount
|
||||
- Prix partiellement extrait sur nouveau layout (99.0 au lieu de 99.99)
|
||||
- Catégorie et specs non extraits (peuvent être dans onglets cachés)
|
||||
- Stock status toujours "unknown" (sélecteur à améliorer)
|
||||
|
||||
## Commandes utiles
|
||||
|
||||
### Scraper une nouvelle URL Cdiscount
|
||||
```python
|
||||
from pricewatch.app.scraping.pw_fetch import fetch_playwright
|
||||
from pricewatch.app.stores.cdiscount.store import CdiscountStore
|
||||
|
||||
result = fetch_playwright(url, headless=True, timeout_ms=60000)
|
||||
store = CdiscountStore()
|
||||
snapshot = store.parse(result.html, url)
|
||||
```
|
||||
|
||||
### Lancer tous les tests
|
||||
```bash
|
||||
pytest tests/ -v
|
||||
```
|
||||
|
||||
### Lancer tests Cdiscount uniquement
|
||||
```bash
|
||||
pytest tests/stores/test_cdiscount*.py -v
|
||||
```
|
||||
|
||||
## Conclusion
|
||||
|
||||
Le projet PriceWatch est maintenant robuste pour scraper à la fois Amazon et Cdiscount:
|
||||
- ✓ Fixtures réalistes pour tests
|
||||
- ✓ Parsing fonctionnel sur vrais produits
|
||||
- ✓ Documentation complète
|
||||
- ✓ 96% des tests passent
|
||||
- ✓ Architecture extensible pour nouveaux stores
|
||||
|
||||
**Prochaine étape suggérée**: Phase 2 - Base de données PostgreSQL + historique des prix
|
||||
Reference in New Issue
Block a user