160 lines
5.2 KiB
Markdown
Executable File
160 lines
5.2 KiB
Markdown
Executable File
# 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
|