# 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