feat(scraper): implement One Piece data scraper for devil fruits and characters
- 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.
This commit is contained in:
130
SCRAPER.md
Normal file
130
SCRAPER.md
Normal file
@@ -0,0 +1,130 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user