232 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			232 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | # Scraper CCPL Agenda
 | ||
|  | 
 | ||
|  | Script de scraping pour l'agenda de la CCPL (Communauté de Communes du Pays de Limours) - https://www.cc-paysdelimours.fr/agenda | ||
|  | 
 | ||
|  | ## Fonctionnalités
 | ||
|  | 
 | ||
|  | ### 🚀 Scraping HTML Intelligent
 | ||
|  | - **Parsing HTML** : Extraction des événements depuis la structure HTML de l'agenda CCPL | ||
|  | - **Détection automatique** : Identification des liens d'événements avec classes spécifiques | ||
|  | - **Extraction complète** : Titre, date, URL, image, lieu | ||
|  | - **Détails enrichis** : Récupération des informations depuis les pages individuelles des événements | ||
|  | - **Fallback robuste** : Méthodes alternatives si la structure change | ||
|  | 
 | ||
|  | ### 💾 Cache JSON Intelligent
 | ||
|  | - **Détection de changements** : Hash MD5 du contenu HTML pour éviter les re-traitements | ||
|  | - **Cache persistant** : Sauvegarde des événements traités dans `ccpl_agenda_events.json` | ||
|  | - **Cache de contenu** : Sauvegarde du hash dans `ccpl_agenda_cache.json` | ||
|  | - **Optimisation** : Évite les re-téléchargements inutiles | ||
|  | 
 | ||
|  | ### ⚙️ Paramètres Configurables
 | ||
|  | - **Limite d'événements** : `--max-events N` (défaut: 1) | ||
|  | - **Mode dry-run** : Simulation par défaut, `--no-dry-run` pour l'envoi réel | ||
|  | - **Traitement parallèle** : `--parallel` pour plus de 10 événements | ||
|  | - **Workers** : `--max-workers N` pour le traitement parallèle | ||
|  | - **Cache** : `--cache-duration N` heures de validité | ||
|  | 
 | ||
|  | ### 🔄 Traitement Parallèle
 | ||
|  | - **Activation automatique** : Se déclenche pour plus de 10 événements avec `--parallel` | ||
|  | - **ThreadPoolExecutor** : Utilise `concurrent.futures` pour la parallélisation | ||
|  | - **Workers configurables** : Nombre de workers ajustable avec `--max-workers` | ||
|  | - **Thread-safe** : Méthode `process_single_event()` sécurisée pour les threads | ||
|  | 
 | ||
|  | ## Utilisation
 | ||
|  | 
 | ||
|  | ### Commandes de Base
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | # Mode dry-run par défaut (sécurisé)
 | ||
|  | python ccpl_agenda.py | ||
|  | 
 | ||
|  | # Limiter à 1 événement en mode dry-run
 | ||
|  | python ccpl_agenda.py --max-events 1 | ||
|  | 
 | ||
|  | # Mode réel avec limite de 5 événements
 | ||
|  | python ccpl_agenda.py --no-dry-run --max-events 5 | ||
|  | 
 | ||
|  | # Mode verbeux pour voir les détails
 | ||
|  | python ccpl_agenda.py --max-events 3 --verbose | ||
|  | 
 | ||
|  | # Forcer le rechargement de l'agenda
 | ||
|  | python ccpl_agenda.py --force-refresh --max-events 3 | ||
|  | 
 | ||
|  | # Traitement parallèle pour gros volumes
 | ||
|  | python ccpl_agenda.py --max-events 20 --parallel --max-workers 4 --no-dry-run | ||
|  | 
 | ||
|  | # Traitement parallèle en mode dry-run
 | ||
|  | python ccpl_agenda.py --max-events 50 --parallel --max-workers 8 | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Arguments Disponibles
 | ||
|  | 
 | ||
|  | | Argument | Description | Défaut | | ||
|  | |----------|-------------|---------| | ||
|  | | `--max-events N` | Limite le nombre d'événements à traiter | 1 | | ||
|  | | `--dry-run` | Mode simulation (par défaut) | Activé | | ||
|  | | `--no-dry-run` | Désactive le mode dry-run | - | | ||
|  | | `--verbose` | Mode verbeux | - | | ||
|  | | `--force-refresh` | Force le rechargement de l'agenda | - | | ||
|  | | `--cache-duration N` | Durée de validité du cache (heures) | 1 | | ||
|  | | `--batch-size N` | Taille des batches | 1 | | ||
|  | | `--api-url URL` | URL de l'API OEDB | https://api.openeventdatabase.org | | ||
|  | | `--parallel` | Activer le traitement parallèle pour plus de 10 événements | False | | ||
|  | | `--max-workers N` | Nombre maximum de workers pour le traitement parallèle | 4 | | ||
|  | 
 | ||
|  | ## Fichiers Générés
 | ||
|  | 
 | ||
|  | ### Cache JSON (`ccpl_agenda_cache.json`)
 | ||
|  | ```json | ||
|  | { | ||
|  |   "processed_events": { | ||
|  |     "event_id": { | ||
|  |       "processed_at": "2024-01-01T12:00:00", | ||
|  |       "status": "saved", | ||
|  |       "event_label": "Titre de l'événement" | ||
|  |     } | ||
|  |   }, | ||
|  |   "last_fetch": "2024-01-01T12:00:00", | ||
|  |   "content_hash": "abc123..." | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Événements JSON (`ccpl_agenda_events.json`)
 | ||
|  | ```json | ||
|  | { | ||
|  |   "events": { | ||
|  |     "event_id": { | ||
|  |       "status": "saved", | ||
|  |       "message": "Créé avec succès", | ||
|  |       "last_attempt": "2024-01-01T12:00:00", | ||
|  |       "event": { | ||
|  |         "properties": { | ||
|  |           "label": "Titre de l'événement", | ||
|  |           "description": "Description...", | ||
|  |           "type": "scheduled", | ||
|  |           "what": "culture.community", | ||
|  |           "where": "Pays de Limours, France", | ||
|  |           "start": "2024-01-01T10:00:00", | ||
|  |           "stop": "2024-01-01T12:00:00", | ||
|  |           "url": "https://www.cc-paysdelimours.fr/agenda/event", | ||
|  |           "source:name": "CCPL Agenda", | ||
|  |           "source:url": "https://www.cc-paysdelimours.fr/agenda", | ||
|  |           "last_modified_by": "ccpl_agenda_scraper", | ||
|  |           "tags": ["ccpl", "pays-de-limours", "événement-communal"], | ||
|  |           "image": "https://www.cc-paysdelimours.fr/image.jpg" | ||
|  |         }, | ||
|  |         "geometry": { | ||
|  |           "type": "Point", | ||
|  |           "coordinates": [2.0644, 48.5917] | ||
|  |         } | ||
|  |       } | ||
|  |     } | ||
|  |   }, | ||
|  |   "last_update": "2024-01-01T12:00:00" | ||
|  | } | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Structure des Événements
 | ||
|  | 
 | ||
|  | ### Propriétés Extraites
 | ||
|  | - **Titre** : Extrait depuis `<p class="agenda-title">` | ||
|  | - **Date** : Extrait depuis `<span class="number">` et `<span class="small">` | ||
|  | - **URL** : Lien vers la page détaillée de l'événement | ||
|  | - **Image** : Image de l'événement si disponible | ||
|  | - **Lieu** : Adresse détaillée extraite depuis la page de l'événement | ||
|  | - **Coordonnées** : Coordonnées depuis la carte Leaflet ou par défaut du Pays de Limours | ||
|  | - **Contact** : Téléphone, email et site web extraits depuis la page de l'événement | ||
|  | - **Description** : Description complète de l'événement | ||
|  | - **Horaires** : Informations d'ouverture et de tarifs | ||
|  | 
 | ||
|  | ### Format OEDB
 | ||
|  | Les événements sont formatés selon le standard GeoJSON attendu par l'API OEDB : | ||
|  | - **Type** : `scheduled` (événement programmé) | ||
|  | - **Catégorie** : `culture.community` (événement communautaire) | ||
|  | - **Tags** : `["ccpl", "pays-de-limours", "événement-communal"]` | ||
|  | - **Source** : `CCPL Agenda` avec URL de référence | ||
|  | - **Contact** : `contact:phone`, `contact:email`, `contact:website` si disponibles | ||
|  | 
 | ||
|  | ## Exemples de Sortie
 | ||
|  | 
 | ||
|  | ### Mode Dry-Run
 | ||
|  | ``` | ||
|  | 🚀 Démarrage du scraping de l'agenda CCPL | ||
|  | Configuration: batch_size=1, api_url=https://api.openeventdatabase.org | ||
|  | Mode dry-run: OUI | ||
|  | Limite d'événements: 3 | ||
|  | ============================================================ | ||
|  | 🌐 Récupération de l'agenda CCPL: https://www.cc-paysdelimours.fr/agenda | ||
|  | 🔄 Nouveau contenu détecté, mise à jour du cache | ||
|  | 🔗 30 liens d'événements trouvés | ||
|  | 📅 3 événements extraits au total | ||
|  | Traitement de 3 événements | ||
|  | Mode DRY-RUN activé - aucun événement ne sera envoyé à l'API | ||
|  | 📝 Détails de l'événement à insérer: | ||
|  |    ID: a650b1026dbfe0ae8a8832906591af4d | ||
|  |    Titre: Kylen... entre le rêve et la création | ||
|  |    Description: Événement organisé par la CCPL - Kylen... entre le rêve et la création | ||
|  |    Type: scheduled | ||
|  |    Catégorie: culture.community | ||
|  |    Lieu: Pays de Limours, France | ||
|  |    Début: 2025-09-30T00:00:00 | ||
|  |    Fin: 2025-09-30T02:00:00 | ||
|  |    URL: https://www.cc-paysdelimours.fr/agenda/kylen...-entre-le-reve-et-la-creation | ||
|  |    Source: CCPL Agenda | ||
|  |    Coordonnées: [2.0644, 48.5917] | ||
|  |    Tags: ccpl, pays-de-limours, événement-communal | ||
|  |    Modifié par: ccpl_agenda_scraper | ||
|  |    📞 Téléphone: 0164911908 | ||
|  |    📧 Email: bibliotheque@mairie-limours.fr | ||
|  |    🌐 Site web: https://x.com/CCPAYSDELIMOURS | ||
|  |    🖼️ Image: https://www.cc-paysdelimours.fr/isens_thumb.php?image=... | ||
|  | [DRY-RUN] Simulation d'envoi de l'événement: Kylen... entre le rêve et la création | ||
|  | ✅ Kylen... entre le rêve et la création - Simulé (dry-run) | ||
|  | 📊 Statistiques finales: | ||
|  |    total_events: 3 | ||
|  |    new_events: 3 | ||
|  |    already_saved: 0 | ||
|  |    api_errors: 0 | ||
|  |    parse_errors: 0 | ||
|  |    sent_this_run: 3 | ||
|  |    skipped_due_to_limit: 0 | ||
|  | ✅ Scraping terminé avec succès | ||
|  | ``` | ||
|  | 
 | ||
|  | ### Mode Parallèle
 | ||
|  | ``` | ||
|  | 🚀 Traitement parallèle de 20 événements avec 4 workers | ||
|  | Limite d'événements: 20 | ||
|  | Mode DRY-RUN activé - aucun événement ne sera envoyé à l'API | ||
|  | ✅ Événement 1 - Simulé (dry-run) | ||
|  | ✅ Événement 2 - Simulé (dry-run) | ||
|  | ... | ||
|  | 📊 Statistiques finales: | ||
|  |    total_events: 20 | ||
|  |    new_events: 20 | ||
|  |    sent_this_run: 20 | ||
|  | ``` | ||
|  | 
 | ||
|  | ## Avantages
 | ||
|  | 
 | ||
|  | 1. **Sécurité** : Mode dry-run par défaut | ||
|  | 2. **Performance** : Cache intelligent et traitement parallèle | ||
|  | 3. **Robustesse** : Gestion d'erreurs et fallbacks | ||
|  | 4. **Flexibilité** : Paramètres configurables | ||
|  | 5. **Traçabilité** : Logs détaillés et sauvegarde des états | ||
|  | 6. **Efficacité** : Évite les re-traitements inutiles | ||
|  | 7. **Parallélisation** : Traitement simultané pour les gros volumes | ||
|  | 8. **Extraction complète** : Toutes les métadonnées disponibles | ||
|  | 
 | ||
|  | ## Dépendances
 | ||
|  | 
 | ||
|  | ```bash | ||
|  | pip install -r requirements_ccpl.txt | ||
|  | ``` | ||
|  | 
 | ||
|  | - `requests>=2.25.0` : Requêtes HTTP | ||
|  | - `beautifulsoup4>=4.9.0` : Parsing HTML | ||
|  | - `lxml>=4.6.0` : Parser XML/HTML rapide | ||
|  | 
 | ||
|  | ## Migration
 | ||
|  | 
 | ||
|  | Le script est compatible avec la même structure que le scraper agenda du libre, permettant une utilisation cohérente dans l'écosystème OEDB. |