- Added a new script to scrape devil fruits and characters from One Piece fandom. - Implemented functions to fetch, normalize, and save data in JSON, CSV, and SQL formats. - Created a structured output directory for scraped data. feat(database): update schema for devil fruits and characters - Defined new types for devil fruits and haki in the database schema. - Updated the character table to include fields for age, affiliations, devil fruit, haki, bounty, height, origin, first appearance, and picture URL. feat(ui): enhance main page and daily mode layout - Redesigned the main page with a new layout and styling for the OnePieceDle game. - Created a new daily mode page with sections for clues and user input for guesses. - Removed demo authentication routes and pages to streamline the application.
131 lines
4.1 KiB
Markdown
131 lines
4.1 KiB
Markdown
# 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 (`<sup>` 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)
|