Airbnb verwaltet über 8 Millionen aktive Inserate in mehr als 220 Ländern – und stellt für Marktdaten keine öffentliche API bereit. Wer Preis-Intelligence, Wettbewerbs-Benchmarks oder Forschungsdatensätze braucht, kommt am Scraping praktisch nicht vorbei.
Der Haken daran: Airbnb zählt zu den anspruchsvollsten Websites, die das moderne Web zu bieten hat. Die Seite betreibt einen eigenen WAF, gestützt auf Akamai Bot Manager, rendert alles clientseitig mit React und tauscht CSS-Klassennamen so oft aus, als würde jemand pausenlos die Schlösser wechseln. Ich habe viele Stunden damit zugebracht, unterschiedliche Ansätze fürs Airbnb-Scraping auszuprobieren – von schlanken HTTP-Bibliotheken über vollständige Browserautomatisierung bis hin zu No-Code-KI-Tools – und das Fazit lautet: Keine einzelne Methode passt für jeden Anwendungsfall.
Dieser Leitfaden führt dich durch alle fünf praktikablen Ansätze, mit echtem Code, ehrlichen Abwägungen und konkreten Tipps, damit deine IP nicht dauerhaft gesperrt wird. Egal ob Python-Entwickler, Datenanalyst oder Immobilieninvestor, der einfach nur eine Tabelle möchte – hier wirst du fündig.
Warum Airbnb scrapen? Praxisnahe Anwendungsfälle
Niemand scrapt Airbnb zum Vergnügen am Parsen von verschachteltem HTML. Dahinter stehen konkrete Projekte und Geschäftsziele – hier die sechs häufigsten:
| Anwendungsfall | Was du scrapest | Wer das macht |
|---|---|---|
| Dynamische Preisstrategie | Nächtliche Wettbewerberpreise innerhalb eines bestimmten Radius | Hosts, Immobilienverwalter |
| Investitionsanalyse | Auslastungsindikatoren (Bewertungsfrequenz, Kalenderverfügbarkeit), ADR, RevPAR | Immobilieninvestoren |
| Benchmarking von Reinigungsgebühren | Reinigungsgebühren über verschiedene Immobilientypen hinweg (Durchschnittsspanne von $81–$335 in großen US-Städten) | Hosts, Pricing-Berater |
| Sentiment-Analyse von Bewertungen | Gästebewertungen für NLP-/Sentiment-Bewertung | Datenwissenschaftler, Hospitality-Teams |
| Akademische Forschung | Datensätze auf Marktebene für Wohnungspolitik, Tourismus, Stadtökonomie | Forschende (48,7 % von 1.021 wissenschaftlichen Arbeiten zu Airbnb nutzten gescrapte Daten) |
| Wettbewerbsbeobachtung | Neue Inserate, Preisänderungen, Verfügbarkeit im Zeitverlauf | STR-Betreiber, Marktanalysten |
Für laufende Anwendungsfälle wie Preisüberwachung oder Wettbewerbsbeobachtung zahlt sich geplantes oder automatisiertes Scraping besonders aus – du willst aktuelle Daten, keinen einmaligen Schnappschuss.
Der Markt für Kurzzeitvermietungen wächst schneller als das klassische Hotelgeschäft: Die STR-Nachfrage stieg 2025 um 6,0 %, während die Hotelnachfrage um 0,3 % zurückging. Wer in diesem Feld unterwegs ist, verschafft sich mit Daten einen Vorteil.
Warum Airbnb so schwierig zu scrapen ist
Bevor du die erste Zeile Code schreibst, lohnt es sich zu verstehen, warum Airbnb bei der Scraping-Schwierigkeit 4 von 5 Punkten (schwierig) bekommt. Drei Probleme greifen hier ineinander.
Airbnbs Anti-Bot-Abwehr
Airbnb kombiniert einen eigenen WAF mit Akamai Bot Manager, einem Bot-Erkennungssystem für Unternehmen, das jede Anfrage gleichzeitig über mehrere Dimensionen bewertet. Das geht weit über Rate Limiting hinaus – das ist KI-gestütztes Fingerprinting.

Die Erkennungsmechanismen, nach Risikoniveau sortiert:
- TLS-Fingerprinting (HOCH): Die
requests-Bibliothek von Python hinterlässt einen einzigartigen TLS-Handshake-Fingerprint, der zu keinem echten Browser passt. Akamai wertet Cipher Suites, Erweiterungen und die ALPN-Reihenfolge mit JA3-/JA4-Methoden aus. Standard-requestskommt auf geschützten Seiten nur auf etwa 12 % Erfolgsquote, während Bibliotheken, die Browser-TLS-Fingerprints nachahmen, 92 % erreichen. - JavaScript-Ausführung (HOCH): Akamai lädt clientseitige Skripte, die „Sensordaten“ sammeln – Geräteparameter, Hardware-Fähigkeiten, Betriebssystemdetails. Daraus entsteht das
_abck-Cookie. Wird dieses JavaScript nicht ausgeführt, blockiert Airbnb die Anfrage. - Browser-Fingerprinting (HOCH): Canvas-, WebGL- und Schriftartenanalyse decken Automatisierungstools auf. Headless-Browser verraten sich über
navigator.webdriver, fehlende Plugins und unstimmige Hardwarewerte. - HTTP-Header-Analyse (HOCH): Fehlende
Sec-Fetch-*-Header sind eine häufige, klar belegbare Ursache für 403-Blocks auf Airbnb. - IP-Reputation (MITTEL): Rechenzentrums-IPs werden sofort geblockt. Ab einer gewissen Größenordnung sind Residential Proxies Pflicht.
- Verhaltensanalyse (MITTEL): Zu gleichmäßige Timing-Muster, keine Mausbewegung, kein Scrollen – das sind eindeutige Verräter.
Wirst du blockiert, siehst du: 403 Forbidden (Fingerprint-Fehler), 429 Too Many Requests (Rate-Limit), 503 Service Unavailable (Akamai-Challenge-Seite) oder eine CAPTCHA-Seite.
Dynamische, stark JavaScript-basierte Seiten bei Airbnb
Ein simples requests.get() auf Airbnb liefert nur eine React-Hülle mit Platzhalter-HTML – keine eigentlichen Inseratsdaten. Wie ein Entwickler es ausdrückte: „Einfache HTTP-Anfragen funktionieren schlicht nicht, und ohne passende Proxys und echtes JavaScript-Rendering scrapst du nicht Airbnb, sondern Platzhalter.“
Die tatsächlichen Daten kommen clientseitig über interne GraphQL-API-Aufrufe (/api/v3/StaysSearch für Suchergebnisse, /api/v3/PdpPlatformSections für Inseratsdetails). Für die meisten brauchbaren Daten brauchst du daher entweder einen vollständigen Browser oder API-Intercepting.
Das DOM ändert sich ständig
Airbnb setzt CSS-in-JS mit gehashten Klassennamen ein, die sich mit jedem Deployment ändern. Dokumentierte Beispiele sind _tyxjp1, lxq01kf, atm_mk_h2mmj6, t1jojoys und _8s3ctt. Wie Automatio (2025) erklärt: „Diese Klassen sind nicht dazu gedacht, stabil zu sein, und können sich jederzeit ändern, oft ohne sichtbare Änderungen an der Seite.“
Die Entwickler-Community hat diesen Frust ausführlich festgehalten. ScrapingBee merkt an, dass „CSS-Klassen sich ständig ändern, und sich darauf zu verlassen, ist der schnellste Weg, deinen Scraper zu zerstören.“ Ein erfahrener Entwickler in der DEV Community fasste es treffend zusammen: „Ein Scraper, der 50 % langsamer ist, aber nie kaputtgeht, ist unendlich wertvoller als ein schneller, der wöchentlich stirbt.“
Branchen-Schätzungen gehen davon aus, dass 10–15 % der Crawler inzwischen wöchentliche Fixes brauchen – wegen DOM-Verschiebungen, Fingerprinting-Updates oder gedrosselter Endpunkte.
Wähle deinen Ansatz: 5 Wege, Airbnb zu scrapen
Bevor es an den Code geht, hier der Überblick. Jeder Ansatz hat reale Stärken und Schwächen – die eine, universell „beste“ Methode gibt es nicht.
| Ansatz | Einrichtungsaufwand | Geschwindigkeit | Robustheit gegen Bots | Wartung | Am besten geeignet für |
|---|---|---|---|---|---|
Reines HTTP (requests / pyairbnb) | Gering | Schnell | Mittel (anfällig für API-Änderungen) | Mittel | Schnelle Recherche, kleine Datensätze |
| Browser-Automatisierung (Selenium) | Hoch | Langsam | Mittel | Hoch (DOM-Brüche) | Dynamische Inhalte, preisabhängig von Datum |
| Browser-Automatisierung (Playwright) | Mittel | Mittel | Mittel bis hoch | Mittel | Moderne Alternative zu Selenium |
| Scraping-API (ScrapingBee, Bright Data) | Gering | Schnell | Hoch (Proxy-Rotation integriert) | Gering | Scraping in großem Umfang, Produktionseinsatz |
| No-Code (Thunderbit) | Minimal | Schnell | Hoch (KI passt sich Layout-Änderungen an) | Keine | Nicht-Entwickler, einmalige Analysen |
Der Rest des Artikels führt dich Schritt für Schritt durch die Python-Ansätze; am Ende folgt ein No-Code-Abschnitt für alle, die den Code lieber ganz überspringen.
Schritt für Schritt: Airbnb mit Python und Requests scrapen (HTTP-first)
Das ist der schlanke, schnelle Einstieg – kein Browser, keine Chromedriver-Probleme. Der Kompromiss: Es deckt einige Daten ab, aber nicht alle.
Python-Umgebung einrichten
Lege einen Projektordner an und richte eine virtuelle Umgebung ein:
mkdir airbnb-scraper && cd airbnb-scraper
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install requests beautifulsoup4 pandas pyairbnb
pyairbnb ist eine schlanke Bibliothek (126 GitHub-Sterne, zuletzt veröffentlicht im Februar 2026), die Airbnbs interne StaysSearch-GraphQL-API abfängt. Sie parst überhaupt kein HTML, was sie unempfindlich gegenüber Änderungen an CSS-Klassen macht. Das Ein-Personen-Maintainer-Modell ist ein Risiko, aber die Bibliothek wird aktiv gepflegt.
Option A: pyairbnb für schnelle Suchergebnisse nutzen
Der schnellste Weg zu strukturierten Airbnb-Daten:
import pyairbnb
import pandas as pd
# Nach Ort und Datum suchen
results = pyairbnb.search_all(
query="Austin, TX",
checkin="2025-08-01",
checkout="2025-08-03",
adults=2,
currency="USD"
)
# In DataFrame umwandeln
df = pd.DataFrame(results)
print(df[['name', 'price', 'rating', 'reviewsCount', 'url']].head())
df.to_csv("airbnb_austin.csv", index=False)
pyairbnb unterstützt außerdem get_details(), get_price(), get_reviews(), get_calendar() und get_listings_from_user(). Alle Funktionen akzeptieren einen Proxy-URL-Parameter für die Rotation.
Option B: Manuelle HTTP-Anfragen mit BeautifulSoup
Wenn du nicht von einer Drittanbieter-Bibliothek abhängen willst, kannst du Anfragen direkt verschicken. Achtung: Reines requests wird wegen TLS-Fingerprinting schnell geblockt. Mit curl_cffi (das Browser-TLS-Fingerprints imitiert) steigt die Erfolgsquote deutlich.
from curl_cffi import requests as cffi_requests
from bs4 import BeautifulSoup
import json
url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Accept-Language": "en-US,en;q=0.9",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
}
response = cffi_requests.get(url, headers=headers, impersonate="chrome131")
soup = BeautifulSoup(response.text, "html.parser")
Daten aus Schema.org-Mikrodaten extrahieren
Airbnb bettet schema.org-Mikrodaten direkt ins HTML ein – und diese semantischen Tags sind stabiler als CSS-Klassenselektoren. Halte nach Containern mit itemprop="itemListElement" Ausschau:
listings = soup.find_all("div", itemprop="itemListElement")
data = []
for listing in listings:
name_tag = listing.find("meta", itemprop="name")
url_tag = listing.find("meta", itemprop="url")
position_tag = listing.find("meta", itemprop="position")
data.append({
"name": name_tag["content"] if name_tag else None,
"url": url_tag["content"] if url_tag else None,
"position": position_tag["content"] if position_tag else None,
})
df = pd.DataFrame(data)
df.to_csv("airbnb_listings.csv", index=False)
Der Haken: schema.org-Tags liefern Inseratsnamen, URLs und Positionen – aber keine Preise, Bewertungen oder Annehmlichkeiten. Für umfangreichere Daten brauchst du Browserautomatisierung oder API-Intercepting.
Schritt für Schritt: Airbnb mit Python und Selenium oder Playwright scrapen
Wenn du dynamische Inhalte brauchst – Preise abhängig vom Datum, Annehmlichkeiten hinter „Mehr anzeigen“-Buttons, vollständige Bewertungstexte – ist Browserautomatisierung das passende Werkzeug.
Wann du Browserautomatisierung einsetzen solltest
- Seiten, die eine Datumsauswahl verlangen, um echte Preise anzuzeigen
- Annehmlichkeiten und Bewertungen, die hinter interaktiven Elementen liegen
- Alle Daten, die erst nach JavaScript-Ausführung laden
- Wenn du mit der Seite interagieren musst (scrollen, klicken)
Selenium vs. Playwright: Playwright hat sich durchgesetzt (meistens)
Playwright hat Selenium als Standard für Browserautomatisierung abgelöst. Es ist schneller, bringt Async-Unterstützung von Haus aus mit, installiert Browser-Binaries automatisch und kommt mit modernen Web-Apps besser klar. Seleniums hartnäckiges ChromeDriver-Version-Mismatch-Problem – bei dem ChromeDriver den Chrome-Updates hinterherhinkt – bleibt ein ständiger Störfaktor.
Trotzdem hat Selenium das größere Ökosystem an Tutorials und StackOverflow-Antworten – nimm also das, womit du dich wohler fühlst.
Playwright einrichten
pip install playwright playwright-stealth
playwright install chromium
Zu Airbnb navigieren und Inserate extrahieren
import asyncio
from playwright.async_api import async_playwright
from playwright_stealth import stealth_async
import json
async def scrape_airbnb():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False) # headless=True ist riskanter
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
)
page = await context.new_page()
await stealth_async(page)
url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
await page.goto(url, wait_until="networkidle")
# Auf Karten mit Inseraten warten, mittels data-testid (stabiler als Klassen)
await page.wait_for_selector('[data-testid="card-container"]', timeout=15000)
# Inseratsdaten extrahieren
listings = await page.query_selector_all('[data-testid="card-container"]')
results = []
for listing in listings:
title_el = await listing.query_selector('[data-testid="listing-card-title"]')
subtitle_el = await listing.query_selector('[data-testid="listing-card-subtitle"]')
title = await title_el.inner_text() if title_el else None
subtitle = await subtitle_el.inner_text() if subtitle_el else None
results.append({"title": title, "subtitle": subtitle})
await browser.close()
return results
data = asyncio.run(scrape_airbnb())
Die GraphQL-API abfangen (die zuverlässigste DIY-Methode)
Statt DOM-Elemente zu parsen, die laufend kaputtgehen, kannst du Airbnbs interne API-Aufrufe abfangen. Das liefert sauberes, strukturiertes JSON:
api_responses = []
async def handle_response(response):
if "StaysSearch" in response.url:
try:
data = await response.json()
api_responses.append(data)
except:
pass
page.on("response", handle_response)
await page.goto(url, wait_until="networkidle")
# API-Antwort parsen
if api_responses:
search_results = api_responses[0]["data"]["presentation"]["staysSearch"]["results"]["searchResults"]
for result in search_results:
listing = result.get("listing", {})
pricing = result.get("pricingQuote", {})
print(f"{listing.get('name')} — {pricing.get('price', {}).get('total')}")
Die StaysSearch-Antwort enthält id, name, roomTypeCategory, bedrooms, bathrooms, personCapacity, avgRating, reviewsCount, isSuperhost sowie vollständige Preisaufschlüsselungen. Es sind dieselben Daten, mit denen Airbnbs Frontend die Seite aufbaut.
Pagination handhaben
Airbnb zeigt ungefähr 18 Inserate pro Seite und nutzt den URL-Parameter items_offset. Das Maximum liegt bei etwa 17 Seiten (~300 Inserate pro Suche).
import time
import random
base_url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
all_results = []
for page_num in range(17): # Max. ~17 Seiten
offset = page_num * 18
paginated_url = f"{base_url}&items_offset={offset}"
# ... wie oben navigieren und scrapen ...
time.sleep(random.uniform(3, 7)) # Zufällige Pause zwischen den Seiten
So scrapst du Airbnb-Preise mit Python (das Problem mit datumsabhängigen Preisen lösen)
Diesen Abschnitt überspringen die meisten Tutorials – dabei ist er für die Preisanalyse der entscheidende.
Warum Airbnb-Preise ohne Daten nicht angezeigt werden
In rund 90 % der Fälle verlangt Airbnb Check-in-/Check-out-Daten, bevor es einen echten Preis anzeigt. Ohne Daten bekommst du nur eine grobe Spanne für den „Preis pro Nacht“ (manchmal gar keinen Preis). Wie ScrapingBee anmerkt: „Wenn ein Inserat keinen Preis anzeigt (zum Beispiel, wenn Airbnb möchte, dass du Daten oder Gästezahl anpasst), gibt die Funktion einfach None zurück.“
Eine gute Nachricht: Seit April 2025 zeigt Airbnb standardmäßig den Gesamtpreis (inklusive aller Gebühren vor Steuern) für alle Gäste weltweit an. Zuvor gab es die Option „Gesamtpreis anzeigen“ – fast 17 Millionen Gäste nutzten sie, bevor sie zum Standard wurde.
Daten über URL-Parameter übergeben
Hänge an deine Such-URL immer checkin und checkout an:
https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2
Dann liefert Airbnb echte Nacht- und Gesamtpreise sowohl in der Seite als auch in den API-Antworten.
Datumsbereiche für die Preisanalyse durchlaufen
Für Hosts und Investoren, die Preisdaten über mehrere Saisons hinweg benötigen:
from datetime import datetime, timedelta
start_date = datetime(2025, 7, 1)
end_date = datetime(2025, 12, 31)
stay_length = 2 # Nächte
current = start_date
date_ranges = []
while current + timedelta(days=stay_length) <= end_date:
checkin = current.strftime("%Y-%m-%d")
checkout = (current + timedelta(days=stay_length)).strftime("%Y-%m-%d")
date_ranges.append((checkin, checkout))
current += timedelta(days=7) # Wöchentliche Intervalle
for checkin, checkout in date_ranges:
url = f"https://www.airbnb.com/s/Austin--TX/homes?checkin={checkin}&checkout={checkout}&adults=2"
# ... Preisdaten scrapen ...
time.sleep(random.uniform(5, 10)) # Rücksichtsvoll bei der Taktung
Beim Parsen der Preise aus der GraphQL-API-Antwort hältst du dich am pricingQuote-Objekt fest. Es enthält price.total, price.priceItems (einzelne Positionen wie Reinigungsgebühr, Servicegebühr) und rate.amount (Nachtpreis).
So überlebt dein Python-Airbnb-Scraper Website-Redesigns
Den Wartungsabschnitt schreibt niemand gern – dabei ist er bei jedem Airbnb-Scraping-Projekt wahrscheinlich der wichtigste Teil.
Fragile vs. robuste Selektoren
| Selektor-Strategie | Bruchrisiko | Codeaufwand | Beispiel |
|---|---|---|---|
CSS-Klassennamen (z. B. .t1jojoys) | 🔴 Hoch — ändert sich häufig | Gering | soup.select('.t1jojoys') |
data-testid-Attribute | 🟡 Mittel — stabiler | Gering | soup.select('[data-testid="listing-card-title"]') |
| Schema.org-Mikrodaten in HTML | 🟢 Niedrig — struktureller Standard | Mittel | soup.find("meta", itemprop="name") |
| GraphQL-API-Intercepting | 🟢 Niedrig — strukturiertes JSON | Mittel | response.json()["data"]["presentation"] |
| KI-basierte Extraktion (Thunderbit) | 🟢 Keine — passt sich automatisch an | Keine | 2-Klick-UI, kein Code |
data-testid-Attribute verwenden
Zu den aktuell dokumentierten data-testid-Werten auf Airbnb zählen card-container, listing-card-title, listing-card-subtitle und listing-card-name. Sie hängen an Airbnbs internem Test-Framework, nicht an der visuellen Gestaltung, und ändern sich daher seltener als CSS-Klassen. Ganz ausgeschlossen ist eine Änderung trotzdem nicht – nur eben seltener.
# Robuster als Selektoren auf Klassenbasis
title = await page.query_selector('[data-testid="listing-card-title"]')
Schema.org-Mikrodaten verwenden
Airbnb setzt itemprop-Attribute direkt im HTML-Markup ein. Sie folgen Webstandards und ändern sich weit seltener als visuelle CSS-Klassen:
# Alle Inserats-Elemente per schema.org-Markup extrahieren
listings = soup.find_all("div", itemprop="itemListElement")
for listing in listings:
name = listing.find("meta", itemprop="name")["content"]
url = listing.find("meta", itemprop="url")["content"]
Die GraphQL-API abfangen
Der zuverlässigste DIY-Ansatz. Airbnbs interne API liefert sauberes JSON, das fürs Frontend strukturiert ist. Das Antwortformat wechselt seltener als das DOM, weil auch das Frontend-Team darauf angewiesen ist.
Warum KI-basierte Extraktion Wartung komplett eliminiert
Selbst die besten Selektorstrategien gehen irgendwann kaputt. data-testid-Werte werden umbenannt, API-Antwortstrukturen versioniert. Der einzige Ansatz, der Wartung tatsächlich überflüssig macht, liest die Seite bei jedem Lauf frisch mit KI – ganz ohne fest verdrahtete Selektoren. Mehr dazu im Thunderbit-Abschnitt weiter unten.
So vermeidest du Blocks beim Airbnb-Scraping
Praxisnahe Tipps aus Erfahrung und Community-Konsens.
Proxys rotieren (Residential ist Pflicht)
Datacenter-IPs blockiert Airbnb sofort. Ab jeder relevanten Größenordnung führt an Residential Proxies kein Weg vorbei. Die stärksten Anbieter mit Blick auf Preis und Leistung:
| Anbieter | Preis (pro GB) | Erfolgsquote | Hinweise |
|---|---|---|---|
| Decodo (früher Smartproxy) | ca. $2,20/GB bei 100 GB | 99,68 % | Schnellste gemessene Antwort (0,54 s) |
| Bright Data | ca. $5,04/GB bei 100 GB | 99 %+ | Größter Pool, die meisten Funktionen |
| Oxylabs | ca. $4/GB bei 100 GB | 99 %+ | Stark für E-Commerce |
Eine wichtige Erkenntnis zur Rotation, von einem erfahrenen Entwickler: „Bei jeder Anfrage die IP zu rotieren ist eigentlich ein Warnsignal. Echte Nutzer behalten für eine Session dieselbe IP.“ Empfohlen werden Sticky Sessions von 5–10 Minuten, mit Rotation alle 20–30 Anfragen.
proxies = {
"http": "http://user:pass@residential-proxy:port",
"https": "http://user:pass@residential-proxy:port",
}
response = cffi_requests.get(url, headers=headers, proxies=proxies, impersonate="chrome131")
Deine Anfragen drosseln
Community-Konsens zu sicheren Grenzen:
- Max. Seiten pro Stunde: ≤100 (~1,6/Min.)
- Pause zwischen Anfragen: 3–10 Sekunden (zufällig, idealerweise mit Gauß-Verteilung)
- Session-Pausen: Alle 20 Anfragen eine Pause von 30–60 Sekunden
- Optimales Scraping-Zeitfenster: Nebenzeiten (~2 Uhr morgens Ortszeit)
- Bei 429-Fehlern: Exponentielles Backoff mit Jitter
import random
import time
delay = random.gauss(5, 1.5) # Mittelwert 5 Sekunden, Standardabweichung 1,5
delay = max(2, min(delay, 10)) # Auf 2–10 Sekunden begrenzen
time.sleep(delay)
Vollständige, konsistente Header verwenden
Fehlende Sec-Fetch-*-Header sind eine häufige, klar belegbare Ursache für 403-Blocks. Jeder Header muss in sich stimmig sein – behauptet dein User-Agent Chrome 131 unter Windows, müssen alle anderen Header zu dieser Identität passen.
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language": "en-US,en;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Site": "none",
"Sec-Fetch-User": "?1",
"Sec-CH-UA": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
"Sec-CH-UA-Platform": '"Windows"',
}
Headless-Browser mit Vorsicht verwenden
Bei Playwright patcht das Paket playwright-stealth etwa 17 Umgehungsmodule (navigator.webdriver, Plugins, Sprachen, WebGL). Moderne Anti-Bot-Systeme prüfen jedoch mehr als 40 Eigenschaften, während nur rund 12 gepatcht werden. Der Nicht-Headless-Modus (headless=False) ist sicherer, aber langsamer.
Bei Selenium patcht undetected-chromedriver das ChromeDriver-Binary, um Automatisierungsindikatoren zu entfernen, doch der Headless-Modus bleibt instabil.
Für große Mengen eine Scraping-API in Betracht ziehen
Wenn du Tausende Seiten scrapen willst, übernimmt eine Scraping-API Proxy-Rotation, CAPTCHA-Lösung und JavaScript-Rendering für dich. In einem AIMultiple-Benchmark mit 250 Airbnb-URLs erreichte Bright Data 99 % Erfolgsquote mit 48 Feldern pro Inserat. Der Nachteil sind die Kosten – der Stealth-Proxy-Modus von ScrapingBee schlägt mit 75 Credits pro Anfrage zu Buche, sodass ein Tarif für 49 $/Monat (ca. 45 €/Monat) nur etwa 3.333 Stealth-Anfragen ermöglicht.
Airbnb ohne Python scrapen: Die No-Code-Alternative mit Thunderbit
Nicht jeder, der Airbnb scrapt, ist Entwickler. Hosts wollen Preisvergleiche. Investoren wollen Marktdaten. Analysten wollen eine Tabelle. Wenn du die Python-Abschnitte gelesen und gedacht hast: „Das ist mehr Wartung, als ich mir vorgenommen habe“, dann ist dieser Abschnitt für dich.
Wie Thunderbit Airbnb in wenigen Klicks scrapt
Thunderbit ist ein KI-Web-Scraper, der als Chrome-Erweiterung läuft. Der Ablauf:
- Erweiterung installieren aus dem Chrome Web Store
- Zu einer Airbnb-Suchergebnisseite navigieren – Daten in die URL einfügen, damit die Preise stimmen (z. B.
?checkin=2025-08-01&checkout=2025-08-03) - Auf „KI-Felder vorschlagen“ klicken – Thunderbit scannt die Seite und erkennt automatisch Spalten wie Inseratsname, Preis, Bewertung, Standort und URL
- Auf „Scrapen“ klicken – die Daten landen in einer strukturierten Tabelle
- „Unterseiten scrapen“ verwenden, um jede Inseratsdetailseite zu besuchen und Annehmlichkeiten, Bewertungen, Host-Infos und vollständige Preisaufschlüsselungen herauszuholen – ganz ohne weitere Konfiguration
- Exportieren nach Google Sheets, Excel, Airtable oder Notion
Die Unterseiten-Funktion ist hier besonders wertvoll. Bei den Python-Ansätzen bedeutet das Scrapen von Detailseiten, dass du eigene Parsing-Logik schreibst, die Pagination innerhalb der Bewertungen handhabst und parallele Anfragen verwaltest. Mit Thunderbit ist es ein Klick.
Warum Thunderbit die drei größten Airbnb-Scraping-Probleme löst
Die drei oben beschriebenen Probleme – Anti-Bot-Abwehr, JavaScript-Rendering und DOM-Brüche – sind genau das, was Python-Scraper so wartungsintensiv macht. Thunderbit nimmt sich aller drei an:
- Keine IP-Blockierungsprobleme: Der Cloud-Scraping-Modus von Thunderbit übernimmt die Proxy-Rotation intern
- Keine Selektor-Brüche: Die KI liest die Seite bei jedem Lauf frisch – keine CSS-Selektoren zum Pflegen, kein Code-Update bei Airbnb-Redesigns
- Keine Einrichtungsprobleme: Keine Selenium-Driver, keine Python-Umgebung, keine Abhängigkeitskonflikte
- Geplantes Scraping: Beschreibe das Zeitintervall in natürlicher Sprache für laufende Preisüberwachung – ideal für dynamische Preisgestaltung und Wettbewerbsbeobachtung
Wann Python und wann Thunderbit?
Das ist kein Entweder-oder – es hängt davon ab, was du brauchst:
| Bedarf | Python | Thunderbit |
|---|---|---|
| Vollständige Kontrolle über die Scraping-Logik | ✅ Ja | ❌ Nein |
| Funktioniert ohne Programmierkenntnisse | ❌ Nein | ✅ Ja |
| Verarbeitet DOM-Änderungen automatisch | ❌ Nein | ✅ Ja (KI-basiert) |
| Unterseiten-Scraping (Detailseiten) | Komplexes Setup | 1 Klick |
| Geplantes/wiederkehrendes Scraping | Eigener Cron-Job | Integrierter Planer |
| Export nach Sheets/Excel/Airtable | Manueller Code | Integriert |
| Integration in Datenpipelines | ✅ Ja | Eingeschränkt |
| Kosten bei großem Umfang (10.000+ Seiten) | Server- + Proxy-Kosten | Thunderbit-Preise |
Brauchst du Kontrolle auf Code-Ebene, eigene Logik oder die Anbindung an eine bestehende Datenpipeline, nimm Python. Brauchst du die Daten schnell und ohne Wartungsaufwand, ist Thunderbit die pragmatische Wahl.
Rechtliche und ethische Hinweise zum Airbnb-Scraping
Kurz und praxisnah – ich bin kein Anwalt, und das ist keine Rechtsberatung.
Was das Gesetz grob sagt:
- Das Urteil hiQ Labs v. LinkedIn stellte fest, dass das Scrapen öffentlich zugänglicher Daten von Websites ohne Authentifizierung nicht gegen den CFAA verstößt
- Meta v. Bright Data (Januar 2024): Ein Richter entschied, dass Nutzungsbedingungen Scraper im ausgeloggten Zustand nicht binden
- Der Fall Reddit v. Perplexity AI (2025) bringt eine neue Theorie ins Spiel, wonach das Umgehen von CAPTCHAs und Rate Limits gegen DMCA-Anti-Umgehungsregelungen verstoßen könnte – das ist noch ungetestet, aber im Blick zu behalten
Was Airbnb sagt: Die Nutzungsbedingungen verbieten automatisierte Datenerfassung ausdrücklich. Verklagt hat Airbnb einen Scraper bislang allerdings nie öffentlich. Inside Airbnb ist seit über 11 Jahren ohne rechtliche Schritte aktiv, obwohl Airbnb es als „Müll“ abtut.
Praktische Leitlinien:
- Nur öffentlich verfügbare Daten scrapen (Login-Schranken nicht umgehen)
robots.txt-Hinweise respektieren- Server nicht mit aggressiven Anfragelasten überfordern
- Personendaten nach DSGVO/CCPA sorgfältig behandeln
- Für kommerzielle Anwendungsfälle Rechtsberatung einholen
Fazit und wichtigste Erkenntnisse
Airbnb-Scraping reicht von „schnell und schmutzig“ bis „produktionstauglich“. Die wichtigsten Erkenntnisse:
- Übergib immer Daten in der URL (
checkin- undcheckout-Parameter) – ohne sie sind Preisdaten wertlos - Verlass dich nicht auf CSS-Klassennamen. Nimm stattdessen
data-testid-Attribute, schema.org-Mikrodaten oder API-Intercepting per GraphQL - Residential Proxies sind im großen Umfang Pflicht. Datacenter-IPs werden sofort blockiert
- Drossele Anfragen – zufällige Pausen von 3–10 Sekunden, Sticky Sessions und exponentielles Backoff bei Fehlern
- Für Scraping ohne Wartungsaufwand machen KI-basierte Tools wie Thunderbit Selektorbrüche komplett überflüssig – genau das Problem, das Python-Scraper teuer in der Pflege macht
- Wähle dein Werkzeug passend zum Projekt. Schnelle Recherche?
pyairbnb. Dynamische Preisanalyse? Playwright mit API-Intercepting. Laufende Überwachung ohne Code? Thunderbit. Produktion im großen Maßstab? Eine Scraping-API.
Thunderbit für Airbnb-Scraping testen
Willst du den No-Code-Weg ausprobieren, bietet Thunderbit einen kostenlosen Tarif – in etwa zwei Minuten testest du ihn auf ein paar Airbnb-Suchergebnisseiten. Für den Python-Weg lassen sich alle Code-Muster aus diesem Artikel direkt auf deinen konkreten Anwendungsfall zuschneiden.
Mehr zu Web-Scraping-Ansätzen und Tools findest du in unseren Leitfäden zu Daten von Websites nach Excel scrapen, den besten KI-Web-Scrapern und Best Practices für Web-Scraping. Tutorials gibt es außerdem auf dem Thunderbit YouTube-Kanal.
FAQs
Kann Airbnb dich fürs Scraping blockieren?
Ja. Airbnb nutzt Akamai Bot Manager mit TLS-Fingerprinting, JavaScript-Challenges, Browser-Fingerprinting und IP-Reputationsbewertung. Wirst du erkannt, bekommst du 403-, 429- oder CAPTCHA-Antworten. Proxy-Rotation, realistische Header und das Drosseln von Anfragen senken das Risiko, aber bei hohem Volumen gibt es keine garantierte Methode, der Erkennung zu entgehen.
Ist es legal, Airbnb zu scrapen?
Das Scrapen öffentlich verfügbarer Daten ist nach US-Rechtsprechung grundsätzlich zulässig (hiQ v. LinkedIn, Meta v. Bright Data), doch Airbnbs Nutzungsbedingungen verbieten es ausdrücklich. Die Rechtslage variiert je nach Jurisdiktion, und die aufkommende DMCA-Anti-Umgehungs-Theorie (Reddit v. Perplexity) könnte Scraper treffen, die Anti-Bot-Maßnahmen umgehen. Für kommerzielle Nutzung solltest du Rechtsberatung einholen.
Welche Daten kann man von Airbnb scrapen?
Aus Suchergebnissen: Inseratsname, Preis (mit Daten), Bewertung, Anzahl der Bewertungen, Standort, Immobilientyp und URL. Aus Detailseiten: vollständige Beschreibung, Annehmlichkeiten, Host-Infos, alle Bewertungen, Fotos, Kalenderverfügbarkeit, Reinigungsgebühren und Preisaufschlüsselungen. Wie tief du kommst, hängt davon ab, ob du nur Suchseiten scrapest oder auch einzelne Inseratsseiten besuchst.
Brauche ich Proxys, um Airbnb mit Python zu scrapen?
Für ein paar Seiten kommst du eventuell ohne Proxys aus. Für alles jenseits von 20–30 Anfragen wird eine Residential-Proxy-Rotation dringend empfohlen. Datacenter-IPs werden sofort blockiert. Der Community-Konsens rät zu maximal etwa 100 Seiten pro Stunde von einer einzelnen IP mit zufälligen Pausen von 3–10 Sekunden zwischen den Anfragen.
Was ist der einfachste Weg, Airbnb ohne Code zu scrapen?
Die Chrome-Erweiterung von Thunderbit lässt dich Airbnb-Suchergebnisse und Inserats-Detailseiten mit KI-gestützter Felderkennung scrapen – keine Selektoren zum Konfigurieren, kein Code zum Schreiben. Sie unterstützt das Scraping von Unterseiten (für Annehmlichkeiten, Bewertungen und Host-Infos), exportiert nach Google Sheets, Excel, Airtable oder Notion und bietet geplantes Scraping für die laufende Preisüberwachung.
Mehr erfahren


