Mit Python Wetterdaten an Google Sheets schicken

Du lernst Python kennen und suchst nach einem ersten kleinen Projekt? Dann könnte dieser Artikel, in dem ich erkläre, wie du mit Python von einer API Wetterdaten abfragst und dann an Google Sheets schickst, genau das Richtige für dich sein.

Das Script, das ich hier mit euch teilen möchte, beinhaltet einige der ersten Mechaniken, die ich mit Python je gebaut habe. Ich weiß noch wie stolz ich war, als ich tatsächlich Wetterdaten vorliegen hatte :-).

Ihr könnt ein Script wie dieses als Basis benutzen, um verschiedenste Ideen umzusetzen. Ihr könntet eine Übersicht bauen, wie das Wetter in eurem Wohnort sich über die letzten Monate verteilt hat, wie häufig es regnete, wie das Wetter an eurem Wohnort sich von dem Wetter bei Freunden oder Bekannten unterscheidet. Und noch einiges mehr.

Hinweis: Ich bin noch nicht lange mit Python unterwegs und auch kein Entwickler. Es kann daher sein, dass der hier beschriebene Weg nicht unbedingt der sinnvollste oder eleganteste ist. Aber: Er funktioniert 🙂

Die grundlegende Bauweise des Wetterdaten-Scripts erklärt

Einmal zum grundlegenden: Welche Elemente nutzt das Wetterdaten-Script?

Als Grundlage für alles sind Daten notwendig. Diese erhält das Python-Script von einer Wetter-API, genauer gesagt Weatherapi.com. Der Einfachheit halber habe ich dabei keine direkte Verbindung zu der API erstellt, sondern nutze den Anbieter Rapid API. Doch dazu später mehr.

Damit das Script nicht nur einmal läuft, sondern z.B. täglich, benutze ich einen Dienst, der das automatisierte Ausführen von Scripts erlaubt, nämlich Wayscript (ich plane dazu in Zukunft noch etwas mehr über den Anbieter zu schreiben).

Als Ort, wo die Daten gespeichert werden, brauchen wir einen permanent erreichbaren und idealerweise auch leicht bedienbare Dienst. Das wird Google Sheets sein.

Alle drei Dienste sind in einer kostenfreien Variante erhältlich, die für unsere Zwecke ausreicht.

Vorbereitungen für das Python-Script

Wie erwähnt benötigt das Script zur Abfrage der Wetterdaten 3 Elemente. Wie diese einzurichten sind wird hier erklärt.

Die Wetter-API über Rapid API einrichten

Da wir die Wetter-Daten nicht selbst aufzeichnen, brauchen wir einen Anbieter, der sie zur Verfügung stellt. Das wird in unserem Beispiel WeatherAPI.com sein. Wir greifen aber nicht selbst direkt auf die API zu, sondern nutzen dafür den Dienst Rapid API. Folgt dafür diesen Schritten:

  1. Richtet euch einen Account bei Rapid API ein.
  2. Wechselt auf das Angebot von WeatherAPI.com.
  3. Geht dort in den Reiter „Pricing“ und wählt die kostenfreie Variante aus.
  4. Geht dann wieder zurück zum Reiter „Endpoint“ und wählt dort links den Endpoint „History Weather API“ aus.
  5. In der rechten Spalte („Code Snippets“) wählt ihr über das Dropdown-Menü den Eintrag „Python“ und dann den Unterpunkt „Requests“.

Jetzt setzt ihr schon das Script, das für die eigentliche Abfrage benötigt wird. Wichtig ist vor allem der API-Key, den ihr übernehmen müsst. Bei dem Rest könnt ihr euch an meinem Script orientieren.

Wayscript einrichten

Wayscript übernimmt bei unserem Python-Script die Aufgabe der Automatisierung. Indem wir das Script dort einbauen, können wir es automatisiert ausführen lassen und so z.B. täglich Wetterdaten in ein Google Sheet schreiben lassen.

Um Wayscript zu nutzen, richte dort einen kostenfreien Account ein.

Google Sheets einrichten

Jetzt wird es etwas kompliziert. Leider können wir Google Sheets nicht direkt beschreiben, sondern benötigen dafür eine Art künstlichen Nutzer. Diesen künstlichen Nutzer legen wir über die Google Cloud Plattform an. Dabei gibt es ein paar Punkte zu beachten.

Ein Google-Clound-Projekt erstellen

  1. Melde für die Google Cloud Plattform an.
  2. Erstelle dort ein neues Projekt.

Ein Dienstkonto anlegen

  1. In dem neuen Projekt kannst du über das Menü den Unterpunkt „IAM & Verwaltung“ aufrufen. Wähle dort den Unterpunkt „Dienstkonten“.
  2. Dort kannst du über den Link „Dienstkonto erstellen“ ein neues Dienstkonto anlegen.
  3. Gib ihm einen Namen und, für eine bessere Übersicht, eine sinnvolle Beschreibung. Drücke dann auf „Erstellen“.
  4. Gib dem Konto nun die Rolle „Bearbeiter“, zu finden unter „Standard“.
  5. Über „Fertig“ schließt du die Konfiguration ab.

Den Schlüssel des Dienstkontos herunterladen

  1. Unter „Dienstkonten“ solltest du nun das von dir erstellte Dienstkonto vorfinden. Drücke dort auf das Symbol mit den 3 Punkten und gehe in dem erscheinenden Menü auf „Schlüssel verwalten“.
  2. Klicke in dem neuen Fenster auf „Schlüssel hinzufügen“ und dann „Neuen Schlüssel erstellen“. Als Schlüsseltyp wählst du JSON. Der JSON-Schlüssel wird jetzt heruntergeladen.
  3. Benenne ihn um in client_secret.json. So kann unser Script darauf zugreifen.

APIs aktivieren

  1. In dem neuen Projekt kannst du über das Menü den Unterpunkt „APIs & Dienste“ auswählen und dann „Dashboard“.
  2. In dem Fenster kannst du den Button „APIs und Dienste aktivieren“ anklicken. Suche dort nach „Google Drive API“ und aktiviere die API. Das gleiche tust du für „Google Sheets API“.

Die Wetter-Tabelle mit dem Dienstkonto verbinden

  1. Öffne nun die client_secret.json-Datei z.B. mit dem Editor oder einem ähnlichen Programm, das es anzeigen kann.
  2. Hier findest du den Eintrag client_email. Kopiere die danach angegebene E-Mail-Adresse.
  3. Öffne jetzt Google Sheets und erstelle darin eine neue Tabelle. Die kannst du z.B. „Wetter-API“ nennen.
  4. Oben rechts findest du den Button „Freigeben“. Füge darüber die E-Mail-Adresse ein, die in der client_secret.json-Datei liegt.

Schritt für Schritt durch das Wetterdaten-Python-Script

Im Folgenden möchte ich euch einmal Stück für Stück erklären, wie der Code für das Python-Script zum Abholen der Wetterdaten und Senden an Google Sheets, gebaut ist. Dazu hier einmal zu Beginn das komplette Script:

import requests
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from datetime import date, timedelta

# Definieren der abzufragenden Werte
city = "Berlin"
date = (date.today()) - timedelta(days = 1)
lang = "de"

# Definieren der URL zur Wetter-API
url = "https://weatherapi-com.p.rapidapi.com/history.json"

# Definieren der abzufragenden Werte
querystring = {"q": city,
               "dt": date,
               "lang": lang}

# Definieren des Headers zur Authentifizierung
headers = {
    'x-rapidapi-key': "HIER KOMMT DER KEY VON RAID API REIN",
    'x-rapidapi-host': "weatherapi-com.p.rapidapi.com"
}

# Erhalten der Werte
response = requests.request("GET", url, headers=headers, params=querystring)

# Umwandeln der Werte
response = response.json()

# Definieren der benötigten Werte
location_name = response["location"]["name"]
date = response["forecast"]["forecastday"][0]["date"]
avg_temp = response["forecast"]["forecastday"][0]["day"]["avgtemp_c"]
min_temp = response["forecast"]["forecastday"][0]["day"]["mintemp_c"]
max_temp = response["forecast"]["forecastday"][0]["day"]["maxtemp_c"]
max_wind = response["forecast"]["forecastday"][0]["day"]["maxwind_kph"]
avg_humidity = response["forecast"]["forecastday"][0]["day"]["avghumidity"]
sunrise = response["forecast"]["forecastday"][0]["astro"]["sunrise"]
sunset = response["forecast"]["forecastday"][0]["astro"]["sunset"]

# Definieren des Bereichs, auf den in Google zugegriffen werden soll
scope = ['https://www.googleapis.com/auth/spreadsheets',
         'https://www.googleapis.com/auth/drive']

# Authentifizierung Google Sheets gegenüber
authentifizierung = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)

# Client in einer Variable sichern
client = gspread.authorize(authentifizierung)

# Öffnen der Google-Tabelle
tabelle = client.open("Wetter-API")

# Hinterlegen der Werte in einer Liste
wetter_werte = [date, location_name, avg_temp, min_temp, max_temp, max_wind, avg_humidity, sunrise, sunset]

# Schreiben der Wetter-Werte in eine neue Google-Tabellenzeile
tabelle.sheet1.append_row(wetter_werte)

Die benötigen Python-Module importieren

import requests
import gspread
from oauth2client.service_account import ServiceAccountCredentials
from datetime import date, timedelta

In Python erleichtern uns Module die Arbeit. Sie beinhalten Funktionen anderer Entwickler, auf die wir zugreifen können und daher nicht selbst schreiben müssen. Für das Wetterdaten-Script benötigen wir diese:

  • Requests: Dieses Modul erlaubt uns aus Python heraus eine HTTP-Anfrage zu stellen und mit den zurückkommenden Daten zu arbeiten.
  • gspread: Dieses Modul erlaubt uns mit Google Sheets zu arbeiten.
  • oauth2client.service_account: Dieses Modul hilft uns dabei uns gegenüber Google zu authentifizieren. Das ist notwendig, damit wir überhaupt in ein Google Sheet schreiben können.
  • datetime: Mit diesem Modul holen wir uns das passende Datum in das Script. Das ist notwendig, da wir ja nicht immer den gleichen Tag abfragen wollen bzw. uns nicht jeden Tag neu an das Script setzen wollen, um das Datum händisch anzupassen.

Variablen für ein leichteres Arbeiten definieren

# Definieren der abzufragenden Werte
city = "Berlin"
date = (date.today()) - timedelta(days = 1)
lang = "de"

Theoretisch können wir die Variablen für die Abfrage des Wetters auch direkt in die Abfrage schreiben. Ich finde es aber schöner, wenn wir sie direkt zu Beginn übersichtlich festhalten. Wir definieren 3 Variablen:

  • city: Damit erklären wir den Namen des Ortes, für das wir das Wetter abfragen wollen. In diesem Beispiel ist das Berlin.
  • date: Die Variable enthält das Datum für den Tag, für den wir das Wetter abfragen wollen. Hier kommt auch schon unser erstes Modul zum Einsatz: datetime. Ich will das Script so haben, das es mir immer die Daten des Vortags herausgibt. Daher brauche ich nicht das Datum von heute, sondern von gestern. Das erhalte ich, indem ich mit date.today() das heutige Datum erhalte und dann mit – timedelta(days = 1) erkläre, dass von diesem Tag ein Tag abgezogen werden soll.
  • lang: Mit dieser zusätzlichen Info können wir die erhaltenen Daten auf Deutschland anpassen, wir setzen den Wert auf „de“ für „Deutsch“.

Die Abfrage der Wetter-Daten vorbereiten

# Definieren der URL zur Wetter-API
url = "https://weatherapi-com.p.rapidapi.com/history.json"

# Definieren der abzufragenden Werte
querystring = {"q": city,
               "dt": date,
               "lang": lang}

# Definieren des Headers zur Authentifizierung
headers = {
    'x-rapidapi-key': "HIER KOMMT DER KEY VON RAID API REIN",
    'x-rapidapi-host': "weatherapi-com.p.rapidapi.com"
}

Im diesem Teil des Scripts bauen wir unsere Abfrage zusammen. Sie besteht aus 3 Teilen:

  • Die URL zur Wetter-API: Diese URL habe ich von Rapid API erhalten. Sie erklärt, auf welche URL wir zugreifen wollen.
  • Variablen für die Abfrage: Hier kommen die 3 Variablen zum Einsatz, die wir zu Beginn definiert haben: Der Ort, das Datum sowie die Sprache.
  • Authentifizierung: Der Anbieter der Wetter-API möchte einen kontrollierten Zugang. Deswegen braucht es eine Authentifizierung. Die dafür benötigten Werte habe ich ebenfalls von Rapid API erhalten.

Erhalten und Umwandeln der Wetter-Werte

# Erhalten der Werte
response = requests.request("GET", url, headers=headers, params=querystring)

# Umwandeln der Werte
response = response.json()

Wir können jetzt unsere Abfrage durchführen. Dafür definieren wir in der Variable „reponse“ den Aufbau der Abfrage. Sie setzt sich zusammen aus dem Modul „requests“, das wir am Anfang importiert haben, dem Befehl „GET“ (Daten sollen also geholt werden) und dann der URL für die Abfrage, die Authentifizierung für die Abfrage und zuletzt die Parameter über Ort, Datum und Sprache. Die Daten, die wir erhalten, können jetzt in etwa so aussehen:

Response [200]

Diese Info beinhaltet den Statuscode der URL. „200“ bedeutet „OK“.

Was wir aber brauchen, ist nicht der Status der URL, sondern die Daten, die darüber erhältlich sind. Wir nutzen daher die nächste Zeile, um „response“ mit den benötigten Werten auszustatten. Das machen wir, indem wir die Funktion „.json“ an die Variable hängen (zugegeben: Ich weiß nicht genau warum eben diese Funktion hier funktioniert, aber sie bringt das richtige Ergebnis :-)).

Mit dieser Funktion erhalten wir eine Sammlung von Daten ({‚location‘: {’name‘: ‚Berlin‘, ‚region‘: ‚Berlin‘,….), aus denen wir uns nur noch die benötigten Werte rauspicken müssen.

Die benötigten Wetter-Werte definieren

# Definieren der benötigten Werte
location_name = response["location"]["name"]
date = response["forecast"]["forecastday"][0]["date"]
avg_temp = response["forecast"]["forecastday"][0]["day"]["avgtemp_c"]
min_temp = response["forecast"]["forecastday"][0]["day"]["mintemp_c"]
max_temp = response["forecast"]["forecastday"][0]["day"]["maxtemp_c"]
max_wind = response["forecast"]["forecastday"][0]["day"]["maxwind_kph"]
avg_humidity = response["forecast"]["forecastday"][0]["day"]["avghumidity"]
sunrise = response["forecast"]["forecastday"][0]["astro"]["sunrise"]
sunset = response["forecast"]["forecastday"][0]["astro"]["sunset"]

Jetzt, da wir Werte von der Wetter-API in Python erhalten, müssen wir die benötigten Werte definieren. Das tun wir, indem wir uns die vorherige Ausgabe (die wir mit response.json() erhalten haben) genau ansehen und schauen, an welcher Position wir den Wert finden, den wir benötigen. Wir sollten hier genau die Werte auswählen, die wir später in unserem Google Sheet haben wollen.

In meiner späteren Google-Tabelle möchte ich folgende Informationen haben:

  • location_name: Den Ort für die Wetterabfrage.
  • date: Das Datum für die Wetterabfrage.
  • avg_temp: Die Durchschnittstemperatur für den Tag.
  • min_temp: Die Mindesttemperatur für den Tag.
  • max_temp: Die höchste Temperatur für den Tag.
  • avg_humidity: Die durchschnittliche Luftfeuchtigkeit für den Tag.
  • sunrise: Die Uhrzeit, wann die Sonne aufgeht.
  • sunset: Die Uhrzeit, wann die Sonne untergeht.

Alle diese Informationen habe ich in Variablen gepackt, mit denen ich später effizienter arbeiten kann, als immer die komplette Position des jeweiligen Elements angeben zu müssen.

Daten für Google-Sheets vorbereiten

# Definieren des Bereichs, auf den in Google zugegriffen werden soll
scope = ['https://www.googleapis.com/auth/spreadsheets',
         'https://www.googleapis.com/auth/drive']

# Authentifizierung Google Sheets gegenüber
authentifizierung = ServiceAccountCredentials.from_json_keyfile_name('client_secret.json', scope)

# Client in einer Variable sichern
client = gspread.authorize(authentifizierung)

Unsere nächsten zwei Module kommen gleich zum Einsatz, nämlich gspread und oauth2client. Wir fangen an, indem wir in der Variable scope die Bereiche für Google Sheets (…/spreadsheets) sowie Google Drive (…/drive) definieren. Ich weiß nicht wieso, aber scheinbar braucht es beide Elemente, damit das Schreiben in Google Sheets später gelingt.

Im nächsten Step definieren wir die Informationen, die für die Authentifizierung gegenüber Google benötigt werden. Diese packen wir in die Variable authentifizierung. Hier kommt die client_secret.json-Datei zum Einsatz, die wir in der Vorbereitung von der Google Cloud Plattform erhalten haben. Wir verweisen auf sie und geben die Variable scope mit, die wir einen Absatz vorher definiert haben.

Zuletzt nutzen wir gspread um mit den gesammelten Daten den Zugang zu Google Sheets zu sichern, damit wir einfacher auf die Tabellen zugreifen können.

Endlich: Die Google-Tabelle öffnen und mit den Wetter-Daten befallen

# Öffnen der Google-Tabelle
tabelle = client.open("Wetter-API")

# Hinterlegen der Werte in einer Liste
wetter_werte = [date, location_name, avg_temp, min_temp, max_temp, max_wind, avg_humidity, sunrise, sunset]

# Schreiben der Wetter-Werte in eine neue Google-Tabellenzeile
tabelle.sheet1.append_row(wetter_werte)

Dadurch, dass wir vorher in der Variable client alle Informationen für den Zugang hinterlegt haben, können wir jetzt recht simpel für die Tabelle den benötigten Zugang mit dem Befehl .open verbinden. In den Klammern geben wir an, wie der Name der Tabelle ist (in diesem Fall Wetter-API). Das alles haben wir nun in der Variable tabelle gesichert.

Was wir jetzt brauchen, bevor wir die Daten in Google Sheets schreiben können, ist eine Liste. In wetter_werte fügen wir alle Variablen ein, die wir zuvor als relevante Werte ausgemacht haben.

Nun folgt der letzte Schritt: Die Funktion ausführen, mit der die Wetter-Daten aus der Liste in die Tabelle geschrieben werden. Sie setzt sich zusammen auf der vorher definierten Variable tabelle, dem Namen des Tabellenblattes (sheet1) und dem Befehl append_row(). Dieser sagt, dass unter der letzten mit Daten befüllten Zeile eine neue Zeile erstellt werden soll. Diese wird mit den Werten der Liste wetter_werte befüllt, in die wir zuvor unsere Wetterdaten als Variablen eingefügt haben.

Somit ist einmal das Script selbst erklärt. Es müsste jetzt ausführbar sein und wenn du die Google Sheet öffnest, sollte dort auch eine neue Zeile mit den ausgewählten Wetterdaten zu finden sind.

Machen wir uns an die Arbeit und nutzen wir Wayscript für die Automatisierung.

Die Automatisierung des Python-Scripts mit Wayscript einrichten

In der Vorbereitung wurde der Wayscript-Account bereits erstellt. Jetzt geht es nur darum, das Python-Script dort so zu implementieren, dass es täglich läuft.

Logge dich dafür in Wayscript ein und nutze oben links das „+“ Symbol, um ein neues Script zu erstellen. Das kannst du z.B. „Wetter Script“ nennen.

Es sollte sich ein neues Fenster öffnen, wo du den Ablauf des Scripts definieren kannst. Beginne, indem du als Trigger das Element „Time Trigger“ auswählst. Anschließend kannst du in dem Bereich rechts sagen, dass das Script „daily“ laufen soll und auch zu welcher Uhrzeit es laufen soll. Ich habe. 5 Uhr morgens definiert. So kann ich, sobald ich wach werde und in die Tabelle schauen würde, aktuelle Daten des Vortages finden. Achte darauf den Switch zu setzen, damit der Trigger auch aktiv ist.

Füge nun unter „Add Step“ das Element „Python“ ein. Klicke dann rechts auf „View Code“. Lösche den enthaltenen Code und füge den von dir geschriebenen ein, den wir oben erstellt haben. Ob er funktioniert kannst du testen, indem du oben rechts auf „Run“ klickst. Dann sollte in der Google-Sheet-Tabelle eine neue Zeile mit den Wetterdaten erscheinen.

Was jetzt noch fehlt, ist die Datei JSON-Datei für die Authentifizierung, die wir über die Google Cloud Plattform erhalten haben. Klicke links neben dem Namen deines Projekts auf die 3 Punkte und wähle „Upload“. Darüber kannst du nun die erhaltene client_secret.json-Datei hochladen. Sie ist damit für Wayscript zur Authentifizierung erreichbar.

Und – das wars :-).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.