# đŸ§Ș Fichiers de test - Guide d'utilisation Ce dossier contient des fichiers JSON de test pour valider les sĂ©lecteurs et le fonctionnement des stores sans faire de requĂȘtes rĂ©elles. ## 📁 Fichiers disponibles ``` ├── test_amazon.json Configuration de test pour Amazon ├── test_cdiscount.json Configuration de test pour Cdiscount └── test_selectors.py Script de validation des sĂ©lecteurs ``` ## 🎯 Objectif Ces fichiers permettent de : 1. **Tester la dĂ©tection d'URL** : VĂ©rifier que les stores sont correctement dĂ©tectĂ©s 2. **Valider l'extraction de rĂ©fĂ©rence** : ASIN pour Amazon, SKU pour Cdiscount 3. **Documenter les sĂ©lecteurs** : Avoir une rĂ©fĂ©rence claire des sĂ©lecteurs utilisĂ©s 4. **Faciliter le debug** : Identifier rapidement les sĂ©lecteurs qui ne fonctionnent plus ## 📋 Structure d'un fichier de test JSON ```json { "test_config": { "store": "amazon", // ID du store "url": "https://...", // URL d'exemple "description": "Description du test" }, "selectors": { "title": { // Champ Ă  extraire "type": "css", // Type: css ou regex "selector": "#productTitle", // SĂ©lecteur CSS "expected": "Valeur attendue" // Valeur exemple }, "price": { "type": "css", "selector": "span[itemprop='price']", "attribute": "content", // Attribut HTML (optionnel) "expected": "299.99" } }, "test_data": { "valid_urls": [ // URLs valides pour test "https://www.amazon.fr/dp/B08N5WRWNW", "https://www.amazon.fr/product/dp/B08N5WRWNW/ref=xyz" ], "expected_canonical": "...", // URL canonique attendue "expected_asin": "B08N5WRWNW" // RĂ©fĂ©rence attendue } } ``` ## 🚀 Utilisation ### 1. Tester les sĂ©lecteurs avec le script Python ```bash # Activer l'environnement source venv/bin/activate # Tester Amazon python test_selectors.py test_amazon.json # Tester Cdiscount python test_selectors.py test_cdiscount.json ``` ### 2. Tester avec une vraie page ```bash # Étape 1: RĂ©cupĂ©rer une vraie page HTML pricewatch fetch "https://www.amazon.fr/dp/B08N5WRWNW" --http # La page sera sauvegardĂ©e dans scraped/ si save_html: true # Ensuite parser avec le store appropriĂ© # Étape 2: Parser le HTML rĂ©cupĂ©rĂ© pricewatch parse amazon --in scraped/amazon_B08N5WRWNW.html ``` ### 3. Tester le pipeline complet Éditer `scrap_url.yaml` avec l'URL du fichier de test : ```yaml urls: - "https://www.amazon.fr/dp/B08N5WRWNW" options: use_playwright: true save_html: true save_screenshot: true ``` Puis lancer : ```bash pricewatch run --yaml scrap_url.yaml --debug ``` ## 📊 RĂ©sultats des tests ### ✅ Tests Amazon ``` 📍 Test URL: https://www.amazon.fr/dp/B08N5WRWNW ✓ Store dĂ©tectĂ©: amazon ✓ URL canonique: https://www.amazon.fr/dp/B08N5WRWNW ✓ RĂ©fĂ©rence: B08N5WRWNW ``` **SĂ©lecteurs testĂ©s** : - `#productTitle` → Titre du produit - `span.a-price-whole` → Prix - `span.a-price-symbol` → Devise - `#availability span` → Stock - `#landingImage` → Image principale - `#wayfinding-breadcrumbs_feature_div` → CatĂ©gorie ### ✅ Tests Cdiscount ``` 📍 Test URL: https://www.cdiscount.com/.../f-1070123-exemple.html ✓ Store dĂ©tectĂ©: cdiscount ✓ URL canonique: https://www.cdiscount.com/.../f-1070123-exemple.html ✓ RĂ©fĂ©rence: 1070123-exemple ``` **SĂ©lecteurs testĂ©s** : - `h1[itemprop='name']` → Titre - `span[itemprop='price']` → Prix (attribut content) - `meta[itemprop='priceCurrency']` → Devise (attribut content) - `link[itemprop='availability']` → Stock (attribut href) - `img[itemprop='image']` → Images - `.breadcrumb` → CatĂ©gorie ## 🔧 Maintenance des sĂ©lecteurs Les sites e-commerce changent frĂ©quemment leurs sĂ©lecteurs. Voici comment mettre Ă  jour : ### 1. Identifier un sĂ©lecteur cassĂ© Si le parsing Ă©choue : ```bash pricewatch run --debug # Regarde les logs pour voir quel champ est manquant ``` ### 2. Trouver le nouveau sĂ©lecteur ```bash # RĂ©cupĂ©rer la page HTML pricewatch fetch "URL" --http # Ouvrir scraped/page.html dans un navigateur # Inspecter l'Ă©lĂ©ment (F12 → Inspecter) # Copier le nouveau sĂ©lecteur CSS ``` ### 3. Mettre Ă  jour les fichiers **Dans `test_amazon.json` ou `test_cdiscount.json`** : ```json { "selectors": { "title": { "selector": "#nouveauSelecteur" // ← Nouveau sĂ©lecteur } } } ``` **Dans `pricewatch/app/stores/amazon/selectors.yml`** : ```yaml title: - "#nouveauSelecteur" # Nouveau (prioritaire) - "#productTitle" # Ancien (fallback) ``` ### 4. Re-tester ```bash python test_selectors.py test_amazon.json # VĂ©rifier que la dĂ©tection fonctionne toujours ``` ## 💡 Bonnes pratiques ### SĂ©lecteurs robustes ✅ **PrĂ©fĂ©rer** : - SĂ©lecteurs avec `id` : `#productTitle` - Attributs schema.org : `[itemprop='name']` - Classes stables : `.product-title` ❌ **Éviter** : - Classes gĂ©nĂ©riques : `.row`, `.col-md-6` - Noms de classes avec hash : `.css-1a2b3c4` - SĂ©lecteurs trop spĂ©cifiques : `div > div > div > span` ### Fallbacks multiples Toujours prĂ©voir plusieurs sĂ©lecteurs dans le YAML : ```yaml title: - "#productTitle" # SĂ©lecteur principal - ".product-title" # Fallback 1 - "h1.product-name" # Fallback 2 ``` Le parser essaiera chaque sĂ©lecteur dans l'ordre jusqu'Ă  trouver un match. ### Extraction d'attributs Pour extraire un attribut HTML (ex: `src`, `href`, `content`) : ```json { "images": { "type": "css", "selector": "img#landingImage", "attribute": "src" // ← Important pour les attributs } } ``` ## 📝 Ajouter un nouveau store Pour ajouter un nouveau store (ex: Fnac) : ### 1. CrĂ©er le fichier de test JSON ```bash cp test_amazon.json test_fnac.json # Éditer test_fnac.json avec les infos Fnac ``` ### 2. CrĂ©er le store Python ```python # pricewatch/app/stores/fnac/store.py from pricewatch.app.stores.base import BaseStore class FnacStore(BaseStore): def match(self, url: str) -> float: return 0.9 if "fnac.com" in url.lower() else 0.0 # ... implĂ©menter les autres mĂ©thodes ``` ### 3. CrĂ©er le fichier de sĂ©lecteurs ```yaml # pricewatch/app/stores/fnac/selectors.yml title: - ".product-title" price: - ".price-amount" # ... etc ``` ### 4. Tester ```bash python test_selectors.py test_fnac.json ``` ## 🐛 Debug ### ProblĂšme : Store non dĂ©tectĂ© ```bash # VĂ©rifier le score de match python test_selectors.py test_amazon.json # Si score = 0, vĂ©rifier la mĂ©thode match() du store ``` ### ProblĂšme : SĂ©lecteur ne trouve rien ```bash # 1. Sauvegarder le HTML pricewatch fetch "URL" --http # 2. Inspecter le HTML cat scraped/page.html | grep -i "productTitle" # 3. Tester avec BeautifulSoup python -c " from bs4 import BeautifulSoup html = open('scraped/page.html').read() soup = BeautifulSoup(html, 'lxml') print(soup.select('#productTitle')) " ``` ### ProblĂšme : Parsing incomplet Les logs indiquent quel champ manque : ``` debug.errors: ["Titre non trouvĂ©", "Prix non trouvĂ©"] ``` Ajuster les sĂ©lecteurs en consĂ©quence. ## 📚 Ressources - **Documentation sĂ©lecteurs CSS** : https://developer.mozilla.org/fr/docs/Web/CSS/CSS_Selectors - **BeautifulSoup** : https://www.crummy.com/software/BeautifulSoup/bs4/doc/ - **Schema.org** : https://schema.org/Product (pour Cdiscount et sites avec mĂ©tadonnĂ©es) --- **Note** : Ces fichiers de test sont essentiels pour maintenir la robustesse du scraping. Mettez-les Ă  jour dĂšs qu'un sĂ©lecteur cesse de fonctionner.