Lernziele dieses Kapitels
- Du sendest HTTP-Requests mit der requests-Bibliothek
- Du verarbeitest JSON-Antworten von APIs
- Du nutzt API-Keys sicher über Umgebungsvariablen
- Du erweiterst PyBuddy um eine Wetter-Funktion
HTTP-Requests mit requests
Mit der requests-Bibliothek holst du Daten aus dem Internet. requests.get(url) ruft eine Webseite oder API ab. Der status_code zeigt, ob alles funktioniert hat.
200— Alles OK404— Nicht gefunden500— Server-Fehler
import requests
# Einfacher GET-Request
url = "https://api.github.com"
response = requests.get(url)
print(f"Status: {response.status_code}")
print(f"Content-Type: {response.headers['Content-Type']}")
# JSON-Antwort verarbeiten
if response.status_code == 200:
daten = response.json()
print(f"API: {daten['current_user_url']}")
else:
print(" Fehler beim Abrufen")
Du kennst bereits JavaScript aus dem JS-Quest. Hier ist der direkte Vergleich:
import requests
r = requests.get(url)
daten = r.json()
fetch(url)
.then(r => r.json())
.then(daten => console.log(daten));
requests.get() ist synchron und einfach. JavaScript: fetch() ist asynchron und gibt Promises zurück. Beides holt Daten vom Server.JSON-Antworten verarbeiten
Die meisten modernen APIs liefern JSON. Mit response.json() wandelt Python die Antwort direkt in ein Dictionary um — dann kannst du wie gewohnt auf die Daten zugreifen.
import requests
# Öffentliche API: Zufälliger Nutzer
url = "https://randomuser.me/api/"
response = requests.get(url)
if response.status_code == 200:
daten = response.json()
user = daten["results"][0]
name = user["name"]["first"] + " " + user["name"]["last"]
email = user["email"]
land = user["location"]["country"]
print(f"👤 Name: {name}")
print(f"📧 E-Mail: {email}")
print(f" Land: {land}")
else:
print(f" Fehler: {response.status_code}")
Du kennst bereits JavaScript aus dem JS-Quest. Hier ist der direkte Vergleich:
daten = response.json()
user = daten['results'][0]
print(user['name']['first'])
const daten = await response.json();
const user = daten.results[0];
console.log(user.name.first);
API-Keys sicher nutzen
Viele APIs benötigen einen API-Key — ein Passwort für den API-Zugriff. Niemals Keys direkt im Code speichern! Nutze stattdessen Umgebungsvariablen.
Sicherheitswarnung
Wenn du API-Keys in GitHub committest, können sie von Bots ausgelesen und missbraucht werden. Nutze immer os.getenv()!
import os
# API-Key aus Umgebungsvariable holen
api_key = os.getenv("OPENWEATHER_API_KEY")
if not api_key:
print(" Kein API-Key gefunden! Setze die Umgebungsvariable:")
print(" export OPENWEATHER_API_KEY=dein_key")
else:
print(" API-Key geladen.")
# Sicher verwenden
url = f"https://api.openweathermap.org/data/2.5/weather?q=Wien&appid={api_key}"
# ... Request senden
Fehlerbehandlung bei APIs
Netzwerk-Anfragen können aus vielen Gründen fehlschlagen: Kein Internet, Server überlastet, falsche URL. Gute Fehlerbehandlung macht dein Programm robust.
import requests
def hole_daten(url):
try:
response = requests.get(url, timeout=5)
response.raise_for_status() # Löst Exception bei 4xx/5xx aus
return response.json()
except requests.exceptions.Timeout:
print(" Zeitüberschreitung — Server antwortet nicht.")
except requests.exceptions.ConnectionError:
print(" Keine Internetverbindung.")
except requests.exceptions.HTTPError as e:
print(f" HTTP-Fehler: {e}")
except requests.exceptions.RequestException:
print(" Unbekannter Netzwerkfehler.")
return None
# Test
daten = hole_daten("https://httpbin.org/status/404")
if daten:
print("Daten erfolgreich geladen.")
APIs in Aktion: Wetter abrufen
Jetzt kommt alles zusammen: Wir rufen echte Wetterdaten ab — ohne API-Key, dank der öffentlichen wttr.in-API.
import requests
def wetter_abrufen(stadt):
url = f"https://wttr.in/{stadt}?format=%C+%t&lang=de"
try:
response = requests.get(url, timeout=5)
if response.status_code == 200:
return response.text.strip()
return " Stadt nicht gefunden"
except requests.exceptions.RequestException:
return " Netzwerkfehler"
# Nutzung
stadt = input(" Für welche Stadt willst du das Wetter wissen? ")
wetter = wetter_abrufen(stadt)
print(f"\n🌤️ Wetter in {stadt}: {wetter}")
Warm-Up: Bitcoin-Preis abrufen
Nutze die CoinDesk API, um den aktuellen Bitcoin-Preis in Euro abzurufen und anzuzeigen.
Hinweis: import requests
url = 'https://api.coindesk.com/v1/bpi/currentprice.json'
try:
r = requests.get(url, timeout=5)
daten = r.json()
preis = daten['bpi']['EUR']['rate']
print(f'💰 Bitcoin-Preis: {preis} €')
except Exception as e:
print(f' Fehler: {e}')
import requests
url = 'https://api.coindesk.com/v1/bpi/currentprice.json'
try:
r = requests.get(url, timeout=5)
daten = r.json()
preis = daten['bpi']['EUR']['rate']
print(f'💰 Bitcoin-Preis: {preis} €')
except Exception as e:
print(f' Fehler: {e}')
Challenge: GitHub Profil-Info
Erstelle ein Programm, das öffentliche GitHub-Profil-Informationen abruft. Der Nutzer gibt einen Benutzernamen ein, das Programm zeigt Follower und öffentliche Repos an.
Hinweis: import requests
user = input('GitHub Username: ')
url = f'https://api.github.com/users/{user}'
try:
r = requests.get(url, timeout=5)
if r.status_code == 200:
d = r.json()
print(f"👤 {d['name'] or d['login']}")
print(f" Öffentliche Repos: {d['public_repos']}")
print(f"👥 Follower: {d['followers']}")
else:
print(' Benutzer nicht gefunden')
except requests.exceptions.RequestException:
print(' Netzwerkfehler')
import requests
user = input('GitHub Username: ')
url = f'https://api.github.com/users/{user}'
try:
r = requests.get(url, timeout=5)
if r.status_code == 200:
d = r.json()
print(f"👤 {d['name'] or d['login']}")
print(f" Öffentliche Repos: {d['public_repos']}")
print(f"👥 Follower: {d['followers']}")
else:
print(' Benutzer nicht gefunden')
except requests.exceptions.RequestException:
print(' Netzwerkfehler')
PyBuddy-Checkpoint: Wetter-Funktion
PyBuddy bekommt eine wetter()-Funktion, die das aktuelle Wetter für eine Stadt abruft und anzeigt.
Hinweis: # pybuddy/main.py
import requests
def wetter(stadt):
url = f'https://wttr.in/{stadt}?format=%C+%t&lang=de'
try:
r = requests.get(url, timeout=5)
return r.text.strip() if r.status_code == 200 else 'Nicht gefunden'
except:
return 'Netzwerkfehler'
stadt = input(' Stadt: ')
print(f'🌤️ {wetter(stadt)}')
# pybuddy/main.py
import requests
def wetter(stadt):
url = f'https://wttr.in/{stadt}?format=%C+%t&lang=de'
try:
r = requests.get(url, timeout=5)
return r.text.strip() if r.status_code == 200 else 'Nicht gefunden'
except:
return 'Netzwerkfehler'
stadt = input(' Stadt: ')
print(f'🌤️ {wetter(stadt)}')
In Fortnite ruft das Spiel ständig APIs ab: Wetterdaten für Events, Shop-Inhalte, Matchmaking-Informationen. Jeder Skin-Kauf, jede Freundschaftsanfrage, jeder Sieg — alles geht über HTTP-Requests an Epic's Server. Du baust gerade die gleiche Technologie!
Zusammenfassung
- requests.get() → Daten von APIs abrufen
- response.json() → JSON in Dictionary umwandeln
- API-Keys immer in Umgebungsvariablen speichern
- try/except für robuste Netzwerk-Anfragen
- Echte APIs machen deine Programme lebendig