# Procédure de scraping Amazon.fr

## Objectif
- Extraire les champs requis (prix, stock, note, badges, image) sans casser le pipeline si un champ manque.
- Produire un snapshot propre + artefacts de debug si blocage.

## Pré-requis
- Playwright installé (Chromium).
- Config lue depuis `backend/config_backend.json`.
- Lancement via `scrape_product` ou `scrape_all`.

## Étapes de scraping
1. **Initialiser le navigateur**
   - Chromium, locale `fr-FR`, timezone `Europe/Paris`, viewport réaliste.
   - `user-agent` défini dans la config.

2. **Charger la page produit**
   - Délai aléatoire 1–3s entre requêtes.
   - Timeout contrôlé.

3. **Détecter blocage/captcha**
   - Si captcha / robot-check :
     - Marquer `scrape_status = blocked`.
     - Sauvegarder `screenshot` + `page.content()` dans `backend/data/screenshots`.
     - Log détaillé + retour sans crash.

4. **Extraire les champs**
   - Priorité aux IDs stables (ex: `#productTitle`, `#acrCustomerReviewText`, `#availability`).
   - Prix : gérer variantes (prix fractionné, promo).
   - Champs optionnels : si absent → `null` + log "missing field".

5. **Normaliser les valeurs**
   - Prix : `"249,99 €"` → `249.99`.
   - Notes : `"4,7 sur 5"` → `4.7`.
   - Stock : `in_stock` booléen + texte brut.

6. **Sauvegarder le snapshot**
   - Insérer un enregistrement `product_snapshots`.
   - Écrire un JSON raw dans `backend/data/raw/YYYY-MM/...`.

## Logs & erreurs
- Chaque scrap doit tracer : start, fields manquants, status, fin.
- Échec contrôlé si un champ est absent (jamais de crash global).

## Champs obligatoires
- `url`, `asin`, `title`, `image_main_url`, `price_current`, `stock_status`, `rating_value`, `rating_count`.

## Champs optionnels
- `price_list`, `discount_percent`, `lowest_30d_price`, `amazon_choice`, `limited_time_deal`, `prime_eligible`, `amazon_exclusive`.

## Notes
- Pas de calcul inventé (pas de réduction sans source).
- Stratégie captcha par défaut : abandon + log + retry plus tard.
