add ccpl scraping start
This commit is contained in:
parent
e16d77d056
commit
24bd65565c
8 changed files with 1506 additions and 56 deletions
231
extractors/README_ccpl_agenda.md
Normal file
231
extractors/README_ccpl_agenda.md
Normal file
|
|
@ -0,0 +1,231 @@
|
|||
# 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue