edb-noumea 0.1.0__py3-none-any.whl
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/__init__.py +1 -0
- edb_noumea/details.py +86 -0
- edb_noumea/main.py +54 -0
- edb_noumea-0.1.0.dist-info/METADATA +10 -0
- edb_noumea-0.1.0.dist-info/RECORD +7 -0
- edb_noumea-0.1.0.dist-info/WHEEL +5 -0
- edb_noumea-0.1.0.dist-info/top_level.txt +1 -0
edb_noumea/__init__.py
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# This file makes the 'scraper' directory a Python package.
|
edb_noumea/details.py
ADDED
|
@@ -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())
|
edb_noumea/main.py
ADDED
|
@@ -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,7 @@
|
|
|
1
|
+
edb_noumea/__init__.py,sha256=G7WKTGLsr2wtW1E2jYpqq4miZLoSGhTifSE36CGNkLo,60
|
|
2
|
+
edb_noumea/details.py,sha256=BWxteQQRV8v-YbfhR-xTJFT0ZicRi1k6wWnfycmuBlE,3477
|
|
3
|
+
edb_noumea/main.py,sha256=KWT0ZGrHlbhEsQxi_Rw0Mm1syDIxoY-Px1yab94IbJc,2115
|
|
4
|
+
edb_noumea-0.1.0.dist-info/METADATA,sha256=imfXySNTCRsMj6nPN0dF1U8GRCGCTA7aX3Qmm6jxakM,271
|
|
5
|
+
edb_noumea-0.1.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
6
|
+
edb_noumea-0.1.0.dist-info/top_level.txt,sha256=Dj3JusM0b5H9_f9yZeO-IwucCZzI1OHSjLMKtvRjq6k,11
|
|
7
|
+
edb_noumea-0.1.0.dist-info/RECORD,,
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
edb_noumea
|