Auf der Seite bergfex.at stehen normalerweise die besten Wetterdaten für meinen Wohnort. Die gewünschten Informationen haben die folgende Form im HTML-Code:
<div class="tmax">-3°C </div> (Maximaltemperatur)
<div class="tmin">-8°C </div> (Minimaltemperatur)
<div class="rrr rrr0"> </div> (Niederschlag)
Variante 1: Datei auf dem Desktop
Beautiful Soup liest diese Daten aus. Mit ImageDraw kann ich die Daten in eine transparente Bilddatei namens canva.png (990 x 180 Pixel) schreiben. Die veränderte Datei speichere ich unter dem Namen Wetter.png auf dem Desktop ab.
(Damit das optische Erscheinungsbild nicht durch den Dateinamen gestört wird, habe ich die Schriftgröße des Labels mit dem Dateinamen auf 0 px gesetzt. Ich verwende die Gnome-Erweiterung Desktop Icons NG. Die CSS-Datei, wo man das einstellen kann, liegt bei mir im Ordner "/home/fritz/.local/share/gnome-shell/extensions/ding@http://rastersoft.com/app/".)
from PIL import Image, ImageFont, ImageDraw
import requests
from bs4 import BeautifulSoup
import os
from datetime import datetime
dateipfad = '/home/fritz/Schreibtisch/Wetter.png'
# Eine alte Version der Bilddatei entfernen, falls sie existiert
if os.path.exists(dateipfad):
os.remove(dateipfad)
# URL der Webseite
url = 'https://www.bergfex.at/leogang/wetter'
# HTTP GET-Anfrage an die Webseite senden
response = requests.get(url)
ausgabe = ""
# Überprüfen, ob die Anfrage erfolgreich war (Status Code 200)
if response.status_code == 200:
# HTML-Inhalt der Seite extrahieren
html_content = response.content
# BeautifulSoup initialisieren, um die Daten zu analysieren
soup = BeautifulSoup(html_content, 'html.parser')
# Die gewünschten Daten anhand der Klassen extrahieren
tmax_tag = soup.find(class_='tmax')
tmin_tag = soup.find(class_='tmin')
rrr_tag = soup.find(class_='rrr rrr0')
# Überprüfen, ob die Elemente gefunden wurden, bevor auf ihre Inhalte zugegriffen wird
if tmin_tag:
tmin_data = tmin_tag.text.strip()
ausgabe += tmin_data
ausgabe += " "
if tmax_tag:
tmax_data = tmax_tag.text.strip()
ausgabe += tmax_data
ausgabe += " "
if rrr_tag:
rrr_data = rrr_tag.text.strip()
ausgabe += rrr_data
else:
print("Fehler beim Abrufen der Webseite. Status Code:", response.status_code)
#Die Wetterdaten zur Dokumentation mit Datum abspeichern
now = datetime.now()
tag = now.strftime("%d")
monat = now.strftime("%m")
jahr = now.strftime("%Y")
zeit = tag + ". " + monat + ". " + jahr + ": "
eintrag = zeit + " " + ausgabe + "\n"
with open("/home/fritz/wetterdaten.txt", "a") as logfile:
logfile.write(eintrag)
# Das Image-Objekt erstellen
with Image.open("/home/fritz/Skripte/canvas.png") as image:
draw = ImageDraw.Draw(image)
# Schriftgröße
font = ImageFont.truetype('/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 100)
# Den Text zeichnen
draw.text((5, 5), ausgabe, font = font, align ="left")
# Das Bild abspeichern
image.save('/home/fritz/Schreibtisch/Wetter.png')
Alles anzeigen
Variante 2: Die Wetterdaten direkt über den Desktop schreiben
Die Daten werden wieder mit Beautiful Soup gelesen und dann direkt über den Desktop geschrieben, allerdings nur solange das Skript läuft.
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk
import requests
from bs4 import BeautifulSoup
# URL der Webseite
url = 'https://www.bergfex.at/leogang/wetter'
# HTTP GET-Anfrage an die Webseite senden
response = requests.get(url)
ausgabe = ""
# Überprüfen, ob die Anfrage erfolgreich war (Status Code 200)
if response.status_code == 200:
# HTML-Inhalt der Seite extrahieren
html_content = response.content
# BeautifulSoup initialisieren, um die Daten zu analysieren
soup = BeautifulSoup(html_content, 'html.parser')
# Die gewünschten Daten anhand der Klassen extrahieren
tmax_tag = soup.find(class_='tmax')
tmin_tag = soup.find(class_='tmin')
rrr_tag = soup.find(class_='rrr rrr0')
# Überprüfen, ob die Elemente gefunden wurden, bevor auf ihre Inhalte zugegriffen wird
if tmin_tag:
tmin_data = tmin_tag.text.strip()
ausgabe += tmin_data
ausgabe += " "
if tmax_tag:
tmax_data = tmax_tag.text.strip()
ausgabe += tmax_data
ausgabe += " "
if rrr_tag:
rrr_data = rrr_tag.text.strip()
ausgabe += rrr_data
else:
print("Fehler beim Abrufen der Webseite. Status Code:", response.status_code)
def draw_text(window, context):
context.set_source_rgb(1, 1, 1) # Textfarbe Weiß
context.set_font_size(20)
context.move_to(20, 60) # Position des Textes
context.show_text(ausgabe)
def main():
win = Gtk.Window()
win.set_type_hint(Gdk.WindowTypeHint.DESKTOP)
win.set_skip_taskbar_hint(True)
win.set_skip_pager_hint(True)
win.set_app_paintable(True)
win.connect('draw', draw_text)
screen = win.get_screen()
visual = screen.get_rgba_visual()
if visual and screen.is_composited():
win.set_visual(visual)
win.show_all()
Gtk.main()
if __name__ == "__main__":
main()
Alles anzeigen