Grundlagen des API-Datenabrufs mit Python
August 29, 2014
Diese Anleitung bietet eine grundlegende Einführung in den Abruf und die Verarbeitung von Daten aus REST-APIs mit Python. Der Fokus liegt auf dem Senden von HTTP-Anfragen, dem Parsen von JSON-Antworten und der sicheren Verarbeitung der erhaltenen Daten.
API-Endpunkte testen mit curl
Bevor Sie Python-Code schreiben, ist es oft hilfreich, eine API direkt über die Kommandozeile mit curl zu testen. Dies ermöglicht eine schnelle Überprüfung der Antwortstruktur.
Beispiel mit der Google Books API:
curl 'https://www.googleapis.com/books/v1/volumes?q=isbn:9780765350381'
Beispiel mit der Open Library API:
curl 'https://openlibrary.org/api/books?bibkeys=ISBN:0201558025&jscmd=data&format=json'
Methode 1: Verwendung der requests-Bibliothek (Empfohlen)
Die requests-Bibliothek ist der De-facto-Standard für HTTP-Anfragen in Python. Sie vereinfacht den Prozess erheblich im Vergleich zu den integrierten urllib-Modulen.
Installation:
pip install requests
Beispiel-Skript: Dieses Skript fragt die Google Books API nach einem Buch über seine ISBN ab und gibt Titel, Autoren und Seitenzahl aus.
#!/usr/bin/env python3
import requests
import sys
def fetch_book_data(isbn: str):
"""
Fragt die Google Books API nach Buchdaten für eine gegebene ISBN ab.
"""
url = "https://www.googleapis.com/books/v1/volumes"
params = {"q": f"isbn:{isbn}"}
try:
response = requests.get(url, params=params, timeout=10)
# Wirft eine Exception für HTTP-Fehler (Status-Codes 4xx oder 5xx)
response.raise_for_status()
data = response.json()
items = data.get("items", [])
if not items:
print(f"Keine Daten für ISBN {isbn} gefunden.")
return
# Wir nehmen das erste Ergebnis
volume_info = items[0].get("volumeInfo", {})
title = volume_info.get("title", "Titel nicht verfügbar")
authors = ", ".join(volume_info.get("authors", ["Unbekannt"]))
page_count = volume_info.get("pageCount", "N/A")
print(f"Titel: {title}")
print(f"Autoren: {authors}")
print(f"Seiten: {page_count}")
except requests.exceptions.RequestException as e:
print(f"Ein Fehler bei der API-Anfrage ist aufgetreten: {e}", file=sys.stderr)
except KeyError:
print("Unerwartete Datenstruktur in der API-Antwort.", file=sys.stderr)
if __name__ == "__main__":
if len(sys.argv) > 1:
fetch_book_data(sys.argv[1])
else:
# Standard-ISBN, falls keine übergeben wird
fetch_book_data("9780765350381")
Vorteile von requests:
- Intuitive API für alle HTTP-Methoden.
- Eingebaute Fehlerbehandlung mit
raise_for_status(). - Automatische Dekodierung von JSON mit
.json().
Methode 2: Verwendung der Python-Standardbibliothek (urllib)
Ohne externe Abhängigkeiten kann der Datenabruf auch mit den integrierten Modulen urllib und json realisiert werden. Der Code ist jedoch umständlicher.
#!/usr/bin/env python3
import json
import urllib.parse
import urllib.request
import sys
def fetch_with_urllib(isbn: str):
params = urllib.parse.urlencode({"q": f"isbn:{isbn}"})
url = f"https://www.googleapis.com/books/v1/volumes?{params}"
try:
with urllib.request.urlopen(url, timeout=10) as response:
# Manuelles Dekodieren (UTF-8) und Parsen von JSON
response_body = response.read().decode("utf-8")
data = json.loads(response_body)
items = data.get("items", [])
if items:
info = items[0].get("volumeInfo", {})
print(info.get("title", "Titel nicht verfügbar"))
except urllib.error.URLError as e:
print(f"Ein Fehler bei der Anfrage ist aufgetreten: {e}", file=sys.stderr)
if __name__ == "__main__":
fetch_with_urllib("9780765350381")
Sichere Datenverarbeitung
API-Antworten haben nicht immer eine konsistente Struktur. Felder können fehlen. Verwenden Sie daher immer die .get()-Methode bei Dictionaries, um KeyError-Exceptions zu vermeiden.
# Unsicher: Kann einen KeyError auslösen, wenn 'volumeInfo' nicht existiert
# title = item['volumeInfo']['title']
# Sicher: Gibt 'None' oder einen Standardwert zurück, falls ein Schlüssel fehlt
volume_info = item.get("volumeInfo", {})
title = volume_info.get("title", "Titel unbekannt")
Häufige Fehlerquellen
- Timeout: Die API antwortet nicht schnell genug. Setzen Sie immer einen
timeout-Wert. - HTTP-Fehler:
4xx-Fehler (Client-Seite, z.B. ungültiger API-Key) oder5xx-Fehler (Server-Seite). - Fehlende Daten (
KeyError): Ein erwartetes Feld ist in der JSON-Antwort nicht vorhanden. Validieren Sie die Datenstruktur oder verwenden Sie.get().