Script per la generazione di un file JSON contenente il livello di allerta estratto dai bollettini meteo PDF pubblicati giornalmente dalla Protezione Civile della Regione Sicilia
# Script per la generazione di un file JSON contenente il livello di allerta | |
# estratto dai bollettini meteo PDF pubblicati giornalmente dalla Protezione Civile della Regione Sicilia | |
# http://www.regione.sicilia.it/presidenza/protezionecivile/pp/archivio_idro.asp | |
# Giovanni Pirrotta - giovanni.pirrotta@gmail.com | |
# 2017 | |
import os | |
import requests | |
import datetime | |
from bs4 import BeautifulSoup | |
import collections | |
import json | |
import re | |
from PIL import Image | |
# Restituisce il vettore contenente le componenti di colore (rgb) del pixel passato in input | |
def get_pixel(image, i, j): | |
width, height = image.size | |
if i > width or j > height: | |
return None | |
pixel = image.getpixel((i, j)) | |
return pixel | |
# Restituisce il livello di rischio relativo al colore passato in in put | |
def get_allerta(r,g,b): | |
if r == 0 and g == 255 and b == 0: | |
return 'ALLERTA VERDE - GENERICA VIGILANZA' | |
elif r == 255 and g == 255 and b == 0: | |
return 'ALLERTA GIALLA - ATTENZIONE' | |
elif r == 255 and g == 204 and b == 0: | |
return 'ALLERTA ARANCIONE - PREALLARME' | |
elif r == 255 and g ==0 and b==0: | |
return 'ALLERTA ROSSA - ALLARME' | |
else: | |
return '' | |
url = 'http://www.regione.sicilia.it/presidenza/protezionecivile/pp/archivio_idro.asp' | |
WEB_ROOT_URL = 'http://www.regione.sicilia.it/presidenza/protezionecivile/' | |
# Mi collego all'URL dell'archivio dei bollettini meteo e individuo il link dell'ultimo PDF pubblicato | |
r = requests.get(url) | |
html = r.text | |
soup = BeautifulSoup(html, 'lxml') | |
pattern = 'Avviso rischio idrogeologico per il (.*)' | |
first_row = soup.find('td',{'class':'testo_tabelle_cent'}) | |
text = first_row.text | |
m = re.match(pattern,text) | |
if m: | |
primo_giorno_text = (m.group(1)) | |
primo_giorno = datetime.datetime.strptime(primo_giorno_text, '%d/%m/%Y') | |
secondo_giorno = primo_giorno + datetime.timedelta(days=+1) | |
secondo_giorno_text = secondo_giorno.strftime("%d/%m/%Y") | |
if first_row.a: | |
link = first_row.a.get('href') | |
if link: | |
href = link[3:] | |
full_url = WEB_ROOT_URL + href | |
file_pdf = 'protezione-civile.pdf' | |
file_png = 'protezione-civile.png' | |
# Download del file PDF | |
wget_cmd = 'wget -O ' + file_pdf + ' "' +full_url + '"' | |
os.system(wget_cmd) | |
# Conversione della prima pagina PDF in formato PNG | |
cmd = 'convert '+ file_pdf + '[0] ' + file_png | |
os.system(cmd) | |
# Dizionario delle zone inizializzato con le posizioni dei pixel da analizzare. | |
pixel_sicilia_zone_primo_giorno = {} | |
pixel_sicilia_zone_primo_giorno['A'] = [262,174] | |
pixel_sicilia_zone_primo_giorno['B'] = [182, 188] | |
pixel_sicilia_zone_primo_giorno['C'] = [105, 186] | |
pixel_sicilia_zone_primo_giorno['D'] = [106, 208] | |
pixel_sicilia_zone_primo_giorno['E'] = [170, 230] | |
pixel_sicilia_zone_primo_giorno['F'] = [219, 269] | |
pixel_sicilia_zone_primo_giorno['G'] = [248, 266] | |
pixel_sicilia_zone_primo_giorno['H'] = [222, 216] | |
pixel_sicilia_zone_primo_giorno['I'] = [246, 202] | |
pixel_sicilia_zone_secondo_giorno = {} | |
pixel_sicilia_zone_secondo_giorno['A'] = [520,174] | |
pixel_sicilia_zone_secondo_giorno['B'] = [438, 188] | |
pixel_sicilia_zone_secondo_giorno['C'] = [364, 186] | |
pixel_sicilia_zone_secondo_giorno['D'] = [364, 209] | |
pixel_sicilia_zone_secondo_giorno['E'] = [431, 230] | |
pixel_sicilia_zone_secondo_giorno['F'] = [477, 268] | |
pixel_sicilia_zone_secondo_giorno['G'] = [506, 265] | |
pixel_sicilia_zone_secondo_giorno['H'] = [480, 216] | |
pixel_sicilia_zone_secondo_giorno['I'] = [504, 202] | |
# Setup struttura per la generazione del file JSON | |
previsioni = {} | |
previsioni['fonte'] = 'Regione Siciliana - Dipartimento della Protezione Civile' | |
previsioni['allerta_meteo'] = {} | |
previsioni['allerta_meteo']['date'] = [] | |
previsioni['allerta_meteo']['url'] = full_url.replace(' ', '%20') | |
prev = collections.OrderedDict() | |
prev[primo_giorno_text] = collections.OrderedDict() | |
prev[secondo_giorno_text] = collections.OrderedDict() | |
picture = Image.open(file_png) | |
for zona in ['A','B','C','D','E','F','G','H','I']: | |
rgb = get_pixel(picture, pixel_sicilia_zone_primo_giorno[zona][0], pixel_sicilia_zone_primo_giorno[zona][1]) | |
allerta = get_allerta(rgb[0], rgb[1], rgb[2]) | |
prev[primo_giorno_text]['ZONA ' + zona]= allerta | |
for zona in ['A','B','C','D','E','F','G','H','I']: | |
rgb = get_pixel(picture, pixel_sicilia_zone_secondo_giorno[zona][0], pixel_sicilia_zone_secondo_giorno[zona][1]) | |
allerta = get_allerta(rgb[0], rgb[1], rgb[2]) | |
prev[secondo_giorno_text]['ZONA ' + zona]= allerta | |
previsioni['allerta_meteo']['date'] = prev | |
# Creazione del file JSON e salvataggio in un file | |
with open('allerta.json', 'w') as f: | |
json.dump(previsioni, f, ensure_ascii=False) | |
# Pubblicazione su un server Web pubblico | |
move_cmd = 'mv allerta.json ../../gpirrotta.tk/regione-siciliana/protezione-civile/allerta.json' | |
os.system(move_cmd) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment