← Alle Anleitungen

Saisonkalender, nächstes Rennen und Ergebnisse

Bauen Sie einen Rennkalender mit „Nächstes Rennen“-Countdown und einer Ergebnisseite pro Runde, in Python.

8 Min. Lesezeit

Jede Rennsport-App braucht einen Kalender. Diese Anleitung baut drei Dinge aus den Renn-Endpunkten:

  1. Den vollständigen Saisonkalender in Rundenreihenfolge.
  2. Das nächste Rennen, für einen Countdown oder eine Push-Benachrichtigung.
  3. Die klassifizierten Ergebnisse einer beendeten Runde.

Der Kalender

GET /races/seasons/{year} liefert alle Runden einer Saison für eine Kategorie:

{
  "round_number": 12,
  "name": "Qatar Airways Grand Prix of Great Britain",
  "circuit_name": "Silverstone Circuit, Silverstone",
  "country": "United Kingdom",
  "flag": "🇬🇧",
  "category": "MOTOGP",
  "race_date": "2026-08-09",
  "season_year": 2026
}

Die Runden kommen nicht in Reihenfolge zurück, sortieren Sie sie daher nach round_number:

import os
from datetime import date

import requests

HOST = "motogp-api-championship-data-statistics.p.rapidapi.com"
HEADERS = {"X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": HOST}


def get(path: str, **params):
    res = requests.get(f"https://{HOST}{path}", headers=HEADERS, params=params, timeout=10)
    res.raise_for_status()
    return res.json()["data"]


def calendar(year: int, category: str = "MOTOGP") -> list[dict]:
    races = get(f"/races/seasons/{year}", category=category)
    return sorted(races, key=lambda r: r["round_number"])


for race in calendar(2026):
    print(f"R{race['round_number']:>2}  {race['race_date']}  {race['flag']}  {race['name']}")
...
R 6  2026-05-17  🇪🇸  Monster Energy Grand Prix of Catalunya
...
R12  2026-08-09  🇬🇧  Qatar Airways Grand Prix of Great Britain
...

Das nächste Rennen

race_date ist ein ISO-Datum (YYYY-MM-DD), lässt sich also als String sortieren und vergleichen oder mit date.fromisoformat parsen:

def next_race(races: list[dict], today: date) -> dict | None:
    upcoming = [r for r in races if date.fromisoformat(r["race_date"]) >= today]
    return upcoming[0] if upcoming else None


race = next_race(calendar(2026), date.today())
if race:
    days = (date.fromisoformat(race["race_date"]) - date.today()).days
    print(f"Next: {race['name']} at {race['circuit_name']} in {days} days")
else:
    print("Season finished")

Ergebnisse einer Runde

Sobald eine Runde gefahren wurde, sind ihre Ergebnisse nach Saison und Runde abrufbar:

def results(year: int, round_number: int, category: str = "MOTOGP") -> list[dict]:
    rows = get(f"/races/seasons/{year}/round/{round_number}/results", category=category)
    return sorted(rows, key=lambda r: r["position"])


for row in results(2026, 1)[:3]:
    print(f"P{row['position']}  {row['rider_name']:<22} {row['team_name']:<32} +{row['points']} pts")
P1  Marco Bezzecchi        Aprilia Racing                   +25 pts
P2  ...
P3  Raúl Fernández         SuperFile Trackhouse MotoGP Team +16 pts

Jede Zeile hat einen status – FINISHED für klassifizierte Fahrer, sonst Werte wie DNF oder DNS. Zeigen Sie Nichtklassifizierte unterhalb der klassifizierten Fahrer an.

Abfragen nach einem Rennen

Ergebnisse werden nach jedem Rennwochenende hinzugefügt. Wenn Sie „Ergebnisse sind da“-Benachrichtigungen versenden, fragen Sie den Ergebnis-Endpunkt der letzten Runde nach dem Renndatum alle 30–60 Minuten ab statt alle paar Sekunden: Eine leere Liste bedeutet „noch nicht“, und langsames Abfragen hält Sie weit innerhalb Ihres Kontingents. Eine Runde, die nicht im Kalender steht, liefert 404.

def results_ready(year: int, round_number: int) -> bool:
    return len(results(year, round_number)) > 0

Moto2 und Moto3

Übergeben Sie category="MOTO2" oder category="MOTO3" an eine der obigen Funktionen. Rundennummern und Daten folgen demselben Kalender, eine kombinierte Wochenendansicht ist also ein Merge über round_number.

Nächste Anleitung → Eine Fantasy-MotoGP-Liga auswerten