146 lines
4.5 KiB
Markdown
146 lines
4.5 KiB
Markdown
# Story 2.3: Implémenter le scraper RSS
|
|
|
|
Status: review
|
|
|
|
## Story
|
|
|
|
As a développeur,
|
|
I want implémenter un scraper RSS,
|
|
So que je peux collecter des articles de sources RSS sur les matchs.
|
|
|
|
## Acceptance Criteria
|
|
|
|
**Given** des URLs RSS sont configurées (sources sportives)
|
|
**When** le scraper RSS est exécuté
|
|
**Then** il parse les flux RSS et extrait les articles pertinents
|
|
**And** il extrait le titre, contenu, date de publication
|
|
**And** les données sont stockées avec format cohérent
|
|
|
|
**Given** une source RSS est indisponible
|
|
**When** le scraper tente de la lire
|
|
**Then** l'erreur est loggée
|
|
**And** le scraper continue avec les autres sources RSS
|
|
|
|
## Tasks / Subtasks
|
|
|
|
- [x] Installer les dépendances RSS (AC: #1)
|
|
- [x] Installer `feedparser` pour parsing RSS
|
|
- [x] Configurer les URLs RSS sources sportives
|
|
- [x] Créer le module scraper RSS
|
|
- [x] Configurer les sources RSS (ESPN, BBC Sport, etc.)
|
|
- [x] Vérifier l'accès aux flux RSS
|
|
|
|
- [x] Implémenter le parser RSS (AC: #1)
|
|
- [x] Créer la fonction de parsing de flux RSS
|
|
- [x] Extraire les données: titre, contenu, date
|
|
- [x] Filtrer les articles pertinents (football)
|
|
- [x] Stocker les articles dans la base de données
|
|
- [x] Gérer les erreurs de parsing
|
|
|
|
- [x] Créer les schémas de base de données pour articles RSS (AC: #1)
|
|
- [x] Créer la table `articles_rss` dans SQLite
|
|
- [x] Définir les colonnes: id, title, content, published_at
|
|
- [x] Ajouter les colonnes pour source_url et match_id
|
|
- [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] Continuer avec les autres sources RSS
|
|
- [x] Configurer les timeouts appropriés
|
|
- [x] Tester la gestion d'erreurs
|
|
|
|
- [x] Tester le scraper RSS (AC: #1, #2)
|
|
- [x] Tester le parsing de flux RSS
|
|
- [x] Vérifier que les articles sont stockés correctement
|
|
- [x] Tester la gestion d'erreurs
|
|
- [x] Valider le format cohérent avec Twitter/Reddit
|
|
|
|
## Dev Notes
|
|
|
|
### Architecture Patterns et Contraintes
|
|
|
|
**Stack Technique Imposé:**
|
|
- **RSS Parser:** feedparser
|
|
- **Database:** SQLite avec Drizzle (Next.js) et SQLAlchemy (FastAPI)
|
|
- **Sources:** ESPN, BBC Sport, Goal.com, etc.
|
|
- **Pondération:** RSS 15% (Twitter 60%, Reddit 25%)
|
|
|
|
### Technical Requirements
|
|
|
|
**Configuration RSS:**
|
|
```python
|
|
import feedparser
|
|
|
|
# Sources RSS
|
|
RSS_SOURCES = [
|
|
"http://www.espn.com/espn/rss/news",
|
|
"http://feeds.bbci.co.uk/sport/football/rss.xml",
|
|
"https://www.goal.com/rss"
|
|
]
|
|
|
|
def parse_rss_feed(url: str):
|
|
feed = feedparser.parse(url)
|
|
return feed.entries
|
|
```
|
|
|
|
### File Structure
|
|
|
|
```
|
|
backend/
|
|
├── app/
|
|
│ ├── scrapers/
|
|
│ │ └── rss_scraper.py
|
|
│ ├── models/
|
|
│ │ └── rss_article.py
|
|
│ └── schemas/
|
|
│ └── rss_article.py
|
|
```
|
|
|
|
### References
|
|
|
|
- [Source: _bmad-output/planning-artifacts/epics.md#Story-2.3]
|
|
|
|
## Dev Agent Record
|
|
|
|
### Agent Model Used
|
|
|
|
GLM-4.7
|
|
|
|
### Completion Notes List
|
|
|
|
- Scraper RSS implémenté avec succès
|
|
- Articles collectés et stockés
|
|
- Gestion d'erreurs robuste fonctionnelle
|
|
|
|
✅ **2026-01-17**: Implémentation complète du scraper RSS:
|
|
- Création du modèle de base de données `RSSArticle` avec indexes appropriés
|
|
- Création des schémas Pydantic pour validation
|
|
- Implémentation du module `RSSScraper` avec parsing de flux RSS
|
|
- Filtrage automatique des articles pertinents (mots-clés football)
|
|
- Gestion d'erreurs robuste: continue avec les autres sources en cas d'erreur
|
|
- Configuration par défaut avec 4 sources sportives (ESPN, BBC Sport, Goal.com, Sky Sports)
|
|
- Timeout configurable (30 secondes par défaut)
|
|
- Migration Alembic créée pour la table `rss_articles`
|
|
- Tests unitaires complets créés avec mocks
|
|
- Format cohérent avec les scrapers Twitter et Reddit
|
|
|
|
### File List
|
|
|
|
- `backend/app/scrapers/rss_scraper.py` (nouveau)
|
|
- `backend/app/models/rss_article.py` (nouveau)
|
|
- `backend/app/schemas/rss_article.py` (nouveau)
|
|
- `backend/app/models/__init__.py` (modifié)
|
|
- `backend/app/schemas/__init__.py` (modifié)
|
|
- `backend/alembic/versions/20260117_0007_create_rss_articles_table.py` (nouveau)
|
|
- `backend/tests/test_rss_scraper.py` (nouveau)
|
|
|
|
## Change Log
|
|
|
|
### 2026-01-17
|
|
- Implémentation du scraper RSS complet avec feedparser
|
|
- Création de la table `rss_articles` dans SQLite
|
|
- Implémentation de la gestion d'erreurs robuste
|
|
- Création de la migration Alembic `20260117_0007_create_rss_articles_table`
|
|
- Ajout des tests unitaires pour le scraper RSS
|