voici la version définitive (enfin je pense) du script python
le tableau des huit heures est récupéré de manière plus résistante au changement de site
la taille utilisé en mémoire est contenu (~21Mo)
ajout des fenêtres de notification avec option pour les désactivés (notify=oui (defaut) ou non)
temps de mise a jour partielle défini par l'utilisateur, et mise a jour complète toutes les heures, sa évitera de se faire black listé par accuweather
#! /usr/bin/python3
# -*- coding: utf-8 -*-
# Par Didier-T Forum Ubuntu.fr
from urllib.request import Request, urlopen
from os import path, system
from time import time, sleep
from re import search, compile, findall
from sys import argv
from gc import collect
from bs4 import BeautifulSoup
Version=1.0
homedir = path.expanduser('~')
#### initialisation des variables
adressWeb="http://www.accuweather.com/fr/fr/argenteuil/133593/current-weather/133593"
repsauv= "~/essais"
huitHeures="oui"
nbJour=1
interval=30
notifi="oui"
for a in argv:
if search("adressWeb=", a) is not None:
adressWeb=compile("adressWeb=(.*)").search(a).group(1)
if search("repsauv=", a) is not None:
repsauv=compile("repsauv=(.*)").search(a).group(1)
if search("huitHeures=", a) is not None:
huitHeures=compile("huitHeures=(.*)").search(a).group(1)
if search("nbJour=", a) is not None:
nbJour=compile("nbJour=(.*)").search(a).group(1)
if search("interval=", a) is not None:
interval=compile("interval=(.*)").search(a).group(1)
if search("notify=", a) is not None:
notifi=compile("notify=(.*)").search(a).group(1)
nbJour=int(nbJour)
interval=int(interval)
repsauv=repsauv.replace("~", homedir)
notifi=str.lower(notifi)
huitHeures=str.lower(huitHeures)
#### fin initialisation des variables
#### Fonction de traitement des fichiers
def traitement(adress, fichier):
url=Request(adress)
currentCond=urlopen(url)
soup = BeautifulSoup(currentCond)
currentCond.close()
# fiche = open(fichier, "w")
#pour debug
# fiche.write(soup.prettify())
#si autres que huit heures
table=soup.find_all('table')
if search("huitHeures", fichier) is None:
# recherche vent
current_balise=soup.find(id="details")
ventd=compile("var d = '(.*)';").search(str(current_balise)).group(1).replace("W", "O")
ventf=compile("var s = '(.*)';").search(str(current_balise)).group(1)
information="direction: "+ventd+"\n"
information=information+"vitesse: "+ventf+"\n"
#info dans l'image
inf=current_balise.select("[class~=info]")
icone=current_balise.select("[class~=icon]")
i=0
#recherche icone
for ic in icone:
i=i+1
information=information+"icone"+str(i)+": "+str(ic).replace('<div class="icon i-', '').replace('"></div>', '')+"\n"
i=0
#récupération date + historique
if search("Jour", fichier) is not None or search("CC", fichier) is not None:
histo=soup.find(id="feature-history")
#récupération date
date=histo.select("[class~=lt]")
for d in date:
jour=compile("^.* - (.*)/(.*)/(.*)").search(d.get_text())
information=information+"jour: "+jour.group(1)+"\n"
information=information+"mois: "+jour.group(2)+"\n"
information=information+"année: "+jour.group(3)+"\n"
#récupération historique
hi=histo.select("[class~=hi]")
for v in hi:
hivalue=v.get_text().split("\n")
information=information+"maxjour: "+hivalue[2]+"\n"
information=information+"maxnormal: "+hivalue[3]+"\n"
information=information+"maxrecord: "+hivalue[4]+"\n"
information=information+"max1ans: "+hivalue[5]+"\n"
lo=histo.select("[class~=last]")
for v in lo:
lovalue=v.get_text().split("\n")
information=information+"minjour: "+lovalue[2]+"\n"
information=information+"minnormal: "+lovalue[3]+"\n"
information=information+"minrecord: "+lovalue[4]+"\n"
information=information+"min1ans: "+lovalue[5]+"\n"
#info dans l'image
if search("Jour", fichier) is not None:
infs=inf[0].get_text().split("\n")
information=information+"Tempjour: "+findall('-?\d+', infs[0])[0]+"\n"
information=information+"RealFeeljour: "+findall('-?\d+', infs[1])[0]+"\n"
information=information+"Précipitationsjour: "+findall('-?\d+', infs[2])[0]+"\n"
infs=inf[1].get_text().split("\n")
information=information+"Tempnuit: "+findall('-?\d+', infs[0])[0]+"\n"
information=information+"RealFeelnuit: "+findall('-?\d+', infs[1])[0]+"\n"
information=information+"Précipitationsnuit: "+findall('-?\d+', infs[2])[0]+"\n"
p=current_balise.find_all('p')
i=0
x=0
for pv in p:
i=i+1
if i==5 or i==10:
x=x+1
information=information+"cond"+str(x)+": "+pv.get_text()+"\n"
#localisation si condition courante
if search("CC", fichier) is not None:
ville=soup.select("[class~=current-city]")[0].get_text().split(",")[0]
longi=compile("lon: '(.*)',").search(str(soup)).group(1)
lat=compile("lat: '(.*)',").search(str(soup)).group(1)
information=information+"ville: "+ville+"\n"
information=information+"lat: "+lat+"\n"
information=information+"long: "+longi+"\n"
#info dans l'image
inf=inf[0].get_text()
cond=inf[:inf.find(findall('\d+', inf)[0])]
inf=inf.replace(cond, "")
infs=inf.split(" ")
information=information+"cond:"+cond+"\n"
information=information+"Temp: "+infs[0]+"\n"
information=information+"RealFeel: "+infs[2]+"\n"
if search("Matin", fichier) is not None or search("AM", fichier) is not None or search("Soiree", fichier) is not None or search("Nuit", fichier) is not None:
infs=inf[0].get_text().split("\n")
information=information+"cond:"+infs[0]+"\n"
information=information+"max: "+infs[1]+"\n"
information=information+"min: "+infs[2].replace("Mn ", "")+"\n"
information=information+"RealFeelmax: "+findall('-?\d+', infs[5])[0]+"\n"
information=information+"RealFeelmin: "+findall('-?\d+', infs[5])[1]+"\n"
#info conditions générales
cc=current_balise.find_all('li')
i=0
for inf in cc:
inf=inf.get_text().replace(" ", "").replace("\n", "")
if search(":", inf) is not None:
i=i+1
if i <= 7:
inf=inf.replace(":", " jour:")
else:
inf=inf.replace(":", " nuit:")
information=information+inf+"\n"
else:
cc=current_balise.find_all('li')
for inf in cc:
inf=inf.get_text().replace(" ", "").replace("\n", "")
if search(":", inf) is not None:
information=information+inf+"\n"
else:
#recherche icones huit heures
rows = table[0].findAll('tr')
information=""
x=0
for tr in rows:
cols = tr.findAll('td')
texte_tr=tr.text.split("\n")[1].replace("\n", "")
i=0
for td in cols:
i=i+1
texte_bu = td.text.replace("\n", "")
# texte_bu = texte_bu.encode('utf-8')
if texte_bu != "" :
if texte_tr == " " and x < len(cols):
information=information+"Heure"+str(i)+": "+texte_bu+"\n"
x=x+1
elif texte_tr != " ":
information=information+texte_tr+str(i)+": "+texte_bu+"\n"
icone=table[0].find_all('div')
i=0
for ic in icone:
i=i+1
ico="icone"+str(i)+": "+str(ic).replace('<div class="icon i-', '')
fin=compile('">(.*)div>').search(ico).group(1)
information=information+ico.replace('">'+fin+'div>', '')+"\n"
if i == 8:
break
fiche = open(fichier, "w")
fiche.write(information)
fiche.close()
collect()
#### fin Fonction de traitement des fichiers
#### Mise en tache de fond
def demonise(ent, id1, id2, huitHeures, nbJour, interval):
start=time()-(60*60)
misajour=1
while 1 :
heure=time()
traitement(ent+nb1+'/current-weather/'+nb2, repsauv+"/CC")
if time()-start >= 60*60:
if huitHeures=="oui":
traitement(ent+nb1+'/hourly-weather-forecast/'+nb2, repsauv+"/huitHeures")
x=0
while x<nbJour:
x=x+1
traitement(ent+nb1+'/daily-weather-forecast/'+nb2+"?day="+str(x), repsauv+"/Jour"+str(x))
traitement(ent+nb1+'/morning-weather-forecast/'+nb2+"?day="+str(x), repsauv+"/Matin"+str(x))
traitement(ent+nb1+'/afternoon-weather-forecast/'+nb2+"?day="+str(x), repsauv+"/AM"+str(x))
traitement(ent+nb1+'/evening-weather-forecast/'+nb2+"?day="+str(x), repsauv+"/Soiree"+str(x))
traitement(ent+nb1+'/overnight-weather-forecast/'+nb2+"?day="+str(x), repsauv+"/Nuit"+str(x))
fin=time()
if notifi == "oui":
if time()-start >= 60*60:
system('notify-send "Météo mise à jour complète"')
else:
system('notify-send "Météo mise à jour Conditions courantes"')
start=heure
pause=60*interval-int(fin-start)
print("temps de mise a jour",fin-start)
collect()
sleep(pause)
#### Lancement du script et initialisation de la tache de fond
nb1=findall('\d+', adressWeb)[0]
nb2=findall('\d+', adressWeb)[1]
ent=adressWeb[:adressWeb.find(nb1)]
fin=adressWeb.replace(ent+nb1, "")
fin=fin.replace(fin[:fin.find(nb2)]+nb2, "")
nb2=nb2+fin
print("Version =",Version)
demonise(ent, nb1, nb2, huitHeures, nbJour, interval)