TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸TASIOMIND.DEV — OPERATIONAL▸▸▸FULL STACK DEVELOPER @ GWQ SERVICEPLUS AG▸▸▸FOUNDER — K8SGPT.AI▸▸▸OPEN SOURCE: ACTIVE▸▸▸DISTRIBUTED SYSTEMS / KUBERNETES / AI▸▸▸RUST + GO + PYTHON▸▸▸FIELD TESTED / STATUS — NOMINAL▸▸▸LOCATION: EUROPE/BERLIN▸▸▸

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:

code
curl 'https://www.googleapis.com/books/v1/volumes?q=isbn:9780765350381'

Beispiel mit der Open Library API:

code
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:

code
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.

code
#!/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.

code
#!/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.

code
# 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) oder 5xx-Fehler (Server-Seite).
  • Fehlende Daten (KeyError): Ein erwartetes Feld ist in der JSON-Antwort nicht vorhanden. Validieren Sie die Datenstruktur oder verwenden Sie .get().