---
title: "Wie man Booking.com mit Python scrapt"
slug: how-to-scrape-booking
date: 2026-02-23T09:53:59+00:00
modified: 2026-02-23T09:54:01+00:00
permalink: https://brightdata.de/blog/web-data-de/how-to-scrape-booking
type: blog
---

[ Blog ](https://brightdata.de/blog "Blog") / [Web Data](https://brightdata.de/blog/web-data-de)







 [Web Data](https://brightdata.de/blog/web-data-de)

# Wie man Booking.com mit Python scrapt

Lernen Sie, einen Python-Scraper für Booking.com zu erstellen, um Hoteldaten, Bewertungen und Preise effizient zu extrahieren.

 20 min lesen





 [ ![Antonello Zanini](https://media.brightdata.de/2022/12/Antonello-Zanini-2-50x50.jpg) ](https://brightdata.com/blog/authors/antonello-zanini)

 [Antonello Zanini

Technical Writer

 ](https://brightdata.com/blog/authors/antonello-zanini)





 ![How to Scrape Booking.com With Python blog image](https://media.brightdata.de/2024/11/How-to-Scrape-Booking.com-With-Python_.svg)





In diesem Tutorial erfahren Sie:

- Die Definition eines Buchungsscrapers
- Welche Daten Sie damit extrahieren können
- Wie Sie mit Python ein Skript zum Scrapen von Booking.com erstellen

Lassen Sie uns loslegen!

## <a></a>Was ist ein Booking-Scraper?

Ein[Booking.com-Scraper](/products/web-scraper/booking) ist ein Tool zum automatischen Extrahieren von Daten aus Booking.com-Seiten. Damit können Sie Informationen aus Immobilienanzeigen abrufen, z. B. Hotelnamen, Preise, Bewertungen, Ausstattungsmerkmale und Verfügbarkeit. Diese Daten können für verschiedene Zwecke verwendet werden, darunter Marktanalysen, Preisvergleiche und die Erstellung von Datensätzen zum Thema Reisen.

## Daten, die Sie von Booking.com scrapen können

Nachfolgend finden Sie eine Liste der Datenpunkte, die Sie von Booking.com abrufen können:

- **Details zur Unterkunft**: Name des Hotels, Adresse, Entfernung zu Sehenswürdigkeiten (z. B. Stadtzentrum, Innenstadt usw.)
- **Preisinformationen**: Regulärer Preis, reduzierter Preis (falls verfügbar)
- **Bewertungen und Bewertungen**: Bewertungsergebnis, Anzahl der Bewertungen, Gästefeedback
- **Verfügbarkeit**: Verfügbare Zimmertypen, Buchungsoptionen (z. B. kostenlose Stornierung, Frühstück inbegriffen), Termine mit Verfügbarkeit
- **Medien**: Bilder der Unterkunft, Bilder der Zimmer
- **Ausstattung**: Angebotene Einrichtungen (z. B. WLAN, Parkplätze, Pool), zimmerspezifische Ausstattung
- **Sonderangebote**: Sonderangebote oder Rabatte, zeitlich begrenzte Angebote
- **Richtlinien**: Stornierungsbedingungen, Check-in- und Check-out-Zeiten
- **Zusätzliche Details**: Beschreibung der Unterkunft, Sehenswürdigkeiten in der Nähe, Anzahl der verfügbaren Zimmer für bestimmte Daten

## Booking.com in Python scrapen: Schritt-für-Schritt-Anleitung

In diesem Abschnitt erfahren Sie, wie Sie einen Booking.com-Scraper erstellen.

Das Ziel ist es, ein Python-Skript zu erstellen, das automatisch Daten von der Unterkunftsseite sammelt:

![Property listing page example](https://media.brightdata.de/2024/11/image-63.png)Befolgen Sie die folgenden Schritte!

### <a></a>Schritt 1: Projekt einrichten

Bevor Sie beginnen, stellen Sie sicher, dass Python 3 auf Ihrem Computer installiert ist. Ist dies nicht der Fall, [laden Sie es herunter](https://www.python.org/downloads/), starten Sie die ausführbare Datei und folgen Sie den Anweisungen des Installationsassistenten.

Verwenden Sie nun die folgenden Befehle, um einen Ordner für Ihr Projekt zu erstellen:

```none
mkdir booking-scraper

```

Das Verzeichnis `„booking-scraper”` ist der Projektordner Ihres Python-Skripts zum Scrapen von Booking.com.

Öffnen Sie es und initialisieren Sie darin eine [virtuelle Umgebung](https://docs.python.org/3/library/venv.html):

```none
cd booking-Scraper
python -m venv env

```

Laden Sie den Projektordner in Ihre bevorzugte Python-IDE. [Visual Studio Code mit der Python-Erweiterung](https://code.visualstudio.com/docs/languages/python) und [PyCharm Community Edition](https://www.jetbrains.com/pycharm/download/#section=windows) sind beide eine gute Wahl.

Erstellen Sie eine Datei `namens scraper.py` im Projektordner, die folgende Dateistruktur enthalten sollte:

![A scraper.py file in the project folder](https://media.brightdata.de/2024/11/image-64.png)`scraper.py` ist jetzt ein leeres Python-Skript, wird aber bald die Scraping-Logik enthalten.

Aktivieren Sie die virtuelle Umgebung im Terminal der IDE. Führen Sie dazu unter Linux oder macOS diesen Befehl aus:

```none
./env/bin/activate

```

Unter Windows führen Sie stattdessen folgenden Befehl aus:

```none
env/Scripts/activate

```

Großartig, Sie haben jetzt eine Python-Umgebung für das Web-Scraping!

### <a></a>Schritt 2: Wählen Sie die Scraping-Bibliothek aus

Nun muss festgestellt werden, ob Booking.com eine statische oder dynamische Website ist, um die entsprechende Scraping-Bibliothek auszuwählen. Dazu kann das Verhalten der Website untersucht werden. Öffnen Sie zunächst Booking.com in Ihrem Browser. Führen Sie eine Suche durch und navigieren Sie zur Seite der Unterkunft:

![search and navigate to the property page](https://media.brightdata.de/2024/11/image-65.png)Beachten Sie, dass die Seite beim Herunterscrollen dynamisch neue Daten lädt:

![New data loaded dynamically as you scroll down](https://media.brightdata.de/2024/11/image-66.png)Dieses Muster wird als *unendliches Scrollen* bezeichnet und ist ein Kennzeichen dynamischer Websites. Erfahren Sie mehr darüber, wie Sie [Web-Scraping auf dynamischen Websites durchführen können](/blog/how-tos/scrape-dynamic-websites-python).

Ohne uns mit dem HTML-Code des vom Server zurückgegebenen Dokuments zu befassen oder die Registerkarte *„Netzwerk“* in DevTools zu überprüfen (zwei gängige Schritte, um zu verstehen, ob eine Website statisch ist oder nicht), können wir bereits feststellen, dass Booking.com eine dynamische Website ist.

Der beste Ansatz zum Scraping einer Website mit dynamischen Inhalten ist die Verwendung eines [Browser-Automatisierungstools](/blog/web-data/best-headless-browsers). Mit diesen Lösungen können Sie einen Browser steuern und bestimmte Interaktionen auf der Seite ausführen, um Daten effektiv zu extrahieren.

Eines der leistungsstärksten Browser-Automatisierungstools für Python ist [Selenium](https://www.selenium.dev/), das sich hervorragend für das Scraping von Booking.com eignet. Bereiten Sie sich auf die Installation vor, da es die primäre Bibliothek für diese Aufgabe sein wird!

### <a></a>Schritt 3: Selenium installieren und konfigurieren

In Python ist Selenium über das [`Selenium`](https://pypi.org/project/selenium/) -Pip-Paket verfügbar. Installieren Sie es in einer aktivierten virtuellen Python-Umgebung mit diesem Befehl:

```none
pip install selenium

```

Anleitungen zur Verwendung des Tools finden Sie in unserem Tutorial zum [Web-Scraping mit Selenium](/blog/how-tos/using-selenium-for-web-scraping).

Importieren Sie Selenium in `scraper.py` und initialisieren Sie ein `WebDriver` -Objekt, um eine Chrome-Instanz zu steuern:

```none
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Erstellen Sie eine Chrome-Webtreiberinstanz.
driver = webdriver.Chrome(service=Service())

```

Der obige Code initialisiert eine [ `Chrome-WebDriver-Instanz`](https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.chrome.webdriver) zur Steuerung eines Chrome-Browsers. Beachten Sie, dass Booking.com offenbar eine Anti-Scraping-Technologie verwendet, die Headless-Browser blockiert. Vermeiden Sie daher die Einstellung des Flags [`--headless`](https://developer.chrome.com/docs/chromium/headless). Als alternative Lösung lesen Sie unseren Leitfaden zu [Playwright Stealth](/blog/how-tos/avoid-bot-detection-with-playwright-stealth).

Denken Sie daran, den Webtreiber als letzte Zeile Ihres Scrapers zu schließen:

```none
driver.quit()

```

Großartig! Sie sind nun vollständig konfiguriert, um mit dem Scraping von Booking.com zu beginnen.

### <a></a>Schritt 4: Besuchen Sie die Zielseite

Die Seiten von Booking.com bieten zahlreiche interaktive Funktionen, mit denen Sie Ihre Suche verfeinern können:

![interactive features to refine your search](https://media.brightdata.de/2024/11/image-67.png)All diese Interaktionen mit Selenium programmgesteuert zu simulieren, wäre komplex und zeitaufwändig. Um den Vorgang zu vereinfachen und zu beschleunigen, führen Sie die Interaktionen zunächst manuell in Ihrem Browser durch.

Wenn Sie eine Suchanfrage konfiguriert haben, kopieren Sie die URL der resultierenden Seite aus der Adressleiste Ihres Browsers.

Die obige URL steht beispielsweise für eine Suche nach Apartments in New York vom 18. November bis zum 18. Dezember für zwei Erwachsene.

Kopieren Sie die URL und geben Sie sie in die von Selenium angebotene [`get()`](https://selenium-python.readthedocs.io/api.html#selenium.webdriver.remote.webdriver.WebDriver.get) -Methode ein:

```none
driver.get("https://www.booking.com/searchresults.html?ss=New+York&ssne=New+York&ssne_untouched=New+York&label=gen173nr-1FCAEoggI46AdIM1gEaHGIAQGYATG4ARfIAQzYAQHoAQH4AQKIAgGoAgO4Aof767kGwAIB0gIkNGE2MTI1MjgtZjJlNC00YWM4LWFlMmQtOGIxZjM3NWIyNDlm2AIF4AIB&sid=b91524e727f20006ae00489afb379d3a&aid=304142&lang=en-us&sb=1&src_elem=sb&src=index&dest_id=20088325&dest_type=city&checkin=2024-11-18&checkout=2024-12-18&group_adults=2&no_rooms=1&group_children=0")

```

Ihr Scraping-Skript stellt automatisch eine Verbindung zur gewünschten Booking.com-Seite her.

Die Datei `scraper.py` enthält nun folgende Codezeilen:

```none
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# Chrome-Webtreiberinstanz erstellen
driver = webdriver.Chrome(service=Service())

# Verbindung zur Zielseite herstellen
driver.get("https://www.booking.com/searchresults.html?ss=New+York&ssne=New+York&ssne_untouched=New+York&label=gen173nr-1FCAEoggI46AdIM1gEaHGIAQGYATG4ARfIAQzYAQHoAQH4AQKIAgGoAgO4Aof767kGwAIB0gIkNGE2MTI1MjgtZjJlNC00YWM4LWFlMmQtOGIxZjM3NWIyNDlm2AIF4AIB&sid=b91524e727f20006ae00489afb379d3a&aid=304142&lang=en-us&sb=1&src_elem=sb&src=index&dest_id=20088325&dest_type=city&checkin=2024-11-18&checkout=2024-12-18&group_adults=2&no_rooms=1&group_children=0")

# Scraping-Logik...

# Schließen Sie den Webtreiber und geben Sie seine Ressourcen frei.
driver.quit()

```

Setzen Sie einen Debugging-Haltepunkt in die letzte Zeile und führen Sie das Skript aus. Unten sehen Sie, was Sie sehen sollten:

![Example of what you should see after you run the script](https://media.brightdata.de/2024/11/image-68.png)Die Meldung „Chrome wird von einer automatisierten Testsoftware gesteuert“ bestätigt, dass Selenium wie gewünscht in Chrome funktioniert. Gut gemacht!

### <a></a>Schritt 5: Umgang mit der Anmeldeaufforderung

Wenn Sie Booking.com zum ersten Mal in einem Browser besuchen, zeigt die Website oft innerhalb der ersten 20 Sekunden eine Anmeldeaufforderung an. Diese blockiert den Zugriff auf den Inhalt der Seite und erschwert das Web-Scraping:

![a sign-in alert within the first 20 seconds](https://media.brightdata.de/2024/11/image-69.png)Solange Sie nicht darauf reagieren, können Sie nicht auf die Inhalte der zugrunde liegenden Seite zugreifen.

Um die Warnmeldung zu schließen, verwenden Sie Selenium. Klicken Sie mit der rechten Maustaste auf die Schaltfläche „Schließen“ und wählen Sie im Kontextmenü die Option „Untersuchen“:

![Right-click on the close button](https://media.brightdata.de/2024/11/image-70.png)Beachten Sie, dass Sie das Modalfenster schließen können, indem Sie die Schaltfläche mit dem folgenden CSS-Selektor auswählen:

```none
[role="dialog"] button[aria-label="Anmeldeinformationen schließen."]

```

Weisen Sie Selenium nun an, bis zu 10 Sekunden zu warten, bis die Warnmeldung erscheint. Sobald sie angezeigt wird, schließen Sie sie, indem Sie auf die Schaltfläche „Dismiss“ (Schließen) klicken. Da das Modal möglicherweise nicht immer angezeigt wird, ist es sinnvoll, diese Logik in einen [`try...except-Block`](https://docs.python.org/3/tutorial/errors.html) einzubinden:

```none
try:
    # bis zu 20 Sekunden warten, bis die Anmelde-Warnmeldung erscheint
    close_button = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "[role="dialog"] button[aria-label="Anmeldeinformationen schließen."]"))
    )
    # auf die Schaltfläche „Schließen” klicken
    close_button.click()
except TimeoutException:
    print("Anmeldemodal wurde nicht angezeigt, Fortsetzung...")

```

[`WebDriverWait`](https://selenium-python.readthedocs.io/waits.html#explicit-waits) ist eine spezielle Selenium-Klasse, die das Skript pausiert, bis eine bestimmte Bedingung auf der Seite erfüllt ist. Im obigen Beispiel wartet es bis zu 10 Sekunden, bis die Schaltfläche zum Schließen der Warnmeldung auf der Seite erscheint.

Wenn die Warnmeldung nicht angezeigt wird, löst Selenium die Ausnahme `„TimeoutException“` aus. Importieren Sie sie zusammen mit `WebDriverWait`, `EC` und `By` wie folgt:

```none
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

```

Großartig! Die Anmelde-Warnmeldung ist nun kein Problem mehr.

### Schritt 6: Wählen Sie die Booking.com-Elemente aus

Beachten Sie, dass die zu scrapend Seite von Booking.com mehrere Elemente enthält. Da Sie alle Elemente scrapen möchten, initialisieren Sie ein Array, in dem die gescrapend Daten gespeichert werden sollen:

```none
items = []

```

Nun müssen Sie verstehen, wie Sie die mit diesen Elementen verbundenen HTML-Elemente auswählen können. Öffnen Sie Booking.com in Ihrem Browser, führen Sie eine Suche durch und überprüfen Sie eines der Immobilienelemente:

![Open Booking.com in your browser, perform a search, and inspect one of the property items](https://media.brightdata.de/2024/11/image-71.png)Beachten Sie, dass die Klassen der HTML-Elemente zufällig generiert zu sein scheinen. Das bedeutet, dass sie sich wahrscheinlich bei jeder Website-Bereitstellung ändern, was sie für die Elementauswahl unzuverlässig macht. Konzentrieren Sie sich stattdessen auf stabilere Attribute wie `data-testid`.

`data-*` -Attribute eignen sich hervorragend für das Web-Scraping.

Verwenden Sie die Selenium-Methode [`find_elements()`](https://selenium-python.readthedocs.io/locating-elements.html), um einen CSS-Selektor auf die Seite anzuwenden und die gewünschten Elemente auszuwählen:

```none
property_items = driver.find_elements(By.CSS_SELECTOR, "[data-testid="property-card"]")

```

Durchlaufen Sie die Property-Elemente und bereiten Sie Ihren Booking.com-Scraper vor, um einige Daten zu extrahieren:

```none
for property_item in property_items:
    # Scraping-Logik...

```

Großartig! Der nächste Schritt besteht darin, Daten aus diesen Elementen zu scrapen.

### Schritt 7: Scrapen der Booking.com-Elemente

Sehen Sie sich die Property-Elemente auf der Seite an und beachten Sie, dass die darin enthaltenen Elemente uneinheitlich sind:

![the property items on the page](https://media.brightdata.de/2024/11/image-72.png)Einige haben eine Bewertungsnote, andere nicht. Einige haben einen reduzierten Preis, andere nicht.

Diese Unterschiede erschweren es, eine einheitliche Scraping-Logik für alle Immobilienobjekte zu schreiben. Wenn Sie versuchen, ein Element auszuwählen, das nicht auf der Seite vorhanden ist, löst Selenium eine `NoSuchElementException` aus. Daher ist es sinnvoll, eine Funktion zu definieren, die dieses Szenario behandelt:

```none
def handle_no_such_element_exception(data_extraction_task):
    try:
        return data_extraction_task()
    except NoSuchElementException as e:
        return None

```

Die obige Funktion akzeptiert eine Lambda-Funktion und versucht, diese auszuführen. Wenn sie eine `NoSuchElementException` auslöst, fängt sie die Ausnahme ab und gibt `None` zurück. Dadurch kann Ihr Booking.com-Scraping-Skript ohne Unterbrechung fortgesetzt werden.

Importieren Sie `NoSuchElementException`:

```none
from selenium.common import NoSuchElementException

```

Überprüfen Sie ein Element, das alle Elemente enthält (Bewertung, reduzierter Preis usw.):

![Inspecting a property item](https://media.brightdata.de/2024/11/image-73.png)Beachten Sie, dass Sie Folgendes extrahieren können:

- Den Link zur Unterkunft aus `a[data-testid="property-card-desktop-single-image"]`
- Das Immobilienbild aus `img[data-testid=image]`

Wenden Sie in der `for-` Schleife die aktuelle Logik an, um diese Elemente auszuwählen und Daten daraus zu extrahieren:

```none
url = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "a[data-testid="property-card-desktop-single-image"]").get_attribute("href"))
image = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "img[data-testid="image"]").get_attribute("src"))

```

`find_element()` wählt einen einzelnen Knoten auf der Seite aus, während `get_attribute()` den Inhalt innerhalb des angegebenen HTML-Attributs abruft. Beachten Sie, dass die Anweisungen zur Datenextraktion von `handle_no_such_element_exception` umschlossen sind, um `NoSuchElementExceptions`zu behandeln.

Konzentrieren Sie sich ebenfalls auf die Informationen im Titelbereich und direkt darunter:

![focus on the information in the title section and below it](https://media.brightdata.de/2024/11/image-74.png)Hier erhalten Sie:

- Die Eigenschaft „title” aus `[data-testid="title"]`
- Die Eigenschaft „address” aus `[data-testid="address"]`
- Die Eigenschaft „distance” aus `[data-testid="distance"]`

Kopieren Sie alle mit:

```none
title = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="title"]").text)
address = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="address"]").text)
distance = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="distance"]").text)

```

Das `Textattribut` enthält den Text innerhalb der ausgewählten Elemente.

Als Nächstes konzentrieren Sie sich auf den Knoten „Bewertung“:

![review score node](https://media.brightdata.de/2024/11/image-75.png)Wählen Sie ihn mit `data-testid="review-score"` aus und extrahieren Sie seinen Text. Beachten Sie, dass der Text ein spezielles Format hat, wie in diesem Beispiel:

```none
„Bewertung 8,4n8,4nSehr gutn120 Bewertungen”

```

Mit einer benutzerdefinierten Logik können Sie die Bewertungsnote und die Anzahl der Bewertungen daraus extrahieren:

```none
review_score = None
review_count = None
review_text = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="review-score"]").text)
if review_text is not None:
  # split the review string by n
  parts = review_text.split("n")

  # jeden Teil verarbeiten
  for part in parts:
      part = part.strip()
      # prüfen, ob dieser Teil eine Zahl ist (mögliche Bewertungsnote)
      if part.replace(".", "", 1).isdigit():
          review_score = float(part)
      # Überprüfen, ob er die Zeichenfolge „reviews” enthält
      elif „reviews” in Teil:
          # Die Zahl vor „reviews” extrahieren
          review_count = int(Teil.split(„ ”)[0].replace(„,”, „”))

```

Das Beschreibungselement anvisieren:

![The description element](https://media.brightdata.de/2024/11/image-76.png)Wählen Sie es mit `data-testid="recommended-units"` aus und extrahieren Sie die Beschreibung:

```none
description = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="recommended-units"]").text)

```

Konzentrieren Sie sich zuletzt auf die Preis-Elemente:

![The price element](https://media.brightdata.de/2024/11/image-77.png)Wählen Sie aus dem Element `data-testid="availability-rate-information"` Folgendes aus:

- Den ursprünglichen Preis aus dem Knoten, der das Attribut `aria-hidden="true"` hat und nicht über das Attribut `data-testid` verfügt
- Den reduzierten/aktuellen Preis aus `data-testid="price-and-discounted-price"`

Schreiben Sie die Logik zur Preisextraktion wie folgt:

```none
price_element = handle_no_such_element_exception(lambda: (property_item.find_element(By.CSS_SELECTOR, "[data-testid="availability-rate-information"]")))
if price_element is not None:
    original_price = handle_no_such_element_exception(lambda: (
        price_element.find_element(By.CSS_SELECTOR, "[aria-hidden="true"]:not([data-testid])").text.replace(",", "")
    ))
    price = handle_no_such_element_exception(lambda: (
        price_element.find_element(By.CSS_SELECTOR, "[data-testid="price-and-discounted-price"]").text.replace(",", "")
    ))

```

Wow! Die Scraping-Logik für Booking.com ist fast fertig.

### <a></a>Schritt 7: Sammeln Sie die gescrapten Daten

Die gescrapten Daten sind nun über mehrere Variablen innerhalb der `for-Schleife` verteilt. Erstellen Sie ein neues `Elementobjekt`, füllen Sie es mit diesen Daten und hängen Sie es an das Array `„items”` an:

```none
item = {
  "url": url,
  "image": image,
  "title": title,
  "address": address,
  "distance": distance,
  "review_score": review_score,
  "review_count": review_count,
  "description": description,
  "original_price": original_price,
  "price": price
}
items.append(item)

```

Am Ende der `for-` Schleife enthält `items` alle Ihre Scraping-Daten. Überprüfen Sie dies, indem Sie `items` ausgeben `:`

```none
print(items)

```

Dies erzeugt folgende Ausgabe:

```none
[{'url': 'https://www.booking.com/hotel/us/murray-hill-east-manhattan.html?label=gen173nr-1FCAEoggI46AdIM1gEaHGIAQGYATG4ARfIAQzYAQHoAQH4AQKIAgGoAgO4Aof767kGwAIB0gIkNGE2MTI1MjgtZjJlNC00YWM4LWFlMmQtOGIxZjM3NWIyNDlm2AIF4AIB&sid=b91524e727f20006ae00489afb379d3a&aid=304142&ucfs=1&arphpl=1&checkin=2024-11-18&checkout=2024-12-18&dest_id=20088325&dest_type=city&group_adults=2&req_adults=2&no_rooms=1&group_children=0&req_children=0&hpos=1&hapos=1&sr_order=popularity&srpvid=c6926559ebaa0862&srepoch=1731939905&all_sr_blocks=5604802_204869446_2_0_0&highlighted_blocks=5604802_204869446_2_0_0&matching_block_id=5604802_204869446_2_0_0&sr_pri_blocks=5604802_204869446_2_0_0__523000&from=searchresults', 'image': 'https://cf.bstatic.com/xdata/images/hotel/square600/84564452.webp?k=ff50b7387e08e01ba7a400effa788e668f894cabe4a295f60d6cd018ec9ac4d0&o=', 'title': 'Murray Hill East Suites', 'address': 'Murray Hill, New York', 'distance': '1,3 Meilen von der Innenstadt entfernt', 'review_score': 8,2, 'review_count': 54, 'description': 'StudionGesamtes Studio • 1 Badezimmer • 1 Küche • 398 ft²nMehrere Bettentypen', 'original_price': Keine, 'price': '5230 $'},
# der Kürze halber ausgelassen...
, {'url': 'https://www.booking.com/hotel/us/renaissance-times-square.html?label=gen173nr-1FCAEoggI46AdIM1gEaHGIAQGYATG4ARfIAQzYAQHoAQH4AQKIAgGoAgO4Aof767kGwAIB0gIkNGE2MTI1MjgtZjJlNC00YWM4LWFlMmQtOGIxZjM3NWIyNDlm2AIF4AIB&sid=b91524e727f20006ae00489afb379d3a&aid=304142&ucfs=1&arphpl=1&checkin=2024-11-18&checkout=2024-12-18&dest_id=20088325&dest_type=city&group_adults=2&req_adults=2&no_rooms=1&group_children=0&req_children=0&hpos=12&hapos=12&sr_order=popularity&srpvid=c6926559ebaa0862&srepoch=1731939905&all_sr_blocks=2315604_274565698_0_2_0&highlighted_blocks=2315604_274565698_0_2_0&matching_block_id=2315604_274565698_0_2_0&sr_pri_blocks=2315604_274565698_0_2_0__1805400&from_sustainable_property_sr=1&from=searchresults', 'image': 'https://cf.bstatic.com/xdata/images/hotel/square600/437371642.webp?k=d1a06036e365573e326e6b0f1b045f8f43b6ad0d18e119cfb92d92cc81fa5c88&o=', 'title': 'Renaissance New York Times Square by Marriott', 'address': 'Manhattan, New York', 'distance': '0,6 Meilen vom Stadtzentrum entfernt', 'review_score': 8,4, 'review_count': 2209, 'description': 'King Roomn1 Kingsize-Bett', 'original_price': '20060 $', 'price': '18054 $'}]

```

Fantastisch! Jetzt müssen Sie diese Informationen nur noch in eine für Menschen lesbare Datei wie CSV exportieren.

### <a></a>Schritt 8: In CSV exportieren

Importieren Sie das [`CSV`](https://docs.python.org/3/library/csv.html) -Paket aus der Python-Standardbibliothek:

```none
import csv

```

Verwenden Sie es dann, um `Elemente` in eine CSV-Datei zu exportieren:

```none
# Geben Sie den Namen der CSV-Ausgabedatei an.
output_file = "properties.csv"

# Exportieren Sie die Elementliste in eine CSV-Datei.
with open(output_file, mode="w", newline="", encoding="utf-8") as file:
    # CSV-Writer-Objekt erstellen
    writer = csv.DictWriter(file, fieldnames=["url", "image", "title", "address", "distance", "review_score", "review_count", "description", "original_price", "price"])

    # Header-Zeile schreiben
    writer.writeheader()

    # Jedes Element als Zeile in die CSV-Datei schreiben
    writer.writerows(items)

```

Dieser Ausschnitt füllt eine CSV-Datei namens `properties.csv` mit Daten aus den `Element-Arrays`. Die wichtigsten oben verwendeten Funktionen sind:

- [`open()`](https://docs.python.org/3/library/functions.html#open): Öffnet die angegebene Datei im Schreibmodus mit UTF-8-Kodierung.
- [`csv.DictWriter()`](https://docs.python.org/3/library/csv.html#csv.DictWriter): Erstellt einen CSV-Writer mit den angegebenen Feldnamen.
- `writeheader()`: Schreibt die Kopfzeile basierend auf den angegebenen Feldnamen in die CSV-Datei.
- `writer.writerow()`: Schreibt jedes Wörterbuchelement als Zeile in die CSV-Datei.

### <a></a>Schritt 9: Alles zusammenfügen

`scraper.py` sollte nun folgende Zeilen enthalten:

```none
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.common import NoSuchElementException

import csv

def handle_no_such_element_exception(data_extraction_task):
    try:
        return data_extraction_task()
    except NoSuchElementException as e:
        return None

# Chrome-Webtreiberinstanz erstellen
driver = webdriver.Chrome(service=Service())

# Verbindung zur Zielseite herstellen
driver.get("https://www.booking.com/searchresults.html?ss=New+York&ssne=New+York&ssne_untouched=New+York&label=gen173nr-1FCAEoggI46AdIM1gEaHGIAQGYATG4ARfIAQzYAQHoAQH4AQKIAgGoAgO4Aof767kGwAIB0gIkNGE2MTI1MjgtZjJlNC00YWM4LWFlMmQtOGIxZjM3NWIyNDlm2AIF4AIB&sid=b91524e727f20006ae00489afb379d3a&aid=304142&lang=en-us&sb=1&src_elem=sb&src=index&dest_id=20088325&dest_type=city&checkin=2024-11-18&checkout=2024-12-18&group_adults=2&no_rooms=1&group_children=0")

# Anmeldebenachrichtigung verarbeiten
try:
    # bis zu 20 Sekunden warten, bis die Anmeldeaufforderung erscheint
    close_button = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "[role="dialog"] button[aria-label="Anmeldeinformationen schließen."]"))
    )
    # Klicken Sie auf die Schaltfläche „Schließen“
    close_button.click()
except e:
    print("Anmeldemodal wurde nicht angezeigt, Fortsetzung...")

# wo die gescrapten Daten gespeichert werden sollen
items = []

# alle Immobilienobjekte auf der Seite auswählen
property_items = driver.find_elements(By.CSS_SELECTOR, "[data-testid="property-card"]")

# die Immobilienobjekte durchlaufen und
# Daten daraus extrahieren
for property_item in property_items:
    # Scraping-Logik...
    url = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "a[data-testid="property-card-desktop-single-image"]").get_attribute("href"))
    image = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "img[data-testid="image"]").get_attribute("src"))

    title = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="title"]").text)
    address = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="address"]").text)
    distance = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="distance"]").text)

    review_score = None
    review_count = None
    review_text = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="review-score"]").text)
    if review_text is not None:
      # split the review string by n
      parts = review_text.split("n")

      # jeden Teil verarbeiten
      for part in parts:
          part = part.strip()
          # prüfen, ob dieser Teil eine Zahl ist (mögliche Bewertungszahl)
          if part.replace(".", "", 1).isdigit():
              review_score = float(part)
          # prüfen, ob er die Zeichenfolge „reviews” enthält
          elif „reviews” in part:
              # extrahiere die Zahl vor „reviews”
              review_count = int(part.split(" ")[0].replace(",", ""))

    decription = handle_no_such_element_exception(lambda: property_item.find_element(By.CSS_SELECTOR, "[data-testid="recommended-units"]").text)

    price_element = handle_no_such_element_exception(lambda: (property_item.find_element(By.CSS_SELECTOR, "[data-testid="availability-rate-information"]")))
    if price_element is not None:
        original_price = handle_no_such_element_exception(lambda: (
            price_element.find_element(By.CSS_SELECTOR, "[aria-hidden="true"]:not([data-testid])").text.replace(",", "")
        ))
        price = handle_no_such_element_exception(lambda: (
            price_element.find_element(By.CSS_SELECTOR, "[data-testid="price-and-discounted-price"]").text.replace(",", "")
        ))

    # neues Element mit den gescrapten Daten füllen
    item = {
      "url": url,
      "image": image,
      "title": title,
      "address": address,
      "distance": distance,
      "review_score": review_score,
      "review_count": review_count,
      "decription": decription,
      "original_price": original_price,
      "price": price
    }
    # Füge den neuen Eintrag zur Liste der gescrapten Einträge hinzu.
    items.append(item)

# Namen der CSV-Ausgabedatei angeben
output_file = "properties.csv"

# Elementliste in CSV-Datei exportieren
with open(output_file, mode="w", newline="", encoding="utf-8") as file:
    # CSV-Writer-Objekt erstellen
    writer = csv.DictWriter(file, fieldnames=["url", "image", "title", "address", "distance", "review_score", "review_count", "decription", "original_price", "price"])

    # Header-Zeile schreiben
    writer.writeheader()

    # Jedes Element als Zeile in die CSV-Datei schreiben
    writer.writerows(items)

# Webtreiber schließen und Ressourcen freigeben
driver.quit()

```

Kaum zu glauben, oder? Mit nur etwa 110 Zeilen haben Sie gerade einen Python-Scraper für Booking.com erstellt.

Überprüfen Sie, ob er funktioniert, indem Sie das Scraping-Skript ausführen. Unter Windows führen Sie den Scraper mit folgendem Befehl aus:

```none
python Scraper.py

```

Unter Linux oder macOS führen Sie stattdessen Folgendes aus:

```none
python3 Scraper.py

```

Warten Sie, bis das Skript vollständig ausgeführt wurde. Im Stammverzeichnis Ihres Projekts wird eine Datei `namens „properties.csv“` angezeigt. Öffnen Sie die Datei, um die extrahierten Daten anzuzeigen:

![A properties.csv file with all the extracted data](https://media.brightdata.de/2024/11/image-78.png)Herzlichen Glückwunsch, Mission erfüllt!

## <a></a>Fazit

In diesem Tutorial haben Sie gelernt, was ein Booking.com-Scraper ist und wie man einen solchen mit Python erstellt. Wie gezeigt, sind nur wenige Zeilen Code erforderlich, um ein einfaches Skript zum automatischen Abrufen von Daten von Booking.com zu erstellen.

Das hier vorgestellte Beispiel geht jedoch nicht auf viele der Herausforderungen ein, denen Sie beim Scraping von Booking.com begegnen können. Probleme wie Anti-Headless-Browser-Maßnahmen, die Verarbeitung von Benutzerinteraktionen zur Generierung von Suchergebnissen und der Umgang mit unendlichem Scrollen können Ihre Scraping-Vorgänge schnell komplizieren.

Suchen Sie nach einer einfacheren, voll ausgestatteten und leistungsstarken Scraper-Lösung? Probieren Sie [die Booking Scraper API von Bright Data](/products/web-scraper/booking) aus!

Die Booking Scraper API bietet leistungsstarke Endpunkte zum Scrapen öffentlicher Hoteldaten, Bewertungen, Rezensionen und mehr. Mit einfachen API-Aufrufen können Sie Daten im JSON- oder HTML-Format abrufen.

Bevorzugen Sie vorgefertigte Lösungen? Bright Data bietet auch [gebrauchsfertige Booking.com-Datensätze](/products/datasets/booking) an!

Erstellen Sie noch heute ein kostenloses Bright Data-Konto, um unsere Scraper-APIs auszuprobieren oder unsere Datensätze zu erkunden.



Vertrieb kontaktierenGratis testen![google social icon](/wp-content/themes/brightdata/assets/images/ic_google.svg)









 Inhaltsverzeichnis







Booking Scraper

Easily scrape Booking with our Booking Scraper API or No-Code Scraper.

Start free trial

Booking Dataset

Skip scraping, purchase a Booking dataset.

Get dataset







 [ ](https://news.ycombinator.com/submitlink?t=Wie+man+Booking.com+mit+Python+scrapt&u=https://brightdata.de/blog/web-data-de/how-to-scrape-booking) [ ](https://www.linkedin.com/shareArticle?mini=true&title=Wie+man+Booking.com+mit+Python+scrapt&url=https://brightdata.de/blog/web-data-de/how-to-scrape-booking) [ ](http://www.reddit.com/submit?title=Wie+man+Booking.com+mit+Python+scrapt&url=https://brightdata.de/blog/web-data-de/how-to-scrape-booking)







##  Das könnte Sie auch interessieren

 [ ![OpenHuman with Bright Data](https://media.brightdata.de/2026/09/OpenHuman-with-Bright-Data.png) ](https://brightdata.de/blog/ai/openhuman-with-bright-data "Produktionsreifer Web-Zugriff in OpenHuman über die Bright Data CLI")

 [AI



 ![Antonello Zanini](https://media.brightdata.de/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Produktionsreifer Web-Zugriff in OpenHuman über die Bright Data CLI

Integrieren Sie die Bright Data CLI mit OpenHuman, um produktionsreifen Web-Zugriff und Datenerhebung für KI-Agenten zu ermöglichen.



 09-Sep-2026

 12 min lesen

 ](https://brightdata.de/blog/ai/openhuman-with-bright-data)

 [ ![Multimodal Web Scraping with MiniMax](https://media.brightdata.de/2026/09/Multimodal-Web-Scraping-with-MiniMax.png) ](https://brightdata.de/blog/web-data-de/multimodal-web-scraping-with-minimax "Multimodales Web-Scraping mit MiniMax")

 [Web Data



 ![Antonello Zanini](https://media.brightdata.de/2022/12/Antonello-Zanini-2-50x50.jpg)

Antonello Zanini

Technical Writer





### Multimodales Web-Scraping mit MiniMax

Kombinieren Sie Bright Data Web Unlocker mit MiniMax M3 Vision, um strukturierte Daten aus Bildern und Webseiten-Screenshots zu extrahieren.



 09-Sep-2026

 4 min lesen

 ](https://brightdata.de/blog/web-data-de/multimodal-web-scraping-with-minimax)

 [ ![The 10 Best CLI Tools for Codex in 2026](https://media.brightdata.de/2026/08/The-10-Best-CLI-Tools-for-Codex-in-2026.png) ](https://brightdata.de/blog/ai/best-cli-tools-for-codex "Die 10 besten CLI-Tools für Codex im Jahr 2026 – Getestet & Bewertet")

 [AI



 ![Daniel Shashko](https://media.brightdata.de/2022/04/Daniel-Shashko-2-50x50.png)

Daniel Shashko

Web Data &amp; AI Expert





### Die 10 besten CLI-Tools für Codex im Jahr 2026 – Getestet &amp; Bewertet

Die 10 CLI-Tools, die Codex schneller und leistungsfähiger machen, beginnend mit dem Bright Data CLI für echten Web-Zugriff aus der Sandbox heraus.



 06-Sep-2026

 20 min lesen

 ](https://brightdata.de/blog/ai/best-cli-tools-for-codex)
