edb-noumea 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- edb_noumea-0.1.0/PKG-INFO +10 -0
- edb_noumea-0.1.0/README.md +184 -0
- edb_noumea-0.1.0/edb_noumea/__init__.py +1 -0
- edb_noumea-0.1.0/edb_noumea/details.py +86 -0
- edb_noumea-0.1.0/edb_noumea/main.py +54 -0
- edb_noumea-0.1.0/edb_noumea.egg-info/PKG-INFO +10 -0
- edb_noumea-0.1.0/edb_noumea.egg-info/SOURCES.txt +10 -0
- edb_noumea-0.1.0/edb_noumea.egg-info/dependency_links.txt +1 -0
- edb_noumea-0.1.0/edb_noumea.egg-info/requires.txt +6 -0
- edb_noumea-0.1.0/edb_noumea.egg-info/top_level.txt +2 -0
- edb_noumea-0.1.0/pyproject.toml +15 -0
- edb_noumea-0.1.0/setup.cfg +4 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: edb-noumea
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Un scraper pour la qualité des eaux de baignade à Nouméa.
|
|
5
|
+
Requires-Dist: requests
|
|
6
|
+
Requires-Dist: beautifulsoup4
|
|
7
|
+
Requires-Dist: pandas
|
|
8
|
+
Requires-Dist: lxml
|
|
9
|
+
Requires-Dist: tabula-py
|
|
10
|
+
Requires-Dist: matplotlib
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
<<<<<<< HEAD
|
|
2
|
+
# edb-noumea
|
|
3
|
+
SDK Python pour connaître la Qualité des Eaux de Baignade à Nouméa
|
|
4
|
+
=======
|
|
5
|
+
# Qualité des Eaux de Baignade à Nouméa
|
|
6
|
+
|
|
7
|
+
Ce projet Python fournit un outil simple pour scraper les données sur la qualité des eaux de baignade à Nouméa depuis le site officiel de la ville (`noumea.nc`). Il extrait les informations et les présente sous forme de tableau dans le terminal.
|
|
8
|
+
|
|
9
|
+
Il se base sur les données de https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade
|
|
10
|
+
|
|
11
|
+
## Prérequis
|
|
12
|
+
|
|
13
|
+
Avant de commencer, assurez-vous d'avoir installé `uv`, le gestionnaire de paquets et d'environnements virtuels Python.
|
|
14
|
+
|
|
15
|
+
- [Instructions d'installation de uv](https://github.com/astral-sh/uv)
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
Suivez ces étapes pour configurer l'environnement et installer les dépendances.
|
|
20
|
+
|
|
21
|
+
1. **Accédez au répertoire du projet :**
|
|
22
|
+
```bash
|
|
23
|
+
cd edb-noumea
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
2. **Créez un environnement virtuel avec `uv` :**
|
|
27
|
+
```bash
|
|
28
|
+
uv venv
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
3. **Activez l'environnement virtuel :**
|
|
32
|
+
```bash
|
|
33
|
+
source .venv/bin/activate
|
|
34
|
+
```
|
|
35
|
+
*(Sur Windows, utilisez `.venv\Scripts\activate`)*
|
|
36
|
+
|
|
37
|
+
4. **Installez les dépendances du projet :**
|
|
38
|
+
```bash
|
|
39
|
+
uv pip install -e .
|
|
40
|
+
```
|
|
41
|
+
*(L'option `-e .` installe le projet en mode "éditable", ce qui vous permet de modifier le code sans avoir à le réinstaller.)*
|
|
42
|
+
|
|
43
|
+
## Utilisation
|
|
44
|
+
|
|
45
|
+
Ce package peut être utilisé de deux manières : soit pour obtenir un résumé de l'état des plages, soit pour obtenir les résultats détaillés des derniers prélèvements.
|
|
46
|
+
|
|
47
|
+
### Obtenir le résumé de l'état sanitaire
|
|
48
|
+
|
|
49
|
+
Pour obtenir le tableau de résumé simple depuis la page web principale, exécutez :
|
|
50
|
+
```bash
|
|
51
|
+
python -m edb_noumea.main
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Obtenir les résultats détaillés (depuis PDF)
|
|
55
|
+
|
|
56
|
+
Pour obtenir le tableau détaillé des derniers relevés (extrait automatiquement du dernier fichier PDF disponible), exécutez :
|
|
57
|
+
```bash
|
|
58
|
+
python -m edb_noumea.details
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
## Générer des graphiques PNG des analyses détaillées
|
|
63
|
+
|
|
64
|
+
Vous pouvez générer automatiquement deux graphiques au format PNG (niveaux d'E. coli et d'Entérocoques par point de prélèvement) à partir des derniers résultats d'analyses, grâce au script fourni.
|
|
65
|
+
|
|
66
|
+
### Étapes
|
|
67
|
+
|
|
68
|
+
1. Assurez-vous que l'environnement virtuel est activé et que les dépendances sont installées.
|
|
69
|
+
2. Exécutez le script suivant depuis le répertoire du projet :
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
source .venv/bin/activate
|
|
73
|
+
/home/adriens/Github/edb-noumea/noumea_water_quality/.venv/bin/python generer_graphique_analyses.py
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Deux fichiers PNG seront générés dans le dossier courant :
|
|
77
|
+
|
|
78
|
+
- `ecoli_levels.png` : graphique des niveaux d'E. coli par point de prélèvement
|
|
79
|
+
- `entero_levels.png` : graphique des niveaux d'Entérocoques par point de prélèvement
|
|
80
|
+
|
|
81
|
+
Vous pouvez ouvrir ces fichiers pour visualiser les résultats détaillés des analyses.
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
## Utilisation en tant que Bibliothèque
|
|
85
|
+
|
|
86
|
+
Vous pouvez également importer les fonctions dans vos propres scripts Python pour une intégration plus poussée.
|
|
87
|
+
|
|
88
|
+
### Obtenir le résumé
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
# exemple_resume.py
|
|
92
|
+
from edb_noumea.main import get_water_quality
|
|
93
|
+
|
|
94
|
+
df_resume = get_water_quality()
|
|
95
|
+
|
|
96
|
+
if df_resume is not None:
|
|
97
|
+
print("Résumé de l'état des plages :")
|
|
98
|
+
print(df_resume.to_string())
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Obtenir les résultats détaillés
|
|
102
|
+
|
|
103
|
+
```python
|
|
104
|
+
# exemple_details.py
|
|
105
|
+
from edb_noumea.details import get_detailed_results
|
|
106
|
+
|
|
107
|
+
df_details = get_detailed_results()
|
|
108
|
+
|
|
109
|
+
if df_details is not None:
|
|
110
|
+
print("Détails des derniers relevés :")
|
|
111
|
+
print(df_details.to_string())
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### Exemple de Visualisation
|
|
115
|
+
|
|
116
|
+
Voici un exemple montrant comment récupérer les données détaillées et créer un graphique simple avec `matplotlib` pour visualiser les niveaux d'E. coli par point de prélèvement.
|
|
117
|
+
|
|
118
|
+
```python
|
|
119
|
+
# exemple_visualisation.py
|
|
120
|
+
import pandas as pd
|
|
121
|
+
import matplotlib.pyplot as plt
|
|
122
|
+
from edb_noumea.details import get_detailed_results
|
|
123
|
+
|
|
124
|
+
# Obtenir les données détaillées
|
|
125
|
+
df = get_detailed_results()
|
|
126
|
+
|
|
127
|
+
if df is not None and not df.empty:
|
|
128
|
+
print("Création du graphique...")
|
|
129
|
+
|
|
130
|
+
# S'assurer que les données sont triées pour une meilleure lisibilité
|
|
131
|
+
df_sorted = df.sort_values(by='e_coli_npp_100ml', ascending=False)
|
|
132
|
+
|
|
133
|
+
# Créer le graphique à barres horizontales
|
|
134
|
+
plt.figure(figsize=(12, 8))
|
|
135
|
+
plt.barh(df_sorted['point_de_prelevement'], df_sorted['e_coli_npp_100ml'], color='skyblue')
|
|
136
|
+
|
|
137
|
+
# Ajouter les titres et les étiquettes
|
|
138
|
+
plt.xlabel('E. coli (NPP/100ml)')
|
|
139
|
+
plt.ylabel('Point de prélèvement')
|
|
140
|
+
plt.title("Niveaux d'E. coli par Point de Prélèvement")
|
|
141
|
+
plt.gca().invert_yaxis() # Afficher le plus élevé en haut
|
|
142
|
+
plt.tight_layout() # Ajuster le layout pour que tout soit visible
|
|
143
|
+
|
|
144
|
+
# Sauvegarder le graphique dans un fichier
|
|
145
|
+
plt.savefig('ecoli_levels.png')
|
|
146
|
+
print("Graphique sauvegardé sous 'ecoli_levels.png'")
|
|
147
|
+
|
|
148
|
+
# Afficher le graphique
|
|
149
|
+
plt.show()
|
|
150
|
+
else:
|
|
151
|
+
print("Aucune donnée à afficher.")
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
*Assurez-vous que votre script est exécuté dans le même environnement virtuel où le package `edb-noumea` a été installé.*
|
|
156
|
+
|
|
157
|
+
## Sortie Attendue
|
|
158
|
+
|
|
159
|
+
### Résumé de l'état sanitaire (`main`)
|
|
160
|
+
```
|
|
161
|
+
📊 État sanitaire des eaux de baignade à Nouméa 📊
|
|
162
|
+
Plage État sanitaire
|
|
163
|
+
0 Plage de la baie des Citrons Baignade autorisée
|
|
164
|
+
1 Plage de la promenade Pierre-Vernier Baignade autorisée
|
|
165
|
+
...
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Détails des relevés (`details`)
|
|
169
|
+
```
|
|
170
|
+
📋 Voici les détails des derniers relevés :
|
|
171
|
+
Site Point de prélèvement Date Heure E. coli (NPP/100ml) Entérocoques (NPP/100ml)
|
|
172
|
+
0 PLAGE DE LA BAIE DES CITRONS P18049, Face The Beach House 04/09/2025 07:29 10 20
|
|
173
|
+
1 PLAGE DE LA BAIE DES CITRONS P18050, Face allée centrale Mirage plaza 04/09/2025 07:33 62 75
|
|
174
|
+
...
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Dépendances
|
|
178
|
+
|
|
179
|
+
- `requests`: Pour effectuer les requêtes HTTP.
|
|
180
|
+
- `beautifulsoup4`: Pour l'analyse du code HTML.
|
|
181
|
+
- `pandas`: Pour la création et la manipulation des DataFrames.
|
|
182
|
+
- `lxml`: Utilisé comme parseur par BeautifulSoup pour de meilleures performances.
|
|
183
|
+
- `tabula-py`: Pour l'extraction de tableaux depuis des fichiers PDF. **Note :** `tabula-py` requiert que [Java](https://www.java.com/) soit installé sur votre système.
|
|
184
|
+
>>>>>>> cfd27fd (Initial commit du projet edb-noumea)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# This file makes the 'scraper' directory a Python package.
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import pandas as pd
|
|
2
|
+
import tabula
|
|
3
|
+
import requests
|
|
4
|
+
import io
|
|
5
|
+
|
|
6
|
+
# URL du fichier PDF contenant les résultats détaillés
|
|
7
|
+
PDF_URL = "https://www.noumea.nc/sites/default/files/noumea-pratique-salubrite-publique-resultats/2025/250905-resultats-surveillance-ebm.pdf"
|
|
8
|
+
|
|
9
|
+
def get_detailed_results():
|
|
10
|
+
"""
|
|
11
|
+
Télécharge le PDF des résultats détaillés, en extrait le premier tableau
|
|
12
|
+
et le retourne sous forme de DataFrame pandas.
|
|
13
|
+
"""
|
|
14
|
+
print(f"📥 Téléchargement du PDF depuis {PDF_URL}...")
|
|
15
|
+
try:
|
|
16
|
+
# Effectuer la requête HTTP pour obtenir le contenu du PDF
|
|
17
|
+
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
|
|
18
|
+
response = requests.get(PDF_URL, headers=headers)
|
|
19
|
+
response.raise_for_status()
|
|
20
|
+
print("✅ Téléchargement terminé.")
|
|
21
|
+
except requests.exceptions.RequestException as e:
|
|
22
|
+
print(f"❌ Erreur lors du téléchargement du fichier PDF : {e}")
|
|
23
|
+
return None
|
|
24
|
+
|
|
25
|
+
# Utiliser un buffer en mémoire pour éviter de sauvegarder le fichier sur le disque
|
|
26
|
+
pdf_file = io.BytesIO(response.content)
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
print("🔍 Extraction des tableaux du PDF...")
|
|
30
|
+
# Extraire tous les tableaux de la première page du PDF
|
|
31
|
+
# L'option pages='1' est importante pour ne pas scanner tout le document
|
|
32
|
+
tables = tabula.read_pdf(pdf_file, pages='1', stream=True)
|
|
33
|
+
except Exception as e:
|
|
34
|
+
print(f"❌ Une erreur est survenue lors de l'extraction des données du PDF.")
|
|
35
|
+
print("ℹ️ Cela peut être dû à l'absence de Java sur votre système, qui est requis par la bibliothèque 'tabula-py'.")
|
|
36
|
+
print(f" Erreur originale : {e}")
|
|
37
|
+
return None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
if not tables:
|
|
41
|
+
print("❌ Aucun tableau n'a été trouvé dans le PDF.")
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
print(f"✅ {len(tables)} tableau(x) trouvé(s). Affichage du premier.")
|
|
45
|
+
|
|
46
|
+
# Le premier tableau est notre cible
|
|
47
|
+
df = tables[0]
|
|
48
|
+
|
|
49
|
+
# --- Nettoyage du DataFrame ---
|
|
50
|
+
|
|
51
|
+
# 1. Définir les noms de colonnes attendus en snake_case.
|
|
52
|
+
columns_to_keep = {
|
|
53
|
+
df.columns[0]: "site",
|
|
54
|
+
df.columns[1]: "point_de_prelevement",
|
|
55
|
+
df.columns[2]: "date",
|
|
56
|
+
df.columns[4]: "heure",
|
|
57
|
+
df.columns[6]: "e_coli_npp_100ml",
|
|
58
|
+
df.columns[9]: "enterocoques_npp_100ml"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# 2. Sélectionner uniquement ces colonnes et en faire une copie
|
|
62
|
+
cleaned_df = df[columns_to_keep.keys()].copy()
|
|
63
|
+
|
|
64
|
+
# 3. Renommer les colonnes
|
|
65
|
+
cleaned_df.rename(columns=columns_to_keep, inplace=True)
|
|
66
|
+
|
|
67
|
+
# 4. Remplacer les valeurs non numériques et convertir en type numérique
|
|
68
|
+
cleaned_df.replace({'<10': 0}, inplace=True)
|
|
69
|
+
|
|
70
|
+
# Convertir les colonnes en numérique, les erreurs deviendront NaN (non-numérique)
|
|
71
|
+
cleaned_df['e_coli_npp_100ml'] = pd.to_numeric(cleaned_df['e_coli_npp_100ml'], errors='coerce')
|
|
72
|
+
cleaned_df['enterocoques_npp_100ml'] = pd.to_numeric(cleaned_df['enterocoques_npp_100ml'], errors='coerce')
|
|
73
|
+
|
|
74
|
+
# Remplir les éventuelles valeurs NaN qui auraient pu être créées
|
|
75
|
+
cleaned_df.fillna(0, inplace=True)
|
|
76
|
+
|
|
77
|
+
return cleaned_df
|
|
78
|
+
|
|
79
|
+
if __name__ == "__main__":
|
|
80
|
+
# Obtenir le DataFrame des résultats détaillés
|
|
81
|
+
detailed_df = get_detailed_results()
|
|
82
|
+
|
|
83
|
+
# Afficher le DataFrame s'il a été créé avec succès
|
|
84
|
+
if detailed_df is not None:
|
|
85
|
+
print("\n📋 Voici les détails des derniers relevés :")
|
|
86
|
+
print(detailed_df.to_string())
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import requests
|
|
2
|
+
import pandas as pd
|
|
3
|
+
|
|
4
|
+
# URL de la page à scraper
|
|
5
|
+
URL = "https://www.noumea.nc/noumea-pratique/salubrite-publique/qualite-eaux-baignade"
|
|
6
|
+
|
|
7
|
+
def get_water_quality():
|
|
8
|
+
"""
|
|
9
|
+
Récupère les données sur la qualité de l'eau de baignade depuis le site de la ville de Nouméa
|
|
10
|
+
et les retourne dans un DataFrame pandas en lisant directement les tables HTML.
|
|
11
|
+
"""
|
|
12
|
+
try:
|
|
13
|
+
# Effectuer la requête HTTP pour obtenir le contenu de la page
|
|
14
|
+
# Ajouter un header User-Agent pour simuler un navigateur
|
|
15
|
+
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
|
|
16
|
+
response = requests.get(URL, headers=headers)
|
|
17
|
+
# Lancer une exception si la requête a échoué
|
|
18
|
+
response.raise_for_status()
|
|
19
|
+
except requests.exceptions.RequestException as e:
|
|
20
|
+
print(f"Erreur lors de la requête HTTP : {e}")
|
|
21
|
+
return None
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
# pandas.read_html retourne une liste de tous les DataFrames trouvés dans le HTML
|
|
25
|
+
tables = pd.read_html(response.content, flavor='lxml')
|
|
26
|
+
except ValueError:
|
|
27
|
+
print("Aucune table n'a été trouvée sur la page.")
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
if not tables:
|
|
31
|
+
print("Aucune table n'a été trouvée sur la page.")
|
|
32
|
+
return None
|
|
33
|
+
|
|
34
|
+
# En supposant que le tableau que nous voulons est le premier trouvé
|
|
35
|
+
df = tables[0]
|
|
36
|
+
|
|
37
|
+
# Renommer les colonnes pour qu'elles soient plus claires
|
|
38
|
+
# Nous nous attendons à deux colonnes : Plage et État
|
|
39
|
+
if df.shape[1] == 2:
|
|
40
|
+
df.columns = ["plage", "etat_sanitaire"]
|
|
41
|
+
else:
|
|
42
|
+
print(f"La table trouvée n'a pas le format attendu (2 colonnes). Colonnes trouvées : {df.shape[1]}")
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
return df
|
|
46
|
+
|
|
47
|
+
if __name__ == "__main__":
|
|
48
|
+
# Appeler la fonction pour obtenir le DataFrame
|
|
49
|
+
water_quality_df = get_water_quality()
|
|
50
|
+
|
|
51
|
+
# Afficher le DataFrame s'il a été créé avec succès
|
|
52
|
+
if water_quality_df is not None:
|
|
53
|
+
print("📊 État sanitaire des eaux de baignade à Nouméa 📊")
|
|
54
|
+
print(water_quality_df.to_string())
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: edb-noumea
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Un scraper pour la qualité des eaux de baignade à Nouméa.
|
|
5
|
+
Requires-Dist: requests
|
|
6
|
+
Requires-Dist: beautifulsoup4
|
|
7
|
+
Requires-Dist: pandas
|
|
8
|
+
Requires-Dist: lxml
|
|
9
|
+
Requires-Dist: tabula-py
|
|
10
|
+
Requires-Dist: matplotlib
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
README.md
|
|
2
|
+
pyproject.toml
|
|
3
|
+
edb_noumea/__init__.py
|
|
4
|
+
edb_noumea/details.py
|
|
5
|
+
edb_noumea/main.py
|
|
6
|
+
edb_noumea.egg-info/PKG-INFO
|
|
7
|
+
edb_noumea.egg-info/SOURCES.txt
|
|
8
|
+
edb_noumea.egg-info/dependency_links.txt
|
|
9
|
+
edb_noumea.egg-info/requires.txt
|
|
10
|
+
edb_noumea.egg-info/top_level.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "edb-noumea"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Un scraper pour la qualité des eaux de baignade à Nouméa."
|
|
5
|
+
dependencies = [
|
|
6
|
+
"requests",
|
|
7
|
+
"beautifulsoup4",
|
|
8
|
+
"pandas",
|
|
9
|
+
"lxml",
|
|
10
|
+
"tabula-py",
|
|
11
|
+
"matplotlib",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
[tool.setuptools.packages.find]
|
|
15
|
+
where = ["."]
|