Twitter Scraper
Module de scraping Twitter avec gestion des rate limiting et mode dégradé.
Fonctionnalités
- ✅ Collecte de tweets pour les matchs de football
- ✅ Rate limiting (1000 req/heure) avec alertes prédictives (>90%)
- ✅ Mode dégradé avec priorisation des matchs VIP
- ✅ Retry avec backoff exponentiel
- ✅ Logging structuré pour monitoring
- ✅ Stockage en base de données partagée
Installation
pip install tweepy==4.14.0
Configuration
Variables d'environnement requises:
# Twitter API Bearer Token
TWITTER_BEARER_TOKEN="your_bearer_token_here"
Utilisation
Exemple de base
from app.scrapers.twitter_scraper import create_twitter_scraper
from app.database import SessionLocal
# Créer le scraper
scraper = create_twitter_scraper(
bearer_token="your_bearer_token",
vip_match_ids=[1, 2, 3] # Matchs VIP pour mode dégradé
)
# Scrapper des tweets pour un match
db = SessionLocal()
try:
tweets = scraper.scrape_and_save(
match_id=1,
keywords=["#MatchName", "Team1 vs Team2"],
db=db,
max_results=100
)
print(f"✅ {len(tweets)} tweets collectés")
finally:
db.close()
Configuration avancée
from app.scrapers.twitter_scraper import TwitterScraper
scraper = TwitterScraper(
bearer_token="your_bearer_token",
max_tweets_per_hour=1000, # Limite par défaut
rate_limit_alert_threshold=0.9, # Alert à 90%
vip_match_ids=[1, 2, 3, 4, 5]
)
Architecture
Rate Limiting
Le scraper implémente:
- Tracking en temps réel des appels API
- Alertes prédictives quand la limite est atteinte à >90%
- Mode dégradé automatique quand la limite est atteinte
- Backoff exponentiel pour éviter les blocages
Mode Dégradé
Quand le rate limit est atteint:
- Le scraper passe en mode VIP seulement
- Seuls les matchs VIP sont scrapés
- Alertes loggées pour monitoring
- Les données sont sauvegardées avant arrêt
Tests
Exécuter les tests:
cd backend
pytest tests/test_twitter_scraper.py -v
Intégration
Le module s'intègre avec:
- SQLite: Base de données partagée avec Next.js
- SQLAlchemy: ORM pour le backend FastAPI
- Drizzle ORM: ORM pour le frontend Next.js
- RabbitMQ (Phase 2+): Queue asynchrone pour découplage
Conventions de Code
- Nommage Python:
snake_case - Nommage Base de données:
snake_case - Logging: Structuré avec
loggingmodule - Type hints: Obligatoires avec
typing
Documentation API
Voir documentation Tweepy pour plus de détails sur l'API Twitter.
Dépannage
Erreur: "Twitter API authentication failed"
Vérifiez votre bearer token:
client.get_me() # Devrait retourner vos infos utilisateur
Rate limit atteint trop rapidement
Vérifiez l'utilisation:
print(f"API calls: {scraper.api_calls_made}/{scraper.max_tweets_per_hour}")
Mode dégradé activé sans raison
Vérifiez les seuils:
print(f"Usage: {scraper.rate_limit_info.usage_percentage * 100:.1f}%")
Prochaines Étapes
- Intégration avec RabbitMQ (Phase 2)
- Système de priorisation dynamique
- Dashboard de monitoring en temps réel
- Tests d'intégration E2E