chore: sync project files
This commit is contained in:
152
CDISCOUNT_ANALYSIS.md
Executable file
152
CDISCOUNT_ANALYSIS.md
Executable file
@@ -0,0 +1,152 @@
|
||||
# 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
|
||||
Reference in New Issue
Block a user