Anleitung zum Scraping von Google-Flugdaten mit Python

Bemerkungen: 0

Wenn es um Reiseplanung, Wettbewerbsanalyse oder Forschungszwecke geht, kann das Scrapen von flugbezogenen Informationen aus Google Flights wichtige Erkenntnisse liefern. Hier finden Sie eine Schritt-für-Schritt-Anleitung zum Scrapen von Fluginformationen mit Python, Playwright und lxml-Bibliotheken.

Einrichten der Umgebung

Bevor Sie mit dem Scraping beginnen, sollten Sie sicherstellen, dass Sie die notwendigen Python-Bibliotheken installiert haben:

pip install playwright
Pip install lxml

Um Playwright zu verwenden, müssen Sie auch die Browser-Binärdateien installieren:

playwright install chromium

Schrittweises Scraping-Verfahren

Wir konzentrieren uns auf das Extrahieren von Flugdaten aus der Suchergebnisseite von Google Flights.

Schritt 1. Verstehen der Struktur der Website

Um Daten von Google Flights effektiv abzurufen, müssen Sie sich mit der HTML-Struktur der Website vertraut machen. Hier erfahren Sie, wie Sie Chrome DevTools verwenden können, um Elemente zu untersuchen und die erforderlichen XPath-Ausdrücke für das Scrapen abzurufen:

  1. Öffnen Sie Chrome DevTools, indem Sie mit der rechten Maustaste auf die Google Flights-Seite klicken und "Inspizieren" auswählen oder den Shortcut Strg+Umschalt+I (Windows/Linux) bzw. Cmd+Option+I (Mac) verwenden.
  2. Untersuchen Sie Elemente, indem Sie mit dem Mauszeiger über verschiedene Teile der Seite fahren. Dadurch wird die HTML-Struktur in den DevTools hervorgehoben. Klicken Sie auf die einzelnen Elemente, um ihre Attribute anzuzeigen, die für die Erstellung genauer XPath-Ausdrücke entscheidend sind.
  3. Rufen Sie XPath-Ausdrücke ab, indem Sie mit der rechten Maustaste auf das gewünschte Element im Elemente-Bedienfeld klicken, "Kopieren" auswählen und dann "XPath kopieren" wählen. Dadurch wird der XPath-Ausdruck direkt in die Zwischenablage kopiert und kann in Ihrem Scraping-Skript verwendet werden.

Liste der verwendeten XPath-Ausdrücke:

From Location: //input[@aria-label="Where from?"]/@value
To Location: //input[@aria-label="Where to?"]/@value
Departure Date: //input[@placeholder="Departure"]/@value
Return Date: //input[@placeholder="Return"]/@value

Hinweis: Dieser XPath liefert mehrere Elemente, die jeweils einem einzelnen Flug entsprechen.

Flight Elements: //li[@class="pIav2d"]
Airway: .//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()
Details: .//span[@class="mv1WYe"]/@aria-label
Departure Time: .//span[@aria-describedby="gEvJbfc1583"]/span/text()
Arrival Time: .//span[@aria-describedby="gEvJbfc1584"]/span/text()
Travel Time: .//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()
Price: .//div[@class="YMlIz FpEdX"]/span/text()

Schritt 2. Senden von HTTP-Anfragen und Extrahieren von Seiteninhalten mit Playwright

Wir verwenden Playwright, um mit der Webseite zu interagieren und ihren Inhalt zu extrahieren. Dieser Ansatz hilft bei der Handhabung dynamischer Inhalte, die von JavaScript geladen werden können.

Die Verwendung von Playwright erleichtert den Umgang mit dynamischen Inhalten, die von JavaScript geladen werden. Es startet einen Headless-Browser, navigiert zur URL und extrahiert den Seiteninhalt.

from playwright.sync_api import sync_playwright

# URL für die Suchseite von Google Flights
url = "https link"

def get_page_content(url):
    """Holt den HTML-Inhalt der angegebenen URL mit Playwright."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=True)  # Browser im Headless-Modus starten
        context = browser.new_context()  # Erstellen Sie einen neuen Browser-Kontext
        page = context.new_page()  # Eine neue Seite öffnen
        page.goto(url)  # Zur angegebenen URL navigieren
        content = page.content()  # Abrufen des Seiteninhalts
        browser.close()  # Schließen Sie den Browser
    return content

# Abrufen des Seiteninhalts
page_content = get_page_content(url)

Schritt 3. Gemeinsame Details mit XPath extrahieren

Als Nächstes wird der HTML-Inhalt der Antwort mithilfe von lxml geparst, um allgemeine Flugdetails wie Abflug- und Rückflugdatum zu extrahieren.

from lxml import html

# Erstellen des Parsers
tree = html.fromstring(page_content)

# Extrahieren allgemeiner Flugdaten mit XPath
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]  # Abrufen des 'von'-Ortes
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]  # Abrufen des "bis"-Ortes
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]  # Das Abreisedatum abfragen
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]  # Abfrage des Rückgabedatums

Schritt 4. Extrahieren spezifischer Flugdaten mit lxml

Anschließend wird der HTML-Inhalt geparst, um spezifische Fluginformationen auf der Grundlage der identifizierten XPath-Ausdrücke zu extrahieren.

# Initialisieren einer leeren Liste zum Speichern von Flugdaten
flights = []

# Extrahieren von Flugelementen aus dem geparsten HTML mit XPath
flight_elements = tree.xpath('//li[@class="pIav2d"]')

# Schleife durch jedes Flugelement und Extraktion von Details
for flight in flight_elements:
    # Extrahieren Sie den Namen der Fluggesellschaft
    airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
    
    # Extrahieren von Flugdetails wie Zwischenlandungen
    details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
    
    # Extrahieren Sie die Abfahrtszeit
    departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
    
    # Extrahieren Sie die Ankunftszeit
    arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
    
    # Extrahieren Sie die Gesamtreisezeit
    travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
    
    # Extrahieren Sie den Preis des Fluges
    price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()

    # Anhängen der extrahierten Details an die Flugliste in Form eines Wörterbuchs
    flights.append({
        'Airway': airway,
        'Details': details,
        'Departure': departure,
        'Arrival': arrival,
        'Travel Time': travel_time,
        'Price': price,
        'From': from_location,
        'To': to_location,
        'Departure Date': departure_date,
        'Return Date': return_date
    })

Schritt 5. Speichern der Daten in CSV

Abschließend verwenden wir das in Python integrierte CSV-Modul, um die extrahierten Daten für die weitere Analyse in einer CSV-Datei zu speichern.

import csv

# CSV-Dateipfad definieren
csv_file = 'google_flights.csv'

# CSV-Feldnamen definieren
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# Daten in eine CSV-Datei schreiben
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()
    for flight in flights:
        writer.writerow(flight)

print(f"Data saved to {csv_file}")

Alles zusammenfügen

from playwright.sync_api import sync_playwright
from lxml import html
import csv

# URL für die Suchseite von Google Flights
url = "https link"

def get_page_content(url):
    """Holt den HTML-Inhalt der angegebenen URL mit Playwright."""
    with sync_playwright() as p:
        browser = p.chromium.launch(headless=False)  # Browser im Headful-Modus starten
        context = browser.new_context()  # Erstellen Sie einen neuen Browser-Kontext
        page = context.new_page()  # Eine neue Seite öffnen
        page.goto(url)  # Zur angegebenen URL navigieren
        page.wait_for_timeout(10000)  # Warten Sie 10 Sekunden, um sicherzustellen, dass die Seite vollständig geladen wird.
        content = page.content()  # Abrufen des Seiteninhalts
        browser.close()  # Schließen Sie den Browser
    return content

# Abrufen des Seiteninhalts
page_content = get_page_content(url)

# Parsen des HTML-Inhalts mit lxml
tree = html.fromstring(page_content)

# Extrahieren von Details zur Flugsuche
from_location = tree.xpath('//input[@aria-label="Where from?"]/@value')[0]
to_location = tree.xpath('//input[@aria-label="Where to?"]/@value')[0]
departure_date = tree.xpath('//input[@placeholder="Departure"]/@value')[0]
return_date = tree.xpath('//input[@placeholder="Return"]/@value')[0]

# Initialisieren einer Liste zum Speichern von Flugdaten
flights = []

# Extrahieren von Flugelementen aus dem geparsten HTML
flight_elements = tree.xpath('//li[@class="pIav2d"]')
for flight in flight_elements:
    airway = flight.xpath('.//div[@class="sSHqwe tPgKwe ogfYpf"]/span/text()')[0].strip()
    details = flight.xpath('.//span[@class="mv1WYe"]/@aria-label')[0]
    departure = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[0].strip()
    arrival = flight.xpath('.//span[@jscontroller="cNtv4b"]/span/text()')[1].strip()
    travel_time = flight.xpath('.//div[@class="gvkrdb AdWm1c tPgKwe ogfYpf"]/text()')[0].strip()
    price = flight.xpath('.//div[@class="U3gSDe"]/div/div[2]/span/text()')[0].strip()

    # Flugdaten an die Liste anhängen
    flights.append({
        'Airway': airway,
        'Details': details,
        'Departure': departure,
        'Arrival': arrival,
        'Travel Time': travel_time,
        'Price': price,
        'From': from_location,
        'To': to_location,
        'Departure Date': departure_date,
        'Return Date': return_date
    })

# Definieren Sie den Pfad zur CSV-Datei
csv_file = 'google_flights.csv'

# CSV-Feldnamen definieren
fieldnames = ['Airway', 'Details', 'Departure', 'Arrival', 'Travel Time', 'Price', 'From', 'To', 'Departure Date', 'Return Date']

# Schreiben der extrahierten Flugdaten in eine CSV-Datei
with open(csv_file, mode='w', newline='', encoding='utf-8') as file:
    writer = csv.DictWriter(file, fieldnames=fieldnames)
    writer.writeheader()  # Schreiben Sie die Kopfzeile
    for flight in flights:
        writer.writerow(flight)  # Schreiben Sie die Details zu jedem Flug

print(f"Data saved to {csv_file}")

Um das Risiko einer Entdeckung beim Scraping von Daten zu verringern, ist es ratsam, Verzögerungen zwischen den Anfragen einzubauen und Proxys zu verwenden. Durch die Implementierung von Verzögerungen wird die menschliche Interaktion nachgeahmt, wodurch es für Websites schwieriger wird, automatisierte Scraping-Aktivitäten zu erkennen. Für die Auswahl des Proxys werden dynamische Proxys empfohlen, da sie ein hohes Maß an Vertrauen bieten und aufgrund ihrer dynamischen Natur weniger wahrscheinlich blockiert werden. Alternativ können Sie einen Pool von statischen ISP-Proxys verwenden, die eine stabile und schnelle Verbindung bieten und die Zuverlässigkeit Ihres Datenextraktionsprozesses erhöhen. Diese Strategien helfen dabei, die Schutzmaßnahmen zu umgehen, die Websites zur Identifizierung und Blockierung von Scraping-Bots einsetzen.

Bemerkungen:

0 Bemerkungen