162 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			162 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | # Scraper Agenda du Libre
 | ||
|  | 
 | ||
|  | Script de scraping pour récupérer les événements de l'agenda du libre (https://www.agendadulibre.org/) et les envoyer à l'API OEDB. | ||
|  | 
 | ||
|  | ## Fonctionnalités
 | ||
|  | 
 | ||
|  | - 📥 Récupération automatique du fichier iCal depuis l'agenda du libre | ||
|  | - 🔄 Traitement par batch configurable | ||
|  | - 💾 Sauvegarde locale de l'état des événements (JSON) | ||
|  | - 🚫 Évite les doublons (ne renvoie pas les événements déjà traités) | ||
|  | - 📊 Statistiques détaillées et logging | ||
|  | - 🧪 Mode démo et tests inclus | ||
|  | 
 | ||
|  | ## Installation
 | ||
|  | 
 | ||
|  | 1. Installer les dépendances Python : | ||
|  | ```bash | ||
|  | pip install -r requirements_agendadulibre.txt | ||
|  | ``` | ||
|  | 
 | ||
|  | 2. Rendre les scripts exécutables : | ||
|  | ```bash | ||
|  | chmod +x agendadulibre.py | ||
|  | chmod +x test_agendadulibre.py | ||
|  | chmod +x demo_agendadulibre.py | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Utilisation
 | ||
|  | 
 | ||
|  | ### Scraping complet
 | ||
|  | ```bash | ||
|  | # Utilisation basique (1 événement par batch)
 | ||
|  | python agendadulibre.py | ||
|  | 
 | ||
|  | # Avec options personnalisées
 | ||
|  | python agendadulibre.py --api-url https://api.openeventdatabase.org --batch-size 5 --verbose | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Options disponibles
 | ||
|  | - `--api-url` : URL de base de l'API OEDB (défaut: https://api.openeventdatabase.org) | ||
|  | - `--batch-size` : Nombre d'événements à traiter par batch (défaut: 1) | ||
|  | - `--verbose` : Mode verbeux pour plus de détails | ||
|  | - `--force-refresh` : Forcer le rechargement du fichier iCal (ignorer le cache) | ||
|  | - `--cache-duration` : Durée de validité du cache en heures (défaut: 1) | ||
|  | 
 | ||
|  | ### Démonstration
 | ||
|  | ```bash | ||
|  | # Mode démo (ne fait pas d'appels API réels)
 | ||
|  | python demo_agendadulibre.py | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Tests
 | ||
|  | ```bash | ||
|  | # Exécuter les tests
 | ||
|  | python test_agendadulibre.py | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Fichiers générés
 | ||
|  | 
 | ||
|  | - `agendadulibre_events.json` : Base de données locale des événements traités | ||
|  | - `agendadulibre_events.ics` : Cache local du fichier iCal (valide 1h) | ||
|  | - `agendadulibre_scraper.log` : Logs détaillés du scraper | ||
|  | 
 | ||
|  | ## Système de cache iCal
 | ||
|  | 
 | ||
|  | Le script utilise un système de cache intelligent pour éviter de télécharger le fichier iCal à chaque exécution : | ||
|  | 
 | ||
|  | - **Cache valide** : Le fichier iCal est mis en cache localement pendant 1 heure par défaut | ||
|  | - **Rechargement automatique** : Si le cache est expiré, le fichier est automatiquement rechargé | ||
|  | - **Fallback** : En cas d'erreur de téléchargement, le script utilise le cache même s'il est expiré | ||
|  | - **Force refresh** : Option `--force-refresh` pour ignorer le cache et forcer le rechargement | ||
|  | 
 | ||
|  | ### Avantages du cache
 | ||
|  | - ⚡ **Performance** : Évite les téléchargements inutiles | ||
|  | - 🔄 **Fiabilité** : Fonctionne même si l'API iCal est temporairement indisponible | ||
|  | - 📊 **Efficacité** : Réduit la charge sur le serveur de l'agenda du libre | ||
|  | 
 | ||
|  | ## Format des événements
 | ||
|  | 
 | ||
|  | Les événements sont convertis au format OEDB avec les propriétés suivantes : | ||
|  | 
 | ||
|  | ```json | ||
|  | { | ||
|  |   "properties": { | ||
|  |     "label": "Titre de l'événement", | ||
|  |     "description": "Description de l'événement", | ||
|  |     "what": "culture.geek", | ||
|  |     "where": "Lieu de l'événement", | ||
|  |     "start": "2024-01-01T10:00:00", | ||
|  |     "stop": "2024-01-01T12:00:00", | ||
|  |     "url": "https://www.agendadulibre.org/event/123", | ||
|  |     "source": "agendadulibre.org", | ||
|  |     "last_modified_by": "agendadulibre_scraper" | ||
|  |   }, | ||
|  |   "geometry": { | ||
|  |     "type": "Point", | ||
|  |     "coordinates": [0, 0] | ||
|  |   } | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Gestion des doublons
 | ||
|  | 
 | ||
|  | Le script utilise un système de suivi local pour éviter les doublons : | ||
|  | 
 | ||
|  | - Chaque événement reçoit un ID unique basé sur son contenu | ||
|  | - Les événements déjà traités avec succès ne sont pas renvoyés | ||
|  | - Les événements en erreur peuvent être retentés | ||
|  | - Les événements déjà existants (réponse 409) sont marqués comme traités | ||
|  | 
 | ||
|  | ## Statuts des événements
 | ||
|  | 
 | ||
|  | - `saved` : Événement envoyé avec succès à l'API | ||
|  | - `already_exists` : Événement déjà existant dans l'API (réponse 409) | ||
|  | - `error` : Erreur lors de l'envoi à l'API | ||
|  | 
 | ||
|  | ## Exemple de sortie
 | ||
|  | 
 | ||
|  | ``` | ||
|  | 2024-01-01 10:00:00 - INFO - 🚀 Démarrage du scraping de l'agenda du libre | ||
|  | 2024-01-01 10:00:01 - INFO - Récupération du fichier iCal depuis https://www.agendadulibre.org/events.ics | ||
|  | 2024-01-01 10:00:02 - INFO - Fichier iCal récupéré avec succès | ||
|  | 2024-01-01 10:00:03 - INFO - Traitement de 15 nouveaux événements par batch de 1 | ||
|  | 2024-01-01 10:00:04 - INFO - Envoi de l'événement: Conférence Python | ||
|  | 2024-01-01 10:00:05 - INFO - ✅ Conférence Python - Créé avec succès | ||
|  | ... | ||
|  | 2024-01-01 10:00:30 - INFO - 📊 Statistiques finales: | ||
|  | 2024-01-01 10:00:30 - INFO -    Total d'événements trouvés: 25 | ||
|  | 2024-01-01 10:00:30 - INFO -    Nouveaux événements envoyés: 12 | ||
|  | 2024-01-01 10:00:30 - INFO -    Événements déjà existants: 8 | ||
|  | 2024-01-01 10:00:30 - INFO -    Erreurs d'API: 2 | ||
|  | 2024-01-01 10:00:30 - INFO -    Erreurs de parsing: 3 | ||
|  | 2024-01-01 10:00:30 - INFO -    Événements envoyés cette fois: 12 | ||
|  | 2024-01-01 10:00:30 - INFO - ✅ Scraping terminé avec succès | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Planification
 | ||
|  | 
 | ||
|  | Pour automatiser le scraping, vous pouvez utiliser cron : | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Exécuter toutes les heures
 | ||
|  | 0 * * * * cd /path/to/extractors && python agendadulibre.py --batch-size 5 | ||
|  | 
 | ||
|  | # Exécuter tous les jours à 6h
 | ||
|  | 0 6 * * * cd /path/to/extractors && python agendadulibre.py --batch-size 10 | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Dépannage
 | ||
|  | 
 | ||
|  | ### Erreur de connexion à l'API
 | ||
|  | - Vérifiez que l'API OEDB est démarrée | ||
|  | - Vérifiez l'URL de l'API avec `--api-url` | ||
|  | 
 | ||
|  | ### Erreur de parsing iCal
 | ||
|  | - Vérifiez la connectivité internet | ||
|  | - Vérifiez que l'URL iCal est accessible | ||
|  | 
 | ||
|  | ### Événements non géocodés
 | ||
|  | - Les événements sont créés avec des coordonnées par défaut [0, 0] | ||
|  | - Un processus de géocodage séparé peut être ajouté si nécessaire |