Google Flights ist die erste Anlaufstelle für die meisten Reisenden, wenn sie vor einer Buchung Preise vergleichen. Die Seite zeigt konkurrierende Fluggesellschaften nebeneinander mit Preisen, Abflug- und Ankunftszeiten, Flugdauern und Stoppanzahlen, was die öffentlichen Ergebnisse zu einer nützlichen Datenquelle für alle macht, die Preise über Zeit beobachten, eine Route recherchieren oder verfolgen möchten, wie sich Preise zwischen Fluggesellschaften entwickeln. Dieselben Zahlen, die ein Reisender auf der Seite sieht, sind die Zahlen, die ein Preismonitor in einer strukturierten Tabelle haben möchte.

Diese Anleitung zeigt Ihnen, wie Sie Google Flights mit Python scrapen und dabei zuverlässig vorgehen. Sie erstellen einen kleinen, lauffähigen Scraper, der über die Crawling API eine gerenderte Google Flights-Ergebnisseite abruft, jeden Flug mit BeautifulSoup parst und die Datensätze für das Preismonitoring in JSON und CSV exportiert. Der gesamte Walkthrough beschränkt sich auf öffentliche Flugdaten, die jeder ohne Konto einsehen kann, und der Abschnitt zur Rechtslage am Ende ist kein Standardtext, also lesen Sie ihn, bevor Sie diesen Scraper auf größerem Volumen einsetzen.

Was Sie erstellen werden

Ein Python-Skript, das eine öffentliche Google Flights-Such-URL entgegennimmt, das gerenderte HTML über die Crawling API abruft und für jedes Fluginserat auf der Seite einen strukturierten Datensatz extrahiert. Wir verwenden eine Beispielroute als durchgängiges Beispiel und extrahieren diese Felder aus jedem Inserat:

  • Airline die ausführende Fluggesellschaft (oder Fluggesellschaften) im Inserat.
  • Price der angezeigte Preis für das Reiseangebot.
  • Departure time die lokale Abflugzeit des Fluges.
  • Arrival time die lokale Ankunftszeit, einschließlich etwaiger +1/+2-Tagesmarkierungen.
  • Duration die Gesamtreisezeit für das Reiseangebot.
  • Stops ob der Flug nonstop ist oder wie viele Zwischenstopps er hat.

Warum eine einfache Anfrage bei Google Flights scheitert

Wenn Sie eine einfache HTTP-Anfrage von einem Skript an eine Google Flights-URL senden, erhalten Sie nicht die Seite, die Sie in Ihrem Browser sehen. Google Flights erstellt seine Ergebnisliste clientseitig: Das initiale HTML ist größtenteils eine leere Hülle, und die Flugangebotskarten werden erst nach dem Laden der Seite durch JavaScript befüllt. Ein einfaches requests.get führt dieses JavaScript nie aus, gibt also Markup ohne Flüge zurück, und jeder Selektor, den Sie schreiben, liefert leere Ergebnisse.

Darüber hinaus achtet Google auf automatisierten Traffic. Anfragen, die nicht wie ein echter Browser aussehen, werden mit einer Verifikationsseite konfrontiert, herausgefordert oder blockiert, bevor sie die Inserate erreichen. Ein funktionierender Google Flights-Scraper benötigt also zwei Dinge in einer einzigen Anfrage: einen Browser, der die Seite tatsächlich rendert, und eine IP-Adresse, die Google als echten Besucher erkennt. Sie können das selbst mit einem Headless-Browser und einem Pool rotierender residentieller Proxys zusammenstellen, aber die Pflege dieses Setups ist der größte Aufwand. Die Crawling API vereint beides in einem einzigen Aufruf: Sie senden die URL, sie rendert die Seite in einem echten Browser von einer vertrauenswürdigen residentiellen IP und gibt fertiges HTML zum Parsen zurück.

Rendering ist hier keine Option

Anders als eine klassische serverseitig gerenderte Ergebnisseite enthält Google Flights im rohen HTML fast nichts Nützliches. Die Flugangebotskarten erscheinen erst nach dem Ausführen von JavaScript. Deshalb verwendet dieses Tutorial das JavaScript-Rendering-Token von Anfang an und nicht nachträglich. Wenn Ihr Abruf eine Seite ohne Inserate zurückgibt, ist fehlendes Rendering fast immer der Grund.

Voraussetzungen

Bevor Sie Code schreiben, müssen einige Dinge vorhanden sein. Keines davon dauert lange.

Grundlegende Python-Kenntnisse. Sie sollten in der Lage sein, ein Python-Skript zu schreiben, auszuführen und Pakete mit pip zu installieren. Wenn BeautifulSoup neu für Sie ist, behandelt unsere Anleitung zur Verwendung von BeautifulSoup in Python die Parse-Grundlagen, die dieses Tutorial voraussetzt.

Python 3.8 oder höher. Bestätigen Sie Ihre Version mit python --version. Falls Sie es nicht haben, installieren Sie es von python.org oder über eine Distribution wie Anaconda.

Ein Crawlbase-Konto und ein Token. Registrieren Sie sich, öffnen Sie Ihr Dashboard und kopieren Sie Ihre Token von der Kontodokumentationsseite. Google Flights benötigt Rendering, daher verwenden Sie das JavaScript-Token statt des normalen. Sie erhalten bis zu 20.000 kostenlose Anfragen: 1.000 bei der Anmeldung und mehr, während Sie die Onboarding-Schritte abschließen. Behandeln Sie das Token wie ein Passwort: Es authentifiziert Ihre Anfragen, halten Sie es also aus der Versionskontrolle heraus.

Projekt einrichten

Erstellen Sie eine virtuelle Umgebung, damit Projektabhängigkeiten isoliert bleiben, und installieren Sie dann die Bibliotheken, die der Scraper benötigt.

bash
python --version

python -m venv google_flights_env
source google_flights_env/bin/activate

pip install crawlbase beautifulsoup4

Unter Windows aktivieren Sie die Umgebung mit google_flights_env\Scripts\activate statt der source-Zeile. Zwei Abhängigkeiten erledigen die Arbeit: crawlbase ist die offizielle Python-Bibliothek, die die Crawling API aufruft und das Rendering übernimmt, und beautifulsoup4 parst das zurückgegebene HTML, damit Sie einzelne Felder per CSS-Selektor extrahieren können.

Schritt 1: Die gerenderten Ergebnisse abrufen

Beginnen Sie damit, die fertige Seite zu holen. Importieren Sie die CrawlingAPI-Klasse, initialisieren Sie sie mit Ihrem JavaScript-Token und rufen Sie die Such-URL mit aktiviertem Rendering ab. Das Lesen des Statuscodes vor dem Parsen hält Fehler sichtbar statt still, was bei einem Ziel, das Drosselung einsetzt, sehr wichtig ist.

python
from crawlbase import CrawlingAPI

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    status = response["headers"].get("cb_status")
    if status == "200":
        return response["body"].decode("utf-8")
    print(f"Request failed: {status}")
    return None

if __name__ == "__main__":
    page_url = "https://www.google.com/travel/flights/search?tfs=CBwQAhopEgoyMDI0LTA3LTE0ag0IAxIJL20vMDFmMDhycgwIAxIIL20vMDZ5NTcaKRIKMjAyNC0wNy0yMGoMCAMSCC9tLzA2eTU3cg0IAxIJL20vMDFmMDhy&hl=en-US&curr=EUR"
    html = crawl(page_url)
    print(html[:500] if html else "No HTML returned")

Die beiden Warteoptionen sind wichtig für ein clientseitig gerendertes Ziel wie dieses. ajax_wait weist die API an, auf das Laden asynchroner Inhalte zu warten, und page_wait hält für eine feste Anzahl von Millisekunden nach dem Laden an, damit die spät rendernden Flugangebotskarten erscheinen, bevor die Seite erfasst wird. Fünf Sekunden sind ein vernünftiger Ausgangspunkt; erhöhen Sie den Wert, wenn die Flugliste kurz oder leer zurückkommt. Beachten Sie den cb_status (legacy pc_status)-Header: Das ist Crawlbase's eigener Status für die zugrunde liegende Anfrage und der Wert, dem Sie gegenüber dem äußeren HTTP-Code vertrauen sollten, wenn Sie entscheiden, ob ein Abruf erfolgreich war. Führen Sie das Skript aus und Sie sollten echtes Inserat-Markup sehen, nicht die leere Hülle, die ein einfacher Abruf zurückgibt.

Crawlbase Crawling API

Google Flights benötigt eine gerenderte Seite hinter einer vertrauenswürdigen IP, in einem einzigen Aufruf. Genau das liefert das JavaScript-Token im obigen Snippet: Die Crawling API führt die Seite in einem echten Browser aus, wartet darauf, dass die Flugangebotskarten sich befüllen, rotiert serverseitig durch residentielle IPs und übergibt Ihnen fertiges HTML, sodass Sie selbst keine Headless-Browser-Flotte und keinen Proxy-Pool betreiben müssen. Testen Sie es zuerst mit einer öffentlichen Suche im kostenlosen Kontingent.

Schritt 2: Jeden Flug mit BeautifulSoup parsen

Mit dem gerenderten HTML laden Sie es in BeautifulSoup und extrahieren jeden Flug aus seinem Listenelement. Google umschließt jeden Flug mit einem Listenelement, also finden Sie alle Elemente und lesen dann Airline, Dauer, Preis, Abflug- und Ankunftszeiten sowie Stopps aus jedem einzelnen aus. Die folgenden Selektoren stammen direkt aus dem aktuellen Layout; überprüfen Sie die aktuellen Klassennamen in den Entwicklertools Ihres Browsers (Rechtsklick, dann Untersuchen), bevor Sie einen langen Durchlauf starten.

python
from bs4 import BeautifulSoup

def text_or_none(listing, selector):
    el = listing.select_one(selector)
    return el.get_text(strip=True) if el else None

def scrape_dates(listing):
    dep = listing.select_one(
        'span.mv1WYe span:first-child [jscontroller="cNtv4b"] span')
    arr = listing.select_one(
        'span.mv1WYe span:last-child [jscontroller="cNtv4b"] span')
    departure = dep.get_text(strip=True) if dep else None
    arrival = arr.get_text(strip=True) if arr else None
    return departure, arrival

def scrape_flights(html):
    soup = BeautifulSoup(html, "html.parser")
    flights = []
    for listing in soup.select("li.pIav2d"):
        departure, arrival = scrape_dates(listing)
        flights.append({
            "airline": text_or_none(listing, "div.Ir0Voe div.sSHqwe"),
            "price": text_or_none(listing, "div.U3gSDe div.FpEdX span"),
            "departure": departure,
            "arrival": arrival,
            "duration": text_or_none(listing, "div.AdWm1c.gvkrdb"),
            "stops": text_or_none(listing, "div.EfT7Ae span.ogfYpf"),
        })
    return flights

Der Wrapper-Selektor li.pIav2d trifft jedes Fluginserat auf der Seite, und jedes Feld wird aus einem Selektor innerhalb dieses Inserats gelesen. div.Ir0Voe div.sSHqwe enthält den Fluggesellschaftsnamen, div.U3gSDe div.FpEdX span den Preis, div.AdWm1c.gvkrdb die Dauer und div.EfT7Ae span.ogfYpf den Stopps-Text (zum Beispiel "Nonstop" oder "1 stop"). Abflug- und Ankunftszeiten befinden sich in einem gemeinsamen span.mv1WYe-Block, wobei das erste Kind der Abflug und das letzte Kind die Ankunft ist, jedes in einem [jscontroller="cNtv4b"]-Span eingeschlossen. Der kleine text_or_none-Helfer bedeutet, dass ein fehlendes Feld None zurückgibt statt die Schleife zum Absturz zu bringen, was genau das ist, was Sie auf einer Seite wollen, auf der nicht jede Karte jedes Feld enthält.

Selektoren ändern sich

Googles Klassennamen wie pIav2d und sSHqwe sind verschleiert und rotieren, wenn Google sein Frontend neu deployt. Behandeln Sie die obigen Selektoren als Ausgangspunkt, nicht als Vertrag. Wenn ein Feld für jeden Flug leer zurückkommt, überprüfen Sie eine Live-Seite in den Entwicklertools Ihres Browsers und aktualisieren Sie den Selektor. Regelmäßige Selektor-Wartung ist bei jedem Produktions-Scraper normal, kein Zeichen, dass etwas kaputt ist.

Schritt 3: Zusammenführen und exportieren

Verbinden Sie nun den Abruf und das Parsen in einem lauffähigen Skript und schreiben Sie die strukturierte Ausgabe sowohl in JSON als auch CSV. JSON eignet sich für die Weiterverarbeitung; CSV kann direkt in eine Tabellenkalkulation oder ein Preismonitoring-Blatt importiert werden, das Sie von Tag zu Tag vergleichen.

python
import csv
import json
from crawlbase import CrawlingAPI
from bs4 import BeautifulSoup

api = CrawlingAPI({"token": "YOUR_CRAWLBASE_JS_TOKEN"})

def crawl(page_url):
    options = {"ajax_wait": "true", "page_wait": 5000}
    response = api.get(page_url, options)
    if response["headers"].get("cb_status") == "200":
        return response["body"].decode("utf-8")
    return None

def text_or_none(listing, selector):
    el = listing.select_one(selector)
    return el.get_text(strip=True) if el else None

def scrape_dates(listing):
    dep = listing.select_one(
        'span.mv1WYe span:first-child [jscontroller="cNtv4b"] span')
    arr = listing.select_one(
        'span.mv1WYe span:last-child [jscontroller="cNtv4b"] span')
    departure = dep.get_text(strip=True) if dep else None
    arrival = arr.get_text(strip=True) if arr else None
    return departure, arrival

def scrape_flights(html):
    soup = BeautifulSoup(html, "html.parser")
    flights = []
    for listing in soup.select("li.pIav2d"):
        departure, arrival = scrape_dates(listing)
        flights.append({
            "airline": text_or_none(listing, "div.Ir0Voe div.sSHqwe"),
            "price": text_or_none(listing, "div.U3gSDe div.FpEdX span"),
            "departure": departure,
            "arrival": arrival,
            "duration": text_or_none(listing, "div.AdWm1c.gvkrdb"),
            "stops": text_or_none(listing, "div.EfT7Ae span.ogfYpf"),
        })
    return flights

def save_json(flights, path="google_flights.json"):
    with open(path, "w", encoding="utf-8") as f:
        json.dump(flights, f, ensure_ascii=False, indent=2)

def save_csv(flights, path="google_flights.csv"):
    fields = ["airline", "price", "departure",
              "arrival", "duration", "stops"]
    with open(path, "w", newline="", encoding="utf-8") as f:
        writer = csv.DictWriter(f, fieldnames=fields)
        writer.writeheader()
        writer.writerows(flights)

def main():
    page_url = "https://www.google.com/travel/flights/search?tfs=CBwQAhopEgoyMDI0LTA3LTE0ag0IAxIJL20vMDFmMDhycgwIAxIIL20vMDZ5NTcaKRIKMjAyNC0wNy0yMGoMCAMSCC9tLzA2eTU3cg0IAxIJL20vMDFmMDhy&hl=en-US&curr=EUR"
    html = crawl(page_url)
    if not html:
        print("No HTML returned")
        return
    flights = scrape_flights(html)
    save_json(flights)
    save_csv(flights)
    print(f"Saved {len(flights)} flights")

if __name__ == "__main__":
    main()

Führen Sie das vollständige Skript mit python main.py aus. Es ruft die gerenderte Ergebnisseite für die Beispielroute ab, extrahiert für jeden Flug einen Datensatz und schreibt sowohl google_flights.json als auch google_flights.csv. Um einen Preis zu überwachen, führen Sie das Skript nach einem Zeitplan aus und hängen Sie die CSV jedes Durchlaufs an eine Verlaufsdatei an: Die Preisspalte über die Zeit ist Ihre Preiskurve. Um eine andere Route oder ein anderes Datum zu scannen, tauschen Sie den tfs-Wert und die Datumsangaben in der URL aus; der Parser verarbeitet alles, was zurückkommt.

Wie die Ausgabe aussieht

Sie erhalten eine saubere Liste von Flugdatensätzen, ein Objekt pro Inserat, bereit zum Schreiben in JSON, CSV oder eine Datenbank. Hier ist ein gekürztes JSON-Beispiel für eine Langstreckenroute:

json
[
  {
    "airline": "Cebu Pacific",
    "price": "€924",
    "departure": "10:10 PM",
    "arrival": "9:45 AM+2",
    "duration": "29 hr 35 min",
    "stops": "1 stop"
  },
  {
    "airline": "Etihad",
    "price": "€2,038",
    "departure": "10:25 PM",
    "arrival": "6:10 PM+1",
    "duration": "13 hr 45 min",
    "stops": "Nonstop"
  },
  {
    "airline": "Emirates",
    "price": "€2,215",
    "departure": "9:30 PM",
    "arrival": "5:20 PM+1",
    "duration": "13 hr 50 min",
    "stops": "Nonstop"
  }
]

Dieselben Datensätze landen in google_flights.csv mit einer Kopfzeile (airline,price,departure,arrival,duration,stops) und einer Zeile pro Flug, was die Form ist, die Sie für das Preismonitoring benötigen: Hängen Sie den Durchlauf jedes Tages an und die Preisspalte wird zu einer Zeitreihe, die Sie visualisieren oder bei der Sie Alarme bei Unterschreitung eines Schwellenwerts auslösen können.

Skalierung über Routen und Daten hinaus

Eine Route an einem Tag ist eine Demo; ein Preismonitor führt dasselbe Parsen über mehrere Routen und einen Bereich von Abflugdaten durch. Die Form bleibt dieselbe: Erstellen Sie jede Such-URL, rufen Sie sie über die Crawling API mit aktiviertem Rendering ab und parsen Sie sie mit derselben scrape_flights-Funktion. Die Gewohnheit, die einen langen Durchlauf gesund hält, ist die Dosierung der Anfragen, also pausieren Sie zwischen Anfragen statt sie in einer engen Schleife abzufeuern.

python
import time

route_urls = [
    "https://www.google.com/travel/flights/search?tfs=...&curr=EUR",
    "https://www.google.com/travel/flights/search?tfs=...&curr=USD",
]

all_flights = []
for url in route_urls:
    html = crawl(url)
    if html:
        all_flights.extend(scrape_flights(html))
    time.sleep(3)

print(f"Collected {len(all_flights)} flights across {len(route_urls)} routes")

Jede 5XX-Antwort der API ist kostenlos, sodass das Wiederholen einer blockierten oder durch Rendering-Timeout fehlgeschlagenen URL nichts kostet. Da jeder Google Flights-Abruf Rendering erfordert, verwendet jede Anfrage den JavaScript-Token-Tarif; überprüfen Sie die Preisseite, wie gerenderte Anfragen gezählt werden, bevor Sie einen Monitor skalieren. Wenn Sie Ihren eigenen Traffic lieber durch einen rotierenden Pool leiten möchten statt die verwaltete API zu nutzen, bietet der Smart AI Proxy (auch als AI Proxy bezeichnet) dieselbe residentielle IP-Rotation als Drop-in-Proxy-Endpunkt.

Blockierungen vermeiden

Selbst mit Rendering und einer vertrauenswürdigen IP überwacht Google Scraper-artigen Traffic aggressiver als die meisten Ziele. Einige Gewohnheiten halten einen Durchlauf gesund.

  • Dosieren Sie Ihre Anfragen. Suchergebnisseiten in einer engen Schleife zu bombardieren ist der schnellste Weg, herausgefordert zu werden. Verteilen Sie Anfragen und variieren Sie Ihre Routen statt eine Suche mit voller Geschwindigkeit zu durchblättern.
  • Setzen Sie auf Rotation. Ein Pool residentieller IPs verteilt Anfragen auf viele echte Nutzeradressen, sodass keine einzelne ein Limit auslöst. Die Crawling API übernimmt das für Sie; wenn Sie Ihren eigenen Stack aufbauen, ist das der Teil, den Sie richtig machen müssen.
  • Geben Sie der Seite Zeit zum Rendern. Wenn Flüge leer zurückkommen, erhöhen Sie page_wait, bevor Sie annehmen, dass die Selektoren kaputt sind. Die Karten benötigen einen Moment zum Befüllen.
  • Überprüfen Sie die Selektoren, wenn Felder leer werden. Google rotiert seine verschleierten Klassennamen. Wenn Ergebnisse nicht mehr geparst werden, öffnen Sie eine Live-Seite in den Entwicklertools und aktualisieren Sie die Selektoren.

Das breitere Playbook finden Sie unter Wie Sie Websites scrapen, ohne blockiert zu werden. Da Google Flights vollständig clientseitig gerendert wird, erklärt unser Leitfaden zum Crawlen von JavaScript-Websites, warum Rendering wichtig ist und wie man es aktiviert, und wenn Sie auch Unterkunftspreise verfolgen, verwendet Google Hotels mit Python scrapen dasselbe Muster des gerenderten Abrufs.

Ob das Scrapen von Google Flights erlaubt ist, hängt von Googles Nutzungsbedingungen, Ihrer Gerichtsbarkeit und dem ab, was Sie mit den Daten tun. Googles Bedingungen schränken den automatisierten Zugriff ein, sodass Scraping unabhängig von der Sorgfalt Ihres Vorgehens gegen diese Bedingungen verstoßen kann. Keiner der hier enthaltenen Code ändert das; er macht nur den technischen Teil funktionieren. Lesen Sie Googles Bedingungen und seine robots.txt und betrachten Sie beide als Grenze für das, was Sie erfassen.

Einige Leitlinien, an denen es sich lohnt festzuhalten. Erfassen Sie nur öffentliche Flugdaten: Fluggesellschaften, Preise, Zeiten, Dauern und Stoppanzahlen, die jeder auf einer Ergebnisseite ohne Konto sehen kann. Halten Sie Ihr Anfragevolumen niedrig genug, dass Sie Googles Server nicht belasten, und dosieren Sie Ihr Crawling statt es mit voller Geschwindigkeit zu betreiben. Dieser Leitfaden beschränkt sich bewusst auf diese öffentlichen Inserate, weil das die Linie ist, die die Arbeit vertretbar macht. Er deckt nichts hinter einem Login, Konto- oder personenbezogene Daten, Zahlungs- oder Buchungsabläufe oder Tarifinhalte ab, die Sie als Ihre eigenen weiterverteilen würden.

Es lohnt sich auch zu wissen, dass die zugrunde liegenden Tarife von Fluggesellschaften und globalen Distributionssystemen stammen und viele Fluggesellschaften offizielle Tarif-APIs oder Partnerprogramme genau für diese Art von Zugriff anbieten. Wenn Ihr Projekt garantierte, hochvolumige, weiterverteilungsfähige Tarifdaten benötigt, ist eine offizielle Datenvereinbarung der richtige Weg, kein ausgefeilterer Scraper. Verwenden Sie Scraping für die Überwachung und Recherche bei öffentlichen Inseraten und greifen Sie auf eine sanktionierte API zurück, wenn Sie darüber hinauswachsen.

Zusammenfassung

Wichtigste Erkenntnisse

  • Google Flights wird vollständig clientseitig gerendert. Ein einfacher Abruf gibt eine leere Hülle zurück, daher ist Rendering unerlässlich, nicht optional, um überhaupt Flugangebotskarten zu sehen.
  • Sie benötigen Rendering und eine vertrauenswürdige IP zusammen. Die Crawling API nimmt ein JavaScript-Token, führt die Seite in einem echten Browser aus, rotiert residentielle IPs serverseitig und gibt fertiges HTML zurück.
  • BeautifulSoup übernimmt die Extraktion. Wählen Sie jedes li.pIav2d-Inserat aus, lesen Sie dann Airline, Preis, Abflug, Ankunft, Dauer und Stopps daraus und erwarten Sie, dass die verschleierten Klassennamen sich ändern.
  • Exportieren Sie in JSON und CSV. CSV mit einer Zeile pro Flug ist die Form für das Preismonitoring: Hängen Sie jeden Durchlauf an und die Preisspalte wird zu einer Zeitreihe.
  • Bleiben Sie bei öffentlichen Daten. Respektieren Sie Googles Nutzungsbedingungen und robots.txt, halten Sie das Volumen niedrig und bevorzugen Sie für hochvolumige, weiterverteilungsfähige Tarifdaten eine offizielle Fluggesellschafts- oder GDS-API.

Häufig gestellte Fragen

Warum gibt eine einfache Anfrage bei Google Flights keine Flüge zurück?

Google Flights erstellt seine Ergebniskarten clientseitig mit JavaScript, sodass das rohe HTML, das ein einfaches requests.get herunterlädt, größtenteils eine leere Hülle ohne Flüge ist. Um die Inserate zu sehen, müssen Sie die Seite in einem echten Browser rendern. Der Abruf über die Crawling API mit dem JavaScript-Token übernimmt dieses Rendering für Sie und gibt das fertige HTML zurück, weshalb jeder Selektor in dieser Anleitung eine gerenderte Seite voraussetzt.

Kann ich Google Flights mit Python scrapen?

Ja. Mit der crawlbase-Bibliothek und BeautifulSoup können Sie eine gerenderte Ergebnisseite abrufen und Airline, Preis, Abflug- und Ankunftszeiten, Dauer und Stopps extrahieren. Die Crawling API fungiert als Brücke, die die Seite rendert und Ihre Anfrage von einer vertrauenswürdigen IP aus an Google sendet, sodass Anfragen reibungslos verarbeitet statt blockiert werden. Einen breiteren Python-Einstieg finden Sie in unserem Leitfaden zum Scrapen von Websites mit Python.

Welche Felder kann ich aus einem Google Flights-Inserat extrahieren?

Dieses Tutorial extrahiert sechs Felder aus jedem Flug: Airline, Preis, Abflugzeit, Ankunftszeit (einschließlich +1/+2-Tagesmarkierungen), Gesamtdauer und Stopps-Text wie "Nonstop" oder "1 stop". Sie können es auf andere sichtbare Felder wie Zwischenstopf-Flughäfen oder CO2-Schätzungen erweitern, indem Sie Selektoren hinzufügen. Bleiben Sie bei öffentlichen Flugdaten und vermeiden Sie alles hinter einem Login oder einem Buchungsablauf.

Benötige ich JavaScript-Rendering zum Scrapen von Google Flights?

Ja, und das ist der entscheidende Unterschied zu vielen anderen Zielen. Google Flights hat fast nichts in seinem rohen HTML; die Flugangebotskarten erscheinen erst nach der Ausführung von JavaScript. Die Crawling API bietet ein JavaScript-Rendering-Token sowie ajax_wait und page_wait-Optionen, die die Seite so abrufen, wie es ein echter Browser tun würde. Unser Leitfaden zum Crawlen von JavaScript-Websites erklärt, wann Rendering notwendig ist und wie es funktioniert.

Wie überwache ich einen Preis über die Zeit?

Führen Sie den Scraper nach einem Zeitplan für eine feste Route und ein festes Datum aus und hängen Sie die CSV-Zeile jedes Durchlaufs (mit einem Zeitstempel) an eine Verlaufsdatei an. Die Preisspalte über alle Durchläufe ist Ihre Preiskurve, die Sie visualisieren oder mit einem Alarm verknüpfen können, wenn sie unter einen Schwellenwert fällt. Halten Sie die Frequenz moderat, ein paar Überprüfungen pro Tag und Route reichen, um innerhalb der obigen Dosierungsempfehlung zu bleiben.

Meine Selektoren geben nichts zurück. Was hat sich geändert?

Fast sicher Googles Markup. Klassennamen wie pIav2d und sSHqwe sind verschleiert und rotieren, wenn Google sein Frontend neu deployt, sodass Selektoren, die letzten Monat funktionierten, kaputt gehen können. Stellen Sie zuerst sicher, dass die Seite tatsächlich gerendert wurde, indem Sie page_wait erhöhen; wenn das der Fall ist und Felder immer noch leer sind, überprüfen Sie eine Live-Ergebnisseite in den Entwicklertools Ihres Browsers und aktualisieren Sie die Selektoren. Regelmäßige Selektor-Wartung ist bei jedem Produktions-Scraper normal.

Jetzt loslegen

Crawlen Sie jede Website im großen Maßstab, ohne gegen die Infrastruktur zu kämpfen.

Crawlbase übernimmt Proxys, Fingerprints und CAPTCHAs, damit Ihr Team Datenpipelines ausliefert, statt Crawl-Infrastruktur zu pflegen. 1.000 Anfragen kostenlos, keine Karte erforderlich.

Self-Service · Kein Verkaufsgespräch erforderlich · Enterprise-Crawl-Volumen verfügbar