# One Piece Scraper Script pour scraper les données des personnages de One Piece depuis le fandom wiki français. ## Installation Installe les dépendances d'abord : ```bash npm install ``` ## Utilisation ```bash # Scraper tous les formats (JSON, CSV, SQL) npm run scrape # Ou spécifier un format node scripts/scrape-onepiece.js json # JSON uniquement node scripts/scrape-onepiece.js csv # CSV uniquement node scripts/scrape-onepiece.js sql # SQL uniquement node scripts/scrape-onepiece.js all # Tous les formats (défaut) ``` ## Sortie Les données seront sauvegardées dans le dossier `scraped-data/` : - **characters.json** - Format JSON avec toutes les données structurées - **characters.csv** - Format CSV pour importer dans Excel/Sheets - **characters.sql** - Statements SQL avec gestion des conflits (upsert) ## Données extraites Pour chaque personnage : - 📝 **Nom** - Nom du personnage - 👤 **Genre** - Masculin/Féminin (extrait des catégories) - 🎂 **Âge** - Âge le plus récent (post-ellipse), chiffres uniquement - 📏 **Taille** - Normalisée en mètres (format: "2.74" ou "174" pour cm) - 🌍 **Origine** - Lieu d'origine (sans parenthèses) - 😈 **Fruit du Démon** - Nom du fruit (si applicable) - 👥 **Affiliations** - Liste des affiliations (équipages, organisations) - 💰 **Prime** - Bounty la plus récente - ⚡ **Haki** - Liste des types de Haki (Observation, Armament, Conqueror) - 📖 **Première Apparition** - Numéro de chapitre - 🖼️ **Image** - URL de l'image portrait nettoyée - 🔗 **Fandom URL** - Lien vers la page wiki ## Personnages scrapés Le script scrape tous les personnages canon de la liste officielle du Fandom wiki français. **Personnages actuellement filtrés** : Luffy et Moria (modifiable dans `fetchAllCharactersUrl`) Pour scraper tous les personnages, retire le filtre dans la fonction `fetchAllCharactersUrl`. ## Fonctionnalités avancées ### Requêtes parallèles - Le scraper traite 5 personnages en parallèle pour plus d'efficacité - Concurrency configurable dans le code ### Nettoyage des données - Suppression automatique des citations/références (`` tags) - Âge : extraction du dernier âge (après ellipse), sans parenthèses - Taille : normalisation m/cm et suppression des parenthèses - Origine : suppression du contenu entre parenthèses - Image : sélection automatique du portrait - Première apparition : extraction du numéro de chapitre uniquement ### SQL Upsert - Le SQL généré utilise `INSERT ... ON CONFLICT(name) DO UPDATE` - Met à jour les personnages existants au lieu de créer des doublons - Compatible SQLite (utilisé par le projet) ### Formats de données - **Haki** : Stocké comme array JSON dans SQL : `["Observation","Armament"]` - **Affiliations** : Liste dans JSON, comma-separated dans CSV/SQL - Tous les champs nullable supportent `NULL` dans SQL ## Configuration ### Modifier les personnages filtrés Dans `scripts/scrape-onepiece.js`, fonction `fetchAllCharactersUrl` : ```javascript // Filtrer pour des personnages spécifiques if (nameLower.includes('luffy') || nameLower.includes('moria')) { characters.push({ name: charName, url: charLink }); } ``` ### Ajuster la concurrence Dans la fonction `main` : ```javascript const concurrency = 5; // Nombre de requêtes simultanées ``` ## Importer les données SQL Après avoir généré le fichier SQL, importe-le dans la base de données : ```bash npm run db:import ``` Ce script : - Lit automatiquement `scraped-data/characters.sql` - Exécute chaque statement individuellement - Affiche une barre de progression - Gère les erreurs sans bloquer l'import complet - Utilise le upsert pour éviter les doublons **Note** : Assure-toi d'avoir exécuté les migrations avant l'import : ```bash npm run db:migrate ``` ## Notes techniques - Source : `https://onepiece.fandom.com/fr/wiki` - Parseur : Cheerio (DOM parsing) - Traitement parallèle avec `Promise.all` - User-Agent configuré pour éviter les blocages - Pas de délai entre requêtes (batches parallèles) - Gestion d'erreurs par personnage (ne bloque pas le scraping complet)