ÖBB / DB - automatisierte Preissuchmaschine

Projektdatum: Mai 2026

Wer regelmäßig mit dem Zug unterwegs ist, kennt das vermutlich. Man sucht eine Verbindung von A nach B, gibt alles bei der ÖBB oder der DB ein und bekommt einen Preis angezeigt. Vielleicht sogar mit einem Hinweis wie "Sparschiene", "Supersparpreis" und wie die Angebote alle heißen. Klingt erstmal gut.

Das Problem beginnt allerdings dann, wenn man etwas genauer hinschaut und nach und nach unlogische Preise findet. Hinter den Preisen steckt nämlich ein unglaublich komplexes System aus Relationspreisen, Kontingenten, Buchungszeitpunkten, Länderlogiken, Zugtypen und vielen weiteren Faktoren. Besonders im Fernverkehr entstehen dadurch teilweise sehr absurde Preisunterschiede.

Relationspreise ÖBB Beispiel

Vor allem die sogenannten Relationspreise spielen dabei eine große Rolle. Vereinfacht gesagt existieren für unzählige (alle?) Bahnhofskombinationen eigene Preisrelationen und Tariflogiken. Die ÖBB veröffentlicht diese Tabellen regelmäßig.

Die Dateien sind dort alphabetisch nach den Anfangsbuchstaben der Bahnhöfe sortiert und jede einzelne Datei enthält tausende Zeilen an möglichen Verbindungsoptionen. Genau dadurch entstehen oft ungewöhnliche Situationen, bei denen eine längere Strecke plötzlich günstiger sein kann als eine eigentlich kürzere Verbindung.

Warum Bahnpreise oft völlig unlogisch wirken

Ein einfaches Beispiel zur Veranschaulichung, die Beispieldaten sind jetzt rein fiktiv:

Du möchtest von Salzburg nach Linz fahren. Das direkte Ticket kostet vielleicht 60€. Gleichzeitig kann es aber passieren, dass eine längere Reise, etwa Salzburg nach Wien oder sogar mit einem früheren Startbahnhof wie Bischofshofen, plötzlich nur 30€ kostet. Obwohl die eigentliche Strecke länger ist.

Das wirkt komplett unlogisch und viele wissen vermutlich nicht einmal, dass solche Konstellationen überhaupt existieren. Genau hier kann man sich diese komplexen Tarifsysteme allerdings zu Nutze machen. Indem zusätzliche Bahnhöfe vor oder nach der eigentlich benötigten Verbindung mit abgefragt werden, erhält man teilweise deutlich günstigere Tickets, obwohl man die zusätzliche Strecke praktisch gar nicht benötigt.

Früher orientierten sich Bahnpreise an der Kilometeranzahl. Heute spielen sehr viel mehr Faktoren eine Rolle.
Alleine dadurch entstehen mittlerweile Millionen möglicher Preisvarianten. Früher hatte die ÖBB z.B. "nur" 100 Standardpreise. Im Laufe der Jahre wurde daraus ein System mit aktuell 76 Millionen Preisen. Rechnet man unterschiedliche Ticketarten und Ermäßigungen mit ein, werden daraus knapp 400 Millionen Preise und damit wird schnell klar, warum das gesamte System für normale Fahrgäste mittlerweile nur mehr schwer zu durchschauen ist.

Jetzt kommt noch dazu, dass die Preise je nach Tag, Uhrzeit, gewöhnliche Auslastung, Zugtyp, Strecke und Vorlaufzeit massiv schwanken. Auf Hochgeschwindigkeitsstrecken wie z.B. Frankfurt - Köln sind schnelle ICE-3 Verbindungen (~ 1h Fahrzeit) mit bis zu 300 km/h häufig durch eigene Preisregeln deutlich teurer als langsamere ICE-4 Verbindungen (~ 2h Fahrtzeit). Zwei Wochen vorher gebucht kann eine Verbindung plötzlich wesentlich günstiger sein als einen Tag davor oder gar am selben Tag. In den Relationspreisen wird das sogar mit eigenen Codes verbunden, etwa "mindestens 15 Tage vorher" oder "zwischen 14 und 1 Tag".

Und genau durch diese enorme Komplexität können große Teile solcher Preissysteme intern nur noch maschinell überwacht und verwaltet werden. In der Masse an Tarifregeln, Kontingenten, Relationen und dynamischen Preisänderungen gehen dadurch immer wieder kleinere Besonderheiten oder ungewöhnliche Preisrelationen unter. Genau solche Details sind allerdings für mich spannend, weil man sie mit gezielten Vergleichen und automatisierten Suchläufen sichtbar machen und für sich nutzen kann.

Zusätzlich dürfte es für die Anbieter selbst gar nicht so einfach sein, (kostentechnisch vielleicht auch unmöglich?) solche Effekte gezielt zu regulieren. In derart komplexen Tarifsystemen können bereits kleine Regeländerungen unerwartete Auswirkungen auf 10-tausende andere Preise haben. Genau deshalb versucht man vermutlich manuelle Eingriffe möglichst zu vermeiden und verlässt sich stattdessen stark auf automatisierte Logiken. Viele dieser ungewöhnlichen Preisrelationen werden dadurch vermutlich einfach akzeptiert, auch weil sie im Alltag von normalen Fahrgästen kaum bewusst genutzt oder überhaupt entdeckt werden.

ÖBB und DB automatisiert vergleichen ist komplizierter als gedacht

Noch komplexer und daher besonders interessant wird das Ganze bei grenzüberschreitenden Verbindungen. Denn sowohl bei der Deutschen Bahn als auch bei der ÖBB kann man teilweise Tickets im jeweils anderen Land kaufen. Dahinter steckt im Grunde eine Zusammenarbeit bzw. Vereinbarung zwischen den Anbietern.

Dadurch stellt sich preistechnisch die Frage, welchem Anbieter der Zug eigentlich "gehört". Fährt der Zug hauptsächlich in Österreich, wird aber von der Deutschen Bahn betrieben? Oder umgekehrt?, da sich das preislich auswirken wird.

Nehmen wir als Beispiel eine Verbindung von Mallnitz nach München. Viele Menschen aus Österreich würden vermutlich automatisch zuerst bei der ÖBB suchen, auch weil sich der Großteil der Strecke in Österreich befindet und man vielleicht eine Vorteilscard hat. Gleichzeitig kann genau dieselbe Verbindung bei der Deutschen Bahn ohne zusätzlicher Ermäßigungskarte günstiger sein, weil der Zug beispielsweise als DB Verbindung geführt wird und dort andere Kontingente oder Supersparpreise verfügbar sind.

Genau solche Unterschiede machen das Ganze extrem unübersichtlich und sorgen dafür, dass sich dieselbe Reise je nach Anbieter preislich teilweise völlig unterschiedlich verhält.

Die ursprüngliche Idee hinter dem Tool

Wer regelmäßig längere Strecken fährt, entwickelt irgendwann automatisch gewisse Erfahrungswerte. Man weiß ungefähr, welche zusätzlichen Bahnhöfe man noch prüfen sollte oder dass ein anderer Zielbahnhof plötzlich deutlich günstigere Preise liefern kann, obwohl er weiter entfernt ist, oder das manchmal eine Streckenteilung z.B. Salzburg nach Linz nach Wien günstiger ist, wie direkt von Salzburg nach Wien - die Teilung findet dabei nur über das Ticket statt, ich spreche nicht von einem Umstieg.

Genau das habe ich in der Vergangenheit oft manuell geprüft. Ich habe dieselbe Reise mehrfach mit unterschiedlichen Parametern gesucht, zusätzliche Bahnhöfe getestet, andere Uhrzeiten geprüft oder verschiedene Tage verglichen. Das Problem dabei war weniger die eigentliche Idee, sondern vielmehr der enorme Zeitaufwand.

Jede Verbindung musste einzeln eingegeben werden

Eigentlich hatte ich schon vor längerer Zeit überlegt, so etwas zu automatisieren. Natürlich gibt es APIs und Schnittstellen der Anbieter, allerdings ist das Thema über die Jahre zu einem ziemlich komplizierten "Monster", zum Teil und vor allem bei der DB auch zu einem "Bürokratiemonster" geworden, da man nicht mehr so ohne weiteres Zugang bekommt, oder Zugänge im Nachhinein eingeschränkt werden.

Außerdem kenne ich im DACH Raum eigentlich nur zwei größere Anbieter, die sich überhaupt an diese "Monster" herangewagt haben und professionelle anbieterübergreifende Bahnvergleiche anbieten. Und fairerweise muss man sagen, die Systeme sind wirklich gut gemacht. Trotzdem bekam ich dort am Ende auch nicht genau die Informationen, die ich persönlich benötigt hätte, um wirklich die günstigsten Optionen zu finden, da man auch dort nur jeweils eine Verbindung abfragen konnte.

Was das Bahn Preisvergleich Tool jetzt konkret kann

Ich kann mehrere Start und Zielbahnhöfe gleichzeitig eingeben, unterschiedliche Anbieter auswählen und auf Wunsch sogar mehrere Tage automatisiert nach allen Preisen durchsuchen lassen.

Das Tool öffnet anschließend automatisiert die entsprechenden Seiten von ÖBB und DB, sammelt die Preise aller Bahnhöfe zueinander parallel ein und schreibt alles in eine gemeinsame Tabelle. Dort kann ich anschließend sehr schnell filtern, sortieren und vergleichen.

Besonders spannend wird das bei längeren oder regelmäßigen Reisen. Denn wenn man mehrere hundert Kilometer fährt und das häufiger macht, entstehen teilweise wirklich große Preisunterschiede und natürlich für jede Verbindung "viel Arbeit", alle möglichen Kombinationen auf der ÖBB oder DB Seite abzufragen, was nun durch das Tool automatisiert wurde.

Zusätzlich lassen sich dadurch überhaupt erst viele dieser ungewöhnlichen Preise oder nennen wir es "happy little accidents" im Tarifsystem sichtbar machen, zumal alle Ermäßigungskarten berücksichtigt werden. Also genau jene Konstellationen, bei denen Strecken plötzlich günstiger werden, andere Startbahnhöfe oder Zielbahnhöfe bessere Preise liefern oder bestimmte Kombinationen unerwartet stark voneinander abweichen.

Natürlich ist das nichts, was man unbedingt für eine einmalige Kurzstrecke analysiert. Aber sobald man längere Bahnfahrten macht, oder oft die selbe Strece zurücklegt, kann man damit zusätzlich zu Vorteilscard & Bahncard weitere deutliche Einsparungen finden.


Einige Screenshots des Tools


Warum die Westbahn aktuell nicht integriert ist

Auf den Screenshots sieht man wohl sehr schnell, dass die Integration der Westbahn fehlt. Ich selbst nutze die Westbahn nur sehr selten, da viele meiner typischen Standardstrecken und Bahnhöfe dort gar nicht direkt angefahren werden.
Grundsätzlich wäre eine Integration technisch durchaus möglich und vermutlich sogar interessant. Gerade auf bestimmten Strecken könnten dadurch nochmals günstigere Preise oder zusätzliche Kombinationen entstehen.

Da das Tool allerdings primär für meine eigenen Reisen entstanden ist, lag der Fokus zunächst vollständig auf ÖBB und DB.

Die grundsätzliche technische Herausforderung

Das Problem einer sauberen "großen" Lösung ist technisch grundsätzlich enorm komplex. Man benötigt nicht nur die eigentlichen Preisdaten, sondern zusätzlich riesige Mengen an Fahrplandaten, GTFS Daten, Betreiberinformationen, unterschiedlichen Tarifsystemen und verschiedenen Buchungslogiken.

Spätestens bei internationalen Verbindungen wird es extrem kompliziert, weil plötzlich mehrere Systeme gleichzeitig zusammenspielen. Dann hat man auf einmal unterschiedliche Logiken der Deutschen Bahn und der ÖBB, verschiedene Kontingente, unterschiedliche Preisregeln und Betreiberstrukturen, die irgendwie sinnvoll kombiniert werden müssten.

Und ehrlich gesagt glaube ich aktuell nicht einmal, dass sich das selbst mit moderner KI wirklich sauber und zuverlässig lösen lässt.

Deshalb habe ich mich einfach hingesetzt und eine kleine Lösung außerhalb der Schnittstellen dafür gebaut, indem ich nur die relevanten Daten direkt von der jeweiligen Website der Anbieter hole.

Entwicklung mit KI und Automatisierung

Das Spannende an diesem Projekt war für mich vor allem die Entwicklung selbst. Ich habe das Tool großteils gemeinsam mit den neuesten Modellen von Anthropic entwickelt.

Die zum Teil sehr langen Anweisungen wurden extrem präzise umgesetzt und der Code war an vielen Stellen erstaunlich kreativ, sodass ich sagen muss, dass ich das ohne Unterstützung nicht einmal ansatzweise so schnell und stabil hinbekommen hätte.

Das Tool steuert die Webseiten der Anbieter automatisiert im Browser an. Technisch läuft das Ganze über ein Tampermonkey Userscript, das die Seiten im Hintergrund automatisiert steuert.

Es öffnet Suchseiten, trägt Daten ein, wartet auf Ergebnisse und liest Preise, Verbindungen und Zeiten wieder aus.


async function waitForElement(selector, timeout = 15000) {
    const start = Date.now();

    while (Date.now() - start < timeout) {
        const el = document.querySelector(selector);

        if (el && el.offsetParent !== null) {
            return el;
        }

        await delay(250);
    }

    throw new Error(`Element nicht gefunden: ${selector}`);
}

async function fillInputLikeUser(input, value) {
    input.focus();
    input.value = '';

    for (const char of value) {
        input.value += char;

        input.dispatchEvent(new Event('input', { bubbles: true }));
        input.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true }));
        input.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true }));

        await delay(40 + Math.random() * 80);
    }

    input.dispatchEvent(new Event('change', { bubbles: true }));
}

Besonders tricky war hier, dass normale input.value = "..." Änderungen bei modernen Single Page Anwendungen oft nicht mehr ausreichen. Viele Felder reagieren nur noch auf echte Benutzerinteraktionen.

Das Script musste deshalb echte Tastatureingaben simulieren, inklusive zufälliger Verzögerungen, Events und Fokuswechseln, damit die Systeme die Eingaben korrekt verarbeiten und anschließend überhaupt Suchergebnisse laden.

Ein etwas tieferer technischer Blick hinter die Kulissen

Die größte Herausforderung war nämlich nicht das Sammeln der Preise selbst, sondern die Tatsache, dass beide Anbieter komplett unterschiedliche Systeme verwenden und moderne Webseiten heute sehr stark gegen automatisierte Zugriffe abgesichert sind.

Die Deutsche Bahn arbeitet beispielsweise mit einer modernen Single Page Anwendung, bei der Inhalte ständig dynamisch nachgeladen werden. Gleichzeitig verändert das System laufend URL Parameter, Zustände und interne Datenstrukturen. Selbst einfache Dinge wie Datum oder Uhrzeit mussten teilweise direkt in interne URL Parameter geschrieben werden, weil klassische Formulareingaben nicht zuverlässig funktioniert haben.

Zusätzlich reagieren viele Eingabefelder dort nicht mehr auf normale Änderungen per Java. Ich musste also echte Benutzerinteraktionen simulieren, z.B. Tastatureingaben und Wartezeiten, damit die Eingaben wie ein echter Benutzer erkannt werden und entsprechend korrekt die Ergebnisse ausgeben werden.

Die ÖBB verwendet wiederum komplett andere technische Komponenten mit eigener Logik und eigenen dynamischen Nachladeprozessen. Das bedeutete letztendlich, dass beide Systeme fast wie zwei völlig unterschiedliche Projekte behandelt werden mussten.

Wenn zu viele Suchanfragen gleichzeitig gestartet wurden, reagierten die Systeme teilweise mit temporären Sperren oder ungewöhnlichem Verhalten. Genau deshalb musste das Tool intern sehr vorsichtig arbeiten und Suchanfragen intelligent staffeln. Teilweise liefen dabei mehrere Tabs parallel, aber mit kontrollierten Verzögerungen und Überwachungen, um möglichst natürlich zu wirken.

Zusätzlich musste das Tool erkennen können, ob Ergebnisse noch geladen werden, ob Preise nachträglich aktualisiert wurden, ob bestimmte Verbindungen überhaupt vollständig geladen waren, ob es für die Verbindung überhaupt Preise gibt bzw. es sich nur um eine Teilstrecke handelt.
Im Hintergrund entstand dadurch letztendlich fast schon ein kleines Orchester zwischen Browser, Anbieterseiten, Suchzuständen und Ergebnisverwaltung.

Das Tool basiert auf einer lokalen HTML Oberfläche und einem Tampermonkey Script. Darüber werden die Webseiten der DB und der ÖBB automatisiert gesteuert. Die Eingabeseite erstellt verschiedene Suchaufträge und öffnet anschließend automatisch die jeweiligen Tabs bei den Anbietern. Dort übernimmt das Script das Ausfüllen der Formulare, wartet auf die geladenen Preise und liest die Ergebnisse strukturiert wieder aus. Die Daten landen danach gesammelt auf einer Ergebnisseite.


async function waitForStableResults(containerSelector, stableTime = 2000) {
    return new Promise(resolve => {
        const container = document.querySelector(containerSelector);

        let lastChange = Date.now();

        const observer = new MutationObserver(() => {
            lastChange = Date.now();
        });

        observer.observe(container, {
            childList: true,
            subtree: true
        });

        const interval = setInterval(() => {
            if (Date.now() - lastChange >= stableTime) {
                clearInterval(interval);
                observer.disconnect();
                resolve();
            }
        }, 250);
    });
}

async function collectPrices() {
    await waitForStableResults('.results-container');

    return [...document.querySelectorAll('.price')].map(el => ({
        text: el.innerText.trim()
    }));
}

Auch das Laden der Ergebnisse war überraschend kompliziert. Die Preise erschienen nicht sofort, sondern wurden oft mehrfach dynamisch nachgeladen oder nachträglich verändert.

Dadurch konnte man nicht einfach nur auf das erste sichtbare Ergebnis warten. Das Script musste erkennen, wann sich die Seite wirklich nicht mehr verändert und die Daten erst dann auslesen, damit keine unvollständigen oder falschen Preise übernommen werden.

Zusätzlich musste ich das Ganze so bauen, dass die Suchanfragen möglichst vorsichtig ablaufen, um Sperren zu vermeiden. Das Tool besitzt deshalb verschiedene Geschwindigkeitsmodi und kann Suchvorgänge kontrolliert parallel oder nacheinander ausführen.

Warum ich das Projekt nicht veröffentliche

Ich habe tatsächlich kurz überlegt, das Projekt öffentlich zugänglich zu machen. Allerdings glaube ich, dass das Probleme verursachen könnte.
Automatisiertes Scraping solcher Plattformen ist verständlicherweise nicht unbedingt gern gesehen und vermutlich würde relativ schnell technisch versucht werden dagegen zu arbeiten.

Da ich das Tool selbst weiterhin nutzen möchte und es primär für meine eigenen Reisen gebaut habe, bleibt es daher aktuell privat.
Trotzdem war das Projekt für mich extrem spannend. Nicht nur, weil ich dadurch bei meinen Bahnreisen mittlerweile wesentlich schneller die wirklich günstigsten Preise finde, sondern auch, weil ich dadurch wieder ein konkretes Projekt hatte, bei dem ich meine Erfahrungen mit modernen KI Systemen weiter ausbauen konnte.

Wie KI die Softwareentwicklung verändert

Gerade im DACH Raum wird bei KI in der Programmierung oft noch sehr skeptisch gedacht. Manchmal habe ich das Gefühl, dass Unternehmen die Vorteile nicht sehen wollen bzw. vielleicht auch nicht sehen können und vor allem kritisch denken. Ich persönlich sehe die eigentliche Stärke dabei weniger im klassischen Laieneinsatz, wo natürlich auch vieles schief gehen kann, sondern vielmehr darin, was versierte Anwender plötzlich in extrem kurzer Zeit umsetzen können.

Genau dieser Punkt geht meiner Meinung nach aktuell noch unter, was ich persönlich durchaus darauf zurückführe, dass bekanne Influcencer in diesem Bereich und auch Medien darüber häufig über Probleme berichten, nicht aber darüber was bereits damit geschaffen werden kann, was ohne KI nicht hätte finanziert werden können.

Die Systeme sind schon heute unglaublich schnell und erstaunlich gut. Kaum jemand wird in einigen Jahren noch komplett selbst programmieren. Entwickler werden vermutlich immer stärker eine Kontroll- und Steuerungsfunktion übernehmen, während große Teile der eigentlichen Umsetzung automatisiert entstehen.

Und ich glaube ehrlich gesagt auch nicht, dass es sich heute noch irgendein Entwickler leisten kann, diese Systeme einfach zu ignorieren.

Jedes KI System hat seine eigenen Vor- und Nachteile. Der Umgang damit muss gelernt werden. Gute Prompts schreiben, Arbeitsabläufe sinnvoll strukturieren, eigene Regeln für die jeweilige Sprache, für das jeweilige Projekt, für seine eigenen Bedrüfnissen definieren und gemeinsam mit der KI ein komplettes Projekt umzusetzen, ist mittlerweile eine eigene Fähigkeit geworden. Und genau das unterschätzen aktuell noch viele.

Es reicht nämlich längst nicht mehr aus, einfach nur ein paar Zeilen in einen Chat zu schreiben und auf ein gutes Ergebnis zu hoffen. Man muss lernen, wie unterschiedliche Tools funktionieren, Modelle denken, wo ihre Stärken und Schwächen liegen und wie man Aufgaben sinnvoll zerlegt und weitergibt.
Manche Systeme sind beispielsweise extrem stark bei strukturiertem Code, andere eher bei Architektur, Analyse oder kreativen Lösungsansätzen. Zusätzlich muss man verstehen, wie man Kontext richtig aufbaut, Informationen sauber vorbereitet und Arbeitsabläufe mit der KI gestaltet, ohne dass Kontext verloren geht und die Kosten zu hoch werden.

Im Grunde entsteht hier gerade ein komplett neues Berufsfeld!

Wer gute Ergebnisse erzielen möchte, muss lernen Projekte logisch aufzuteilen, Fehler zu analysieren, Ergebnisse kritisch zu prüfen und die KI ganz gezielt zu steuern. Genau deshalb glaube ich auch nicht, dass Entwickler einfach ersetzt werden. Die Rolle verändert sich vielmehr und zwar massiv.

Die eigentliche Fähigkeit wird zunehmend darin liegen, komplexe Prozesse in der Gesamheit zu verstehen, zu überblicken und sauber zu orchestrieren, Entscheidungen zu treffen und die Aufgaben an den jeweilig besten geeigneten KI-Agenten weiterzugeben und zu verbinden. Und ehrlich gesagt merkt man bereits heute sehr stark, wer sich intensiv damit beschäftigt hat und wer nicht.

Wer hier nicht bereit ist umzudenken und dazuzulernen, wird meiner Meinung nach relativ schnell den Anschluss verlieren. Und wenn man ehrlich ist, kann man aktuell vermutlich noch gar nicht wirklich abschätzen, wie schnell das wirklich sein wird. Wenn man allerdings berücksichtigt, was in kürzester Zeit bereits entstanden ist und wie sich die großen Player am Markt aktuell positionieren, dann kann die Entwicklung meiner Meinung nach mittelfristig nur in eine Richtung gehen und genau das wird vermutlich im DACH Raum noch einige überraschen.

Und das sage ich durchaus als jemand, der hauptberuflich seit über 20 Jahren mit Adobe Produkten arbeitet und selbst lange der Meinung war, dass solche etablierten Systeme in der Industrie kaum ernsthaft ersetzbar wären. Gerade deshalb war es spannend zu beobachten, wie massiv selbst ein Konzern wie Adobe durch die rasante KI Entwicklung überrascht wurde, unter Druck geraten ist und innerhalb weniger Jahre über 60% seiner Marktkapitalisierung verloren hat und scheinbar den Anschluss nicht mehr findet und gleichzeitig entsteht ein vollkommen neues Wettbewerbsbild und zwar nicht nur ein wenig, sondern massivst.

Für mich persönlich ist daher klar: KI ist gekommen, um zu bleiben. Die Vorteile sind dafür einfach viel zu enorm.