# 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 `

` - **Date** : Extrait depuis `` et `` - **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.