Aussehen
Daten abrufen 🐍🐍
Die interessantesten Daten liegen nicht auf deinem Rechner. Wie warm wird es morgen, wie stehen deine Noten, wann fährt die nächste Bahn — all das liegt auf fremden Servern. Und viele davon geben es freiwillig heraus, wenn man richtig fragt.
API
Eine API (englisch application programming interface) ist eine Schnittstelle, über die ein Programm Daten von einem anderen Programm bekommt. Der Unterschied zur Webseite: Eine Webseite ist für Menschen gemacht und voller Gestaltung. Eine API liefert nur die Daten — in einer Form, die ein Programm direkt weiterverarbeiten kann.
Eine Adresse, eine Antwort
Eine API fragt man über eine gewöhnliche Internetadresse. Dafür brauchst du das Modul requests:
pip install requestsDas kleinste denkbare Beispiel — das Wetter von Open-Meteo, ohne Anmeldung und ohne Schlüssel:
python
import requests
# Breiten- und Längengrad von Leipzig stehen in der Adresse.
url = "https://api.open-meteo.com/v1/forecast?latitude=51.34&longitude=12.37¤t=temperature_2m"
response = requests.get(url).json()
print(response)requests.get(url) holt die Antwort, .json() macht daraus etwas, mit dem Python rechnen kann. Die Zahlen in der Adresse sind der Breiten- und Längengrad von Leipzig.
Test
Führ das Programm aus. Es muss eine Zeile mit geschweiften Klammern und einer Temperatur erscheinen. Ändere die Koordinaten auf deinen Wohnort.
JSON ist nur Liste und Dictionary
Was da zurückkam, sieht wüst aus, ist aber genau das, was du schon kennst:
python
print(response["current"]["temperature_2m"])Dictionary
Ein Dictionary speichert Werte unter einem Namen statt unter einer Nummer. Statt grades[0] schreibst du person["name"].
python
person = {"name": "Kara", "alter": 15}
print(person["name"])
person["alter"] = 16Eine Liste ist eine Reihenfolge, ein Dictionary ist ein Nachschlagewerk. In den Antworten von APIs stecken beide ineinander: Listen von Dictionaries, in denen wieder Listen stecken.
Der Weg zu einem Wert ist deshalb oft lang. Tasten dich schrittweise heran: Erst print(response), dann print(response["current"]), dann tiefer. So siehst du bei jedem Schritt, was du in der Hand hast.
Was ist da drin?
Gib nacheinander response, response["current"] und response["current"]["temperature_2m"] aus.
Erweitere danach die Adresse um ,wind_speed_10m und gib auch die Windgeschwindigkeit aus.
Übersichtlicher ausgeben
python
import pprint
pprint.pprint(response)pprint bricht verschachtelte Daten um und rückt sie ein. Bei großen Antworten ist das der Unterschied zwischen lesbar und unlesbar.
Wenn ein Schlüssel nötig ist
Öffentliche Daten wie das Wetter bekommt jeder. Deine Noten natürlich nicht — dafür musst du dich ausweisen. Das geschieht über einen Token: eine lange Zeichenkette, die du dir einmal in deinem Konto erzeugst und die dich gegenüber dem Server vertritt.
Bei beste.schule findest du ihn in deinem Profil unter den persönlichen Zugriffs-Tokens.
python
import requests
token = "HIER-DEIN-EIGENER-TOKEN"
# Der Header reist bei jeder Anfrage mit — deshalb steht er in einer
# eigenen Variablen und nicht jedes Mal neu im Aufruf.
headers = {
"content-type": "application/json",
"Authorization": "Bearer " + token
}
response = requests.get("https://beste.schule/api/me", headers = headers).json()
data = response["data"]
print(data["username"])Der Token reist im Header mit — das ist der Teil einer Anfrage, den man nicht sieht, in dem aber steht, wer man ist und was man erwartet. Der Header ist ein Dictionary, wie alles hier.
Dein Token gehört dir allein
Wer deinen Token hat, kann alles sehen, was du sehen kannst. Gib ihn nicht weiter, zeig ihn nicht im Unterricht auf dem Beamer, und lade ihn niemals in ein Repository hoch.
Sauberer als im Programm steht er in einer eigenen Datei daneben:
python
token = open("token.txt").read().strip()Dann kannst du dein Programm weitergeben, ohne den Schlüssel mitzugeben.
Deine Noten
python
url = "https://beste.schule/api/grades?include=collection.subject"
grades = requests.get(url, headers = headers).json()["data"]
subject = input("Welches Fach möchtest du sehen? ")
# Der Server schickt alle Noten; herausgesucht wird hier.
for grade in grades:
if grade["collection"]["subject"]["name"] == subject:
print(grade["given_at"] + ": " + grade["value"])Der Teil hinter dem Fragezeichen ist wichtig: include=collection.subject sagt dem Server, dass er zu jeder Note auch gleich das Fach mitschicken soll. Ohne diesen Zusatz stünde dort nur eine Nummer, und du müsstest für jedes Fach noch einmal nachfragen.
Deine Noten auswerten
- Gib alle deine Noten aus.
- Filtere sie nach einem Fach.
- Berechne deinen Durchschnitt in diesem Fach.
- Berechne den Durchschnitt für alle Fächer.
- Ermittle für ein Fach, welche Note du als nächstes brauchst, um auf eine bessere Endnote zu kommen.
- Gib deinen Stundenplan aus.
Für 3 und 4 brauchst du das Auswerten aus dem Listen-Kapitel — Summe durch Anzahl. Achtung: grade["value"] ist Text und keine Zahl. int(...) hilft.
Wie finde ich weitere Adressen?
Fast jede API hat eine Dokumentation, in der alle Adressen stehen. Wenn nicht: Die meisten Server antworten auf die Grundadresse mit einer Liste dessen, was sie anbieten. Probier aus, was du findest — beim Lesen kannst du nichts kaputt machen.
Höflich bleiben
Jede Anfrage kostet auf der anderen Seite Rechenzeit. Ein Programm, das in einer Schleife hundertmal pro Sekunde fragt, sieht für den Server aus wie ein Angriff — und wird gesperrt.
Frag also nur, was du brauchst, und speichere dir Antworten, die sich nicht ändern. Beim Ausprobieren reicht eine Anfrage pro Programmstart völlig.
Weitere Ideen
| Projekt | ||
|---|---|---|
| Dein Stundenplan als hübsche Textausgabe | beste.schule | 🐍🐍 |
| Wetterwarnung, wenn morgen Regen kommt | Open-Meteo | 🐍🐍 |
| Deine Schrittzahlen auswerten | Google-Fit-API, braucht ein Google-Konto und OAuth | 🐍🐍🐍 |
Die vollständige Anleitung zum Modul:
https://requests.readthedocs.io/en/latest/