# 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
