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:
- Den vollständigen Saisonkalender in Rundenreihenfolge.
- Das nächste Rennen, für einen Countdown oder eine Push-Benachrichtigung.
- 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.