JSON-Daten mit Python herunterladen

In den bisherigen Tutorials ging es um CSV- und um Excel-Dateien. Jetzt ist JSON an der Reihe. Ziel ist es, JSON-Daten herunterzuladen und zu visualisieren.

Wie auch in den anderen Beispielen zuvor, stammen die Daten von der Stadt Kiel. Diesmal geht es um die Anzahl der in Kiel zugelassenen Autos. Die Originaldaten liegen jedoch nur im CSV-Format vor:

https://www.kiel.de/de/kiel_zukunft/statistik_kieler_zahlen/open_data/index.php?id=de-sh-kiel_anzahl_fahrzeuge

Deswegen haben ich die Zahlen, die lediglich die Autos betreffen, mithilfe von Node.js zum Download bereitgestellt. Die Adresse lautet

https://xern-statistic.de/api/cars

In diesem Tutorial stelle ich hinsichtlich des Herunterladens der Daten zwei Wege vor, zum einen die Verwendung des Moduls requests, zum anderen den Weg über pandas.

Das Modul requests nutzen

import requests
from pprint import pprint

URL = 'https://xern-statistic.de/api/cars'

def fetch_json_data(url):
    try:
        response = requests.get(url)
    except OSError:
        print('No connection to the server!')
        return None

    # check if the request is successful
    if response.status_code == 200:
        print('Status 200, OK')
        return response.json()
    else:
        print('JSON data request not successful!.')
        return None

json_data = fetch_json_data(URL)
pprint(json_data)

Zusätzlich zu requests wird hier pprint importiert, da hierüber (anstelle von print()) eine übersichtlichere Ausgabe der Daten ermöglicht wird.

Die Funktion fetch_json_data(url) leistet dann die eigentliche Arbeit. Zunächst wird überprüft, ob überhaupt eine Verbindung zum Server möglich ist:

response = requests.get(url)

Wenn das der Fall ist, wird überprüft, ob der Server den Status-Code 200 (für ‘OK’) übermittelt:

if response.status_code == 200:
    print('Status 200, OK')
    return response.json()

Trifft auch das zu, dann werden die Daten schließlich ausgegeben:

pprint(json_data)

Pandas nutzen

Die Bibliothek pandas stellt die Methode read_json() bereit. Als Parameter akzeptiert sie eine URL, so dass folgende Zeile ausreicht, um die Daten herunterzuladen:

df = pd.read_json(URL, orient='columns')

Die ersten zehn Zeilen könnte man sich dann mit head() anzeigen lassen:

df.head(10)

Den vollständigen Code gibt es – wie bisher auch – als Jupyter Notebook auf Github.

Ein Tipp für macOS-Nutzer: Wenn Ihr den Code ausführt, kann es passieren, dass ein SSL-Fehler auftritt:

urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]

In diesem Fall könnt Ihr folgendes versuchen:

  1. Wechselt im Finder in das Pyton-Verzeichnis (> Programme > Python 3.x) und
  2. führt mit einem Doppelklick die Datei „Install Certificates.command“ aus.

Weiterführende Links

Zuletzt aktualisiert am 17. Februar 2021