153 lines
4.5 KiB
Markdown
Executable File
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
|