149 lines
5.0 KiB
Markdown
149 lines
5.0 KiB
Markdown
# Story 2.2: Implémenter le scraper Reddit
|
|
|
|
Status: review
|
|
|
|
## Story
|
|
|
|
As a développeur,
|
|
I want implémenter un scraper Reddit,
|
|
So que je peux collecter des discussions Reddit sur les matchs de football.
|
|
|
|
## Acceptance Criteria
|
|
|
|
**Given** les credentials Reddit API sont configurés
|
|
**When** le scraper Reddit est exécuté
|
|
**Then** il collecte des posts et commentaires de subreddits pertinents (r/soccer, r/football, etc.)
|
|
**And** il extrait le texte, upvotes, et timestamp
|
|
**And** les données sont stockées avec format cohérent avec Twitter
|
|
|
|
**Given** le scraper Reddit fonctionne
|
|
**When** il rencontre une erreur
|
|
**Then** l'erreur est loggée sans arrêter le processus global
|
|
**And** le scraper continue avec les autres sources
|
|
|
|
## Tasks / Subtasks
|
|
|
|
- [x] Installer les dépendances Reddit API (AC: #1)
|
|
- [x] Installer `praw` (Python Reddit API Wrapper)
|
|
- [x] Configurer les credentials Reddit API
|
|
- [x] Créer le module scraper Reddit
|
|
- [x] Vérifier l'authentification Reddit
|
|
- [x] Configurer les subreddits à scrapper
|
|
|
|
- [x] Implémenter le collecteur de posts Reddit (AC: #1)
|
|
- [x] Créer la fonction de collecte de posts par subreddit
|
|
- [x] Extraire les données: texte, upvotes, timestamp
|
|
- [x] Implémenter le parsing des données Reddit
|
|
- [x] Stocker les posts dans la base de données
|
|
- [x] Gérer les erreurs de connexion/timeout
|
|
|
|
- [x] Implémenter le collecteur de commentaires (AC: #1)
|
|
- [x] Créer la fonction de collecte de commentaires
|
|
- [x] Extraire les données: texte, upvotes, timestamp
|
|
- [x] Lier les commentaires aux posts parent
|
|
- [x] Stocker les commentaires dans la base de données
|
|
- [x] Gérer les erreurs
|
|
|
|
- [x] Créer les schémas de base de données pour posts Reddit (AC: #1)
|
|
- [x] Créer la table `posts_reddit` dans SQLite
|
|
- [x] Définir les colonnes: id, title, text, upvotes, created_at
|
|
- [x] Ajouter les colonnes pour match_id et source
|
|
- [x] Créer les indexes appropriés
|
|
- [x] Générer et appliquer les migrations
|
|
|
|
- [x] Implémenter la gestion d'erreurs robuste (AC: #2)
|
|
- [x] Logger toutes les erreurs sans arrêter le processus
|
|
- [x] Implémenter le retry pour les erreurs temporaires
|
|
- [x] Continuer avec les autres sources en cas d'erreur
|
|
- [x] Configurer les timeouts appropriés
|
|
- [x] Tester la gestion d'erreurs
|
|
|
|
- [x] Tester le scraper Reddit (AC: #1, #2)
|
|
- [x] Tester la collecte de posts pour un match
|
|
- [x] Vérifier que les données sont stockées correctement
|
|
- [x] Tester la gestion d'erreurs
|
|
- [x] Vérifier que le scraper continue avec autres sources
|
|
- [x] Valider le format cohérent avec Twitter
|
|
|
|
## Dev Notes
|
|
|
|
### Architecture Patterns et Contraintes
|
|
|
|
**Stack Technique Imposé:**
|
|
- **Reddit API:** PRAW (Python Reddit API Wrapper)
|
|
- **Database:** SQLite avec Drizzle (Next.js) et SQLAlchemy (FastAPI)
|
|
- **Logging:** Structuré avec gestion d'erreurs robuste
|
|
- **Pondération:** Reddit 25% (Twitter 60%, RSS 15%)
|
|
|
|
**Configuration Requise:**
|
|
- Credentials Reddit API: Client ID, Client Secret
|
|
- Subreddits: r/soccer, r/football, r/Ligue1, etc.
|
|
- Stockage: Tables `posts_reddit` dans SQLite
|
|
- Format cohérent avec Twitter (même structure de données)
|
|
|
|
### Technical Requirements
|
|
|
|
**Configuration Reddit API:**
|
|
```python
|
|
import praw
|
|
|
|
# Configuration Reddit API
|
|
reddit = praw.Reddit(
|
|
client_id="YOUR_CLIENT_ID",
|
|
client_secret="YOUR_CLIENT_SECRET",
|
|
user_agent="Chartbastan/1.0"
|
|
)
|
|
|
|
# Subreddits à scrapper
|
|
SUBREDDITS = ["soccer", "football", "Ligue1", "PremierLeague"]
|
|
```
|
|
|
|
### File Structure
|
|
|
|
```
|
|
backend/
|
|
├── app/
|
|
│ ├── scrapers/
|
|
│ │ └── reddit_scraper.py
|
|
│ ├── models/
|
|
│ │ └── reddit_post.py
|
|
│ └── schemas/
|
|
│ └── reddit_post.py
|
|
```
|
|
|
|
### References
|
|
|
|
- [Source: _bmad-output/planning-artifacts/epics.md#Story-2.2]
|
|
|
|
## Dev Agent Record
|
|
|
|
### Agent Model Used
|
|
|
|
GLM-4.7
|
|
|
|
### Completion Notes List
|
|
|
|
- Scraper Reddit implémenté avec succès
|
|
- Posts et commentaires collectés et stockés
|
|
- Gestion d'erreurs robuste fonctionnelle
|
|
- Tests unitaires complets créés
|
|
- Migrations Alembic générées pour tables Reddit
|
|
- Schémas Pydantic créés pour validation
|
|
- Intégration avec base de données SQLite via SQLAlchemy
|
|
- Structure cohérente avec scraper Twitter existant
|
|
- Logging structuré avec gestion d'erreurs
|
|
- Support de multiples subreddits
|
|
- Filtre par mots-clés optionnel
|
|
- Relation posts-commentaires via SQLAlchemy ORM
|
|
|
|
### File List
|
|
|
|
- `backend/app/scrapers/reddit_scraper.py` - Module principal scraper Reddit
|
|
- `backend/app/models/reddit_post.py` - Modèles SQLAlchemy pour posts et commentaires Reddit
|
|
- `backend/app/schemas/reddit_post.py` - Schémas Pydantic pour validation
|
|
- `backend/tests/test_reddit_scraper.py` - Tests unitaires complets
|
|
- `backend/alembic/versions/20260117_0002_create_reddit_tables.py` - Migration pour tables Reddit
|
|
- `backend/requirements.txt` - Ajout de dépendance praw==7.8.1
|
|
- `backend/app/models/__init__.py` - Export des nouveaux modèles
|
|
- `backend/app/schemas/__init__.py` - Export des nouveaux schémas
|