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:
2026-02-27 01:14:44 +01:00
parent c494866a70
commit 6f7bae2307
17 changed files with 2407 additions and 165 deletions

130
SCRAPER.md Normal file
View 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)