231 lines
		
	
	
	
		
			8.3 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			231 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.
 | 
