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

153 lines
4.5 KiB
Markdown
Executable File

# Analyse comparative: Amazon vs Cdiscount
## URL exemple
- **Amazon**: `https://www.amazon.fr/dp/B0D4DX8PH3`
- **Cdiscount**: `https://www.cdiscount.com/informatique/ordinateurs-pc-portables/pc-portable-gamer-asus-tuf-gaming-a16-sans-windo/f-10709-tuf608umrv004.html`
## Différences majeures
### 1. Protection anti-bot
**Amazon**:
- HTTP simple fonctionne généralement
- Quelques captchas occasionnels
**Cdiscount**:
- ✗ HTTP simple retourne une page de protection JavaScript (Cloudflare/Baleen)
-**Playwright obligatoire** pour contourner la protection
- Timeout: ~2-3 secondes pour charger la page
### 2. Structure HTML
**Amazon**:
- IDs statiques: `#productTitle`, `#landingImage`, `#availability`
- Classes avec préfixes: `.a-price-whole`, `.a-price-fraction`
- Prix divisé en 3 parties (entier + fraction + symbole)
- Beaucoup de métadonnées dans le HTML
**Cdiscount**:
- ✗ Pas de JSON-LD schema.org (contrairement à ce qu'on pourrait attendre)
- Classes CSS générées dynamiquement: `sc-bdvvtL`, `sc-110rxkl-0`, etc.
- data-e2e attributes pour les tests E2E: `data-e2e="title"`
- Prix affiché directement: "1499,99 €"
### 3. Sélecteurs identifiés
#### Titre
```css
h1[data-e2e="title"]
```
- Classes: `sc-bdvvtL sc-1hgfn9o-0 hFUtWx kQxXmq` (peuvent changer)
- ✓ Utiliser `data-e2e="title"` plus stable
#### Prix
**Classe instable**:
- `div.SecondaryPrice-price` contient "1499,99 €"
- Classes: `sc-83lijy-0 kwssIa SecondaryPrice-price`
**Regex sur le texte**:
- Pattern: `(\d+[,\.]\d+)\s*€`
- Plus robuste que les classes
#### Images
```css
img[alt*="PC Portable"]
```
- Attribut `alt` contient le titre du produit
- URL format: `https://www.cdiscount.com/pdt2/0/0/4/X/700x700/tuf608umrv004/rw/...`
- Plusieurs résolutions disponibles (URL path change)
#### SKU / Référence
**Depuis l'URL**:
```
https://www.cdiscount.com/.../f-10709-tuf608umrv004.html
^^^^^^^^^^^^^^^
category-SKU
```
- Pattern regex: `/f-(\d+)-([a-z0-9]+)\.html`
- SKU = deuxième groupe (ex: `tuf608umrv004`)
#### Catégorie
- ✗ Pas de breadcrumb visible dans le HTML analysé
- Peut être dans l'URL: `/informatique/ordinateurs-pc-portables/...`
- À extraire depuis le path URL
#### Stock / Disponibilité
- ✗ Pas d'élément clair trouvé avec "availability" ou "stock"
- Peut nécessiter analyse plus poussée ou être dans un script JS
### 4. Stratégie d'extraction
**Ordre de priorité**:
1. **Titre**: `h1[data-e2e="title"]` ✓ Stable
2. **Prix**:
- Regex sur le texte: `(\d+[,\.]\d+)\s*€`
- Fallback: chercher dans `div` avec "price" dans la classe
3. **Devise**: Toujours EUR pour Cdiscount France
4. **SKU**: Extraction depuis URL avec regex
5. **Images**: `img[alt]` où alt contient le titre
6. **Catégorie**: Extraction depuis l'URL path
7. **Stock**: À définir (default: unknown)
### 5. Recommandations
**Pour le parser Cdiscount**:
1.**Playwright obligatoire** - HTTP ne fonctionne pas
2. ✓ Utiliser les `data-e2e` attributes quand disponibles (plus stables)
3. ✓ Parsing prix par regex plutôt que sélecteurs CSS (classes instables)
4. ✓ SKU depuis URL (plus fiable que le HTML)
5. ⚠ Prévoir fallbacks multiples pour le prix (plusieurs formats possibles)
**Sélecteurs à mettre à jour dans `selectors.yml`**:
```yaml
title:
css: 'h1[data-e2e="title"]'
fallback_css: 'h1'
price:
# Prix extrait par regex depuis le texte
regex: '(\d+[,\.]\d+)\s*€'
# Fallback: classes CSS (instables)
css: 'div[class*="SecondaryPrice-price"]'
currency:
static: 'EUR'
images:
css: 'img[alt]'
# Filtrer celles qui ont le titre dans alt
reference:
# Extraction depuis URL
url_regex: '/f-\d+-([a-z0-9]+)\.html'
category:
# Extraction depuis URL path
url_regex: '^/([^/]+)/([^/]+)/'
stock:
# À définir - default: unknown
css: 'div[class*="availability"]'
```
## Conclusion
Cdiscount est **significativement plus difficile** à scraper qu'Amazon:
| Critère | Amazon | Cdiscount |
|---------|--------|-----------|
| Anti-bot | Faible | ✗ Fort (Playwright requis) |
| Sélecteurs | ✓ Stables (IDs) | ✗ Instables (classes générées) |
| Structured data | ✓ Oui (JSON) | ✗ Non |
| Vitesse | ✓ Rapide (HTTP) | Lent (Playwright, ~2s) |
| Fiabilité | ✓✓ Haute | ⚠ Moyenne (nécessite fallbacks) |
**Stratégie recommandée**:
- Toujours utiliser Playwright pour Cdiscount
- Implémenter plusieurs fallbacks pour chaque champ
- Parser le prix par regex pour robustesse
- Extraire SKU et catégorie depuis l'URL plutôt que le HTML