Airbnb hostet über in mehr als 220 Ländern – und bietet keinen öffentlichen API-Zugang für Marktdaten. Wenn du Preisinformationen, Wettbewerbsvergleiche oder Forschungsdatensätze brauchst, ist Scraping im Grunde deine einzige Option.
Der Haken? Airbnb gehört zu den schwierigsten Websites, die man im heutigen Web scrapen kann. Die Plattform nutzt eine eigene WAF in Kombination mit Akamai Bot Manager, rendert alles clientseitig mit React und rotiert CSS-Klassennamen so, wie ein paranoider Schlosser ständig die Schlüssel wechselt. Ich habe viel Zeit damit verbracht, verschiedene Ansätze fürs Airbnb-Scraping zu testen – von schlanken HTTP-Bibliotheken über vollständige Browser-Automatisierung bis hin zu No-Code-Tools mit KI – und die Realität ist: Keine einzelne Methode funktioniert für jeden Anwendungsfall perfekt.
Dieser Leitfaden führt dich durch alle fünf praktikablen Ansätze – mit echtem Code, ehrlichen Vor- und Nachteilen und praxisnahen Tipps, damit deine IP nicht auf Nimmerwiedersehen gesperrt wird. Egal, ob du Python-Entwickler, Datenanalyst oder Immobilieninvestor bist, der einfach nur eine Tabelle braucht – hier findest du den passenden Weg.
Warum Airbnb scrapen? Praxisnahe Anwendungsfälle
Niemand scraped Airbnb aus Spaß am Verschachteln von HTML. Es geht um konkrete Projekte und Geschäftsziele – hier sind die sechs häufigsten:
| Anwendungsfall | Was du scrapen solltest | Wer das nutzt |
|---|---|---|
| Dynamische Preisstrategie | Nächtliche Konkurrenzpreise innerhalb eines bestimmten Radius | Hosts, Property Manager |
| Investmentanalyse | Belegungsindikatoren (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, Preisberater |
| Sentimentanalyse von Bewertungen | Gästebewertungen für NLP-/Sentiment-Auswertungen | Data Scientists, Hospitality-Teams |
| Wissenschaftliche Forschung | Marktdatensätze für Wohnungsmarktpolitik, Tourismus und Stadtökonomie | Forschende (48,7 % von 1.021 akademischen Arbeiten zu Airbnb nutzten gescrapte Daten) |
| Wettbewerbsbeobachtung | Neue Inserate, Preisänderungen, Verfügbarkeiten im Zeitverlauf | STR-Betreiber, Marktanalysten |
Für laufende Use Cases wie Preis-Monitoring oder Wettbewerbsbeobachtung ist geplantes bzw. automatisiertes Scraping besonders wertvoll – du brauchst aktuelle Daten, keinen einmaligen Schnappschuss.
Der Markt für Kurzzeitvermietungen wächst schneller als klassische Hotels: Die STR-Nachfrage , während die Hotelnachfrage um 0,3 % zurückging. Wenn du in diesem Bereich tätig bist, sind Daten dein Vorsprung.
Was Airbnb schwer zu scrapen macht
Bevor du eine einzige Codezeile schreibst, hilft es zu verstehen, warum Airbnb beim Scraping als eingestuft wird. Drei Probleme kommen zusammen.
Airbnbs Anti-Bot-Schutz
Airbnb verwendet eine eigene WAF zusammen mit , einem Bot-Erkennungssystem auf Enterprise-Niveau, das jede Anfrage gleichzeitig über mehrere Dimensionen bewertet. Das ist nicht nur Rate Limiting – sondern KI-gestütztes Fingerprinting.

Die Erkennungsschicht nach Risikostufe:
- TLS-Fingerprinting (HOCH): Die
requests-Bibliothek von Python hat einen charakteristischen TLS-Handshake, der nicht zu echten Browsern passt. Akamai analysiert Cipher Suites, Erweiterungen und die ALPN-Reihenfolge über JA3/JA4-Methoden. Standard-requestserreicht auf geschützten Seiten nur etwa gegenüber 92 % bei Bibliotheken, die Browser-TLS-Fingerprints vortäuschen. - JavaScript-Ausführung (HOCH): Akamai setzt clientseitige Skripte ein, die „Sensordaten“ erfassen – Geräteattribute, Hardwarefähigkeiten, OS-Details. Daraus entsteht das
_abck-Cookie. Ohne AusfĂĽhrung dieses JavaScripts werden Anfragen blockiert. - Browser-Fingerprinting (HOCH): Canvas-, WebGL- und Font-Analyse erkennen Automatisierungstools. Headless-Browser verraten sich ĂĽber
navigator.webdriver, fehlende Plugins und inkonsistente Hardwarewerte. - HTTP-Header-Analyse (HOCH): Fehlende
Sec-Fetch-*-Header sind eine auf Airbnb. - IP-Reputation (MITTEL): Rechenzentrums-IPs werden sofort blockiert. Residential Proxies sind in größerem Umfang Pflicht.
- Verhaltensanalyse (MITTEL): Zu gleichmäßige Timing-Muster, keine Mausbewegungen, kein Scrollen – all das sind deutliche Warnsignale.
Wenn du blockiert wirst, siehst du typischerweise: 403 Forbidden (Fingerprint-Fehler), 429 Too Many Requests (Rate Limit), 503 Service Unavailable (Akamai-Challenge-Seite) oder eine CAPTCHA-Seite.
Airbnbs dynamische, JavaScript-lastige Seiten
Ein simples requests.get() gegen Airbnb liefert nur eine React-Hülle mit Platzhalter-HTML – keine echten Inseratsdaten. Wie : „Einfachen HTTP-Requests gelingt das nicht. Ohne passende Proxies und echtes JavaScript-Rendering scrapen Sie nicht Airbnb, sondern Platzhalter.“
Die eigentlichen Daten werden clientseitig über interne GraphQL-API-Aufrufe geladen (/api/v3/StaysSearch für Suchergebnisse, /api/v3/PdpPlatformSections für Inseratsdetails). Das bedeutet: Für die meisten nützlichen Daten brauchst du entweder einen vollständigen Browser oder API-Abfangen.
Das DOM ändert sich ständig
Airbnb setzt CSS-in-JS mit gehashten Klassennamen ein, die sich bei jedem Deployment ändern. Dokumentierte Beispiele sind _tyxjp1, lxq01kf, atm_mk_h2mmj6, t1jojoys und _8s3ctt. Wie erklärt: „Diese Klassen sind nicht dafür gemacht, stabil zu sein, und können sich jederzeit ändern – oft ohne sichtbare Änderungen an der Seite.“
Auch die Entwickler-Community hat dieses Problem ausführlich dokumentiert. , dass „CSS-Klassen sich ständig ändern, und sich darauf zu verlassen, ist der schnellste Weg, deinen Scraper zu zerstören.“ Ein erfahrener Entwickler aus der DEV Community brachte es gut auf den Punkt: „Ein Scraper, der 50 % langsamer ist, aber nie kaputtgeht, ist unendlich wertvoller als einer, der schnell ist und wöchentlich ausfällt.“
Branchenschätzungen zufolge benötigen wegen DOM-Verschiebungen, Fingerprinting-Updates oder Endpoint-Throttling.
Wähle deinen Ansatz: 5 Wege, Airbnb zu scrapen
Vor dem Code hier der Vergleich. Jeder Ansatz hat echte Vor- und Nachteile – es gibt keine universell „beste“ Methode.
| Ansatz | Einrichtungsaufwand | Geschwindigkeit | Resistenz gegen Anti-Bot-MaĂźnahmen | Wartung | Am besten geeignet fĂĽr |
|---|---|---|---|---|---|
Reines HTTP (requests / pyairbnb) | Gering | Schnell | Mittel (anfällig für API-Änderungen) | Mittel | Schnelle Recherchen, kleine Datensätze |
| Browser-Automatisierung (Selenium) | Hoch | Langsam | Mittel | Hoch (DOM-Brüche) | Dynamische Inhalte, datenabhängige Preise |
| Browser-Automatisierung (Playwright) | Mittel | Mittel | Mittel-Hoch | Mittel | Moderne Alternative zu Selenium |
| Scraping-API (ScrapingBee, Bright Data) | Gering | Schnell | Hoch (Proxy-Rotation integriert) | Gering | Scraping im groĂźen Stil, produktiver Einsatz |
| No-Code (Thunderbit) | Minimal | Schnell | Hoch (KI passt sich Layout-Änderungen an) | Keine | Nicht-Entwickler, einmalige Analysen |
Der restliche Artikel führt die Python-Ansätze Schritt für Schritt durch. Am Ende gibt es einen No-Code-Abschnitt für alle, die den Code lieber ganz überspringen.
Schritt fĂĽr Schritt: Airbnb mit Python und Requests scrapen (HTTP-First-Ansatz)
Das ist die schlanke Schnellstart-Variante – kein Browser nötig, kein Chromedriver-Ärger. Der Nachteil: Sie funktioniert für manche Daten, aber nicht für alle.
Python-Umgebung einrichten
Erstelle einen Projektordner und richte eine virtuelle Umgebung ein:
1mkdir airbnb-scraper && cd airbnb-scraper
2python -m venv venv
3source venv/bin/activate # Windows: venv\Scripts\activate
4pip install requests beautifulsoup4 pandas pyairbnb
pyairbnb ist eine schlanke Bibliothek (, zuletzt veröffentlicht im Februar 2026), die Airbnbs interne StaysSearch-GraphQL-API anzapft. Sie scrapt gar kein HTML, wodurch sie unempfindlich gegen CSS-Klassenänderungen ist. Das Ein-Personen-Maintainer-Modell ist ein Risikofaktor, aber die Bibliothek wird aktiv gepflegt.
Option A: pyairbnb fĂĽr schnelle Suchergebnisse
Der schnellste Weg zu strukturierten Airbnb-Daten:
1import pyairbnb
2import pandas as pd
3# Suche nach Ort und Daten
4results = pyairbnb.search_all(
5 query="Austin, TX",
6 checkin="2025-08-01",
7 checkout="2025-08-03",
8 adults=2,
9 currency="USD"
10)
11# In DataFrame umwandeln
12df = pd.DataFrame(results)
13print(df[['name', 'price', 'rating', 'reviewsCount', 'url']].head())
14df.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 Rotation.
Option B: Manuelle HTTP-Requests mit BeautifulSoup
Wenn du nicht von einer Drittanbieterbibliothek abhängig sein möchtest, kannst du Anfragen direkt senden. Vorab ein wichtiger Hinweis: Reines requests wird wegen TLS-Fingerprinting schnell blockiert. Mit curl_cffi (das Browser-TLS-Fingerprints vortäuscht) steigen die Erfolgsraten deutlich.
1from curl_cffi import requests as cffi_requests
2from bs4 import BeautifulSoup
3import json
4url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
5headers = {
6 "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",
7 "Accept-Language": "en-US,en;q=0.9",
8 "Sec-Fetch-Dest": "document",
9 "Sec-Fetch-Mode": "navigate",
10 "Sec-Fetch-Site": "none",
11 "Sec-Fetch-User": "?1",
12}
13response = cffi_requests.get(url, headers=headers, impersonate="chrome131")
14soup = BeautifulSoup(response.text, "html.parser")
Daten aus Schema.org-Microdata extrahieren
Airbnb bindet schema.org-Microdata direkt ins HTML-Markup ein – und diese semantischen Tags sind . Achte auf Container mit itemprop="itemListElement":
1listings = soup.find_all("div", itemprop="itemListElement")
2data = []
3for listing in listings:
4 name_tag = listing.find("meta", itemprop="name")
5 url_tag = listing.find("meta", itemprop="url")
6 position_tag = listing.find("meta", itemprop="position")
7 data.append({
8 "name": name_tag["content"] if name_tag else None,
9 "url": url_tag["content"] if url_tag else None,
10 "position": position_tag["content"] if position_tag else None,
11 })
12df = pd.DataFrame(data)
13df.to_csv("airbnb_listings.csv", index=False)
Die Einschränkung: Schema.org-Tags liefern dir Namen, URLs und Positionen der Inserate – aber keine Preise, Bewertungen oder Ausstattungsmerkmale. Für umfangreichere Daten brauchst du Browser-Automatisierung oder API-Abfangen.
Schritt fĂĽr Schritt: Airbnb mit Python ĂĽber Selenium oder Playwright scrapen
Wenn du dynamische Inhalte brauchst – also datenabhängige Preise, Ausstattungsmerkmale hinter „Mehr anzeigen“-Buttons oder vollständige Bewertungstexte – ist Browser-Automatisierung das richtige Werkzeug.
Wann Browser-Automatisierung sinnvoll ist
- Seiten, auf denen erst nach Datumswahl echte Preise erscheinen
- Ausstattungen und Bewertungen, die hinter interaktiven Elementen verborgen sind
- Daten, die erst nach JavaScript-AusfĂĽhrung geladen werden
- Wenn du mit der Seite interagieren musst (Scrollen, Klicken)
Selenium vs. Playwright: Playwright hat sich weitgehend durchgesetzt
Playwright hat Selenium als bevorzugtes Browser-Automatisierungstool überholt. Es ist schneller, hat integrierte Async-Unterstützung, installiert Browser-Binaries automatisch und kommt mit modernen Web-Apps besser klar. Selens häufiges – bei dem ChromeDriver hinter Chrome-Updates zurückbleibt – bleibt dagegen ein Dauerärgernis.
Trotzdem hat Selenium ein größeres Ökosystem an Tutorials und StackOverflow-Antworten – nutze also das Tool, mit dem du dich wohler fühlst.
Playwright einrichten
1pip install playwright playwright-stealth
2playwright install chromium
Zu Airbnb navigieren und Inserate extrahieren
1import asyncio
2from playwright.async_api import async_playwright
3from playwright_stealth import stealth_async
4import json
5async def scrape_airbnb():
6 async with async_playwright() as p:
7 browser = await p.chromium.launch(headless=False) # headless=True ist riskanter
8 context = await browser.new_context(
9 viewport={"width": 1920, "height": 1080},
10 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"
11 )
12 page = await context.new_page()
13 await stealth_async(page)
14 url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
15 await page.goto(url, wait_until="networkidle")
16 # Warten, bis Karten erscheinen; data-testid ist stabiler als Klassen
17 await page.wait_for_selector('[data-testid="card-container"]', timeout=15000)
18 # Inseratsdaten extrahieren
19 listings = await page.query_selector_all('[data-testid="card-container"]')
20 results = []
21 for listing in listings:
22 title_el = await listing.query_selector('[data-testid="listing-card-title"]')
23 subtitle_el = await listing.query_selector('[data-testid="listing-card-subtitle"]')
24 title = await title_el.inner_text() if title_el else None
25 subtitle = await subtitle_el.inner_text() if subtitle_el else None
26 results.append({"title": title, "subtitle": subtitle})
27 await browser.close()
28 return results
29data = asyncio.run(scrape_airbnb())
Die GraphQL-API abfangen (die zuverlässigste DIY-Methode)
Statt DOM-Elemente zu parsen, die ständig brechen, kannst du Airbnbs interne API-Aufrufe abfangen. Das liefert sauberes, strukturiertes JSON:
1api_responses = []
2async def handle_response(response):
3 if "StaysSearch" in response.url:
4 try:
5 data = await response.json()
6 api_responses.append(data)
7 except:
8 pass
9page.on("response", handle_response)
10await page.goto(url, wait_until="networkidle")
11# API-Antwort parsen
12if api_responses:
13 search_results = api_responses[0]["data"]["presentation"]["staysSearch"]["results"]["searchResults"]
14 for result in search_results:
15 listing = result.get("listing", {})
16 pricing = result.get("pricingQuote", {})
17 print(f"{listing.get('name')} — {pricing.get('price', {}).get('total')}")
Die StaysSearch-Antwort enthält id, name, roomTypeCategory, bedrooms, bathrooms, personCapacity, avgRating, reviewsCount, isSuperhost und vollständige Preisaufschlüsselungen. Genau diese Daten nutzt Airbnbs Frontend, um die Seite zu rendern.
Pagination handhaben
Airbnb zeigt ungefähr 18 Inserate pro Seite an und verwendet den URL-Parameter items_offset. Das Maximum liegt bei rund 17 Seiten (~300 Inserate pro Suche).
1import time
2import random
3base_url = "https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2"
4all_results = []
5for page_num in range(17): # Max. ~17 Seiten
6 offset = page_num * 18
7 paginated_url = f"{base_url}&items_offset={offset}"
8 # ... wie oben navigieren und scrapen ...
9 time.sleep(random.uniform(3, 7)) # Zufällige Pause zwischen den Seiten
Wie du Airbnb-Preise mit Python scrapen kannst (das Problem mit datumsabhängigen Preisen lösen)
Das ist der Abschnitt, den die meisten Tutorials überspringen – und genau der ist für Preisanalysen am wichtigsten.
Warum Airbnb ohne Daten keine Preise anzeigt
In etwa 90 % der Fälle verlangt Airbnb Check-in-/Check-out-Daten, bevor ein echter Preis angezeigt wird. Ohne Daten siehst du nur eine vage „Preis pro Nacht“-Spanne (oder manchmal gar keinen Preis). Wie : „Wenn ein Inserat keinen Preis anzeigt – etwa weil Airbnb möchte, dass du Daten oder Gästeanzahl anpasst –, gibt die Funktion einfach None zurück.“
Die gute Nachricht: Seit April 2025 zeigt Airbnb für alle Gäste weltweit standardmäßig den an. Früher gab es einen Schalter für die „Gesamtpreis-Anzeige“ – fast 17 Millionen Gäste nutzten ihn, bevor er zum Standard wurde.
Daten per URL-Parameter ĂĽbergeben
FĂĽge deiner Such-URL immer checkin und checkout hinzu:
1https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2
Dadurch liefert Airbnb echte Nacht- und Gesamtpreise sowohl auf der Seite als auch in den API-Antworten.
Datumsbereiche fĂĽr Preisanalysen durchlaufen
FĂĽr Hosts und Investoren, die Preisdaten ĂĽber mehrere Saisons hinweg brauchen:
1from datetime import datetime, timedelta
2start_date = datetime(2025, 7, 1)
3end_date = datetime(2025, 12, 31)
4stay_length = 2 # Nächte
5current = start_date
6date_ranges = []
7while current + timedelta(days=stay_length) <= end_date:
8 checkin = current.strftime("%Y-%m-%d")
9 checkout = (current + timedelta(days=stay_length)).strftime("%Y-%m-%d")
10 date_ranges.append((checkin, checkout))
11 current += timedelta(days=7) # Wöchentliche Intervalle
12for checkin, checkout in date_ranges:
13 url = f"https://www.airbnb.com/s/Austin--TX/homes?checkin={checkin}&checkout={checkout}&adults=2"
14 # ... Preisdaten scrapen ...
15 time.sleep(random.uniform(5, 10)) # RĂĽcksichtsvoll timen
Beim Parsen der Preise aus der GraphQL-API-Antwort solltest du auf das Objekt pricingQuote achten. Es enthält price.total, price.priceItems (einzelne Positionen wie Reinigungsgebühr und Servicegebühr) sowie rate.amount (Nachtpreis).
So bleibt dein Python-Airbnb-Scraper trotz Website-Redesigns funktionsfähig
Das ist der Wartungsabschnitt, den niemand gern schreibt – aber er ist wahrscheinlich der wichtigste Teil jedes Airbnb-Scraping-Projekts.
Fragile vs. robuste Selektoren
| Selektor-Strategie | Bruchrisiko | Code-Aufwand | Beispiel |
|---|---|---|---|
CSS-Klassennamen (z. B. .t1jojoys) | 🔴 Hoch – ändern sich häufig | Gering | soup.select('.t1jojoys') |
data-testid-Attribute | 🟡 Mittel – stabiler | Gering | soup.select('[data-testid="listing-card-title"]') |
| Schema.org-Microdata im HTML | 🟢 Gering – struktureller Standard | Mittel | soup.find("meta", itemprop="name") |
| GraphQL-API-Abfangen | 🟢 Gering – 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
Aktuell dokumentierte data-testid-Werte bei Airbnb sind unter anderem card-container, listing-card-title, listing-card-subtitle und listing-card-name. Diese hängen mit Airbnbs internem Test-Framework zusammen, nicht mit dem visuellen Design, und ändern sich daher seltener als CSS-Klassen. Ganz ausgeschlossen ist eine Änderung aber nicht – nur eben seltener.
1# Robuster als klassenbasierte Selektoren
2title = await page.query_selector('[data-testid="listing-card-title"]')
Schema.org-Microdata verwenden
Airbnb nutzt itemprop-Attribute direkt im HTML-Markup. Diese folgen Webstandards und ändern sich deutlich seltener als visuelle CSS-Klassen:
1# Alle Inserate anhand von schema.org-Markup extrahieren
2listings = soup.find_all("div", itemprop="itemListElement")
3for listing in listings:
4 name = listing.find("meta", itemprop="name")["content"]
5 url = listing.find("meta", itemprop="url")["content"]
Die GraphQL-API abfangen
Der zuverlässigste DIY-Ansatz. Airbnbs interne API liefert sauberes JSON, das für das Frontend strukturiert ist. Das Antwortformat ändert sich seltener als das DOM, weil auch das Frontend-Team darauf angewiesen ist.
Warum KI-basierte Extraktion Wartung praktisch ĂĽberflĂĽssig macht
Selbst die besten Selektor-Strategien brechen irgendwann. data-testid-Werte werden umbenannt. API-Antwortstrukturen werden versioniert. Der einzige Ansatz, der Wartung wirklich eliminiert, ist einer, der die Seite jedes Mal frisch mit KI liest – ganz ohne fest verdrahtete Selektoren. Mehr dazu unten im Thunderbit-Abschnitt.
So vermeidest du Sperren beim Scraping von Airbnb
Praxistipps aus Erfahrung und Community-Konsens.
Proxies rotieren lassen (Residential ist Pflicht)
Rechenzentrums-IPs werden von Airbnb sofort blockiert. Residential Proxies sind in jedem sinnvollen Umfang notwendig. FĂĽhrende Anbieter nach Leistung und Preis:
| Anbieter | Preis pro GB | Erfolgsrate | Hinweise |
|---|---|---|---|
| Decodo (frĂĽher Smartproxy) | ca. $2.20/GB ab 100 GB | 99.68 % | Schnellste gemessene Antwort (0,54 s) |
| Bright Data | ca. $5.04/GB ab 100 GB | 99 %+ | Größter Pool, viele Features |
| Oxylabs | ca. $4/GB ab 100 GB | 99 %+ | Stark im E-Commerce |
Wichtiger Hinweis zur Rotation von einem erfahrenen Entwickler: „Bei jeder Anfrage die IP zu wechseln ist eigentlich ein Warnsignal. Echte Nutzer behalten dieselbe IP für eine Session.“ Die Empfehlung lautet daher: Sticky Sessions von 5–10 Minuten und Rotation alle 20–30 Requests.
1proxies = {
2 "http": "http://user:pass@residential-proxy:port",
3 "https": "http://user:pass@residential-proxy:port",
4}
5response = cffi_requests.get(url, headers=headers, proxies=proxies, impersonate="chrome131")
Requests drosseln
Community-Konsens zu sicheren Schwellenwerten:
- Maximale Seiten pro Stunde: ≤100 (~1,6/Min.)
- Pause zwischen Requests: 3–10 Sekunden (zufällig, idealerweise mit Gauß-Verteilung)
- Session-Pausen: Alle 20 Requests eine Pause von 30–60 Sekunden
- Optimales Zeitfenster: Schwachlastzeiten (~2 Uhr nachts Ortszeit)
- Bei 429-Fehlern: Exponentielles Backoff mit Jitter
1import random
2import time
3delay = random.gauss(5, 1.5) # Mittelwert 5 Sekunden, Standardabweichung 1,5
4delay = max(2, min(delay, 10)) # Auf 2–10 Sekunden begrenzen
5time.sleep(delay)
Vollständige und konsistente Header verwenden
Fehlende Sec-Fetch-*-Header sind eine . Jeder Header muss in sich stimmig sein – wenn dein User-Agent Chrome 131 unter Windows behauptet, müssen alle anderen Header zu dieser Identität passen.
1headers = {
2 "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",
3 "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
4 "Accept-Language": "en-US,en;q=0.9",
5 "Accept-Encoding": "gzip, deflate, br",
6 "Sec-Fetch-Dest": "document",
7 "Sec-Fetch-Mode": "navigate",
8 "Sec-Fetch-Site": "none",
9 "Sec-Fetch-User": "?1",
10 "Sec-CH-UA": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
11 "Sec-CH-UA-Platform": '"Windows"',
12}
Headless-Browser mit Vorsicht einsetzen
Bei Playwright patcht das Paket playwright-stealth rund 17 Umgehungs-Module (navigator.webdriver, plugins, languages, WebGL). Moderne Anti-Bot-Systeme prüfen jedoch 40+ Eigenschaften, während nur etwa 12 gepatcht werden. Der Betrieb im Nicht-Headless-Modus (headless=False) ist sicherer, aber langsamer.
Bei Selenium patcht undetected-chromedriver die ChromeDriver-Binärdatei, um Automatisierungsindikatoren zu entfernen, aber Headless-Modus bleibt instabil.
Für größere Mengen lieber eine Scraping-API nutzen
Wenn du Tausende von Seiten scrapen willst, übernimmt eine Scraping-API Proxy-Rotation, CAPTCHA-Lösung und JavaScript-Rendering für dich. In einem erreichte Bright Data 99 % Erfolgsrate mit 48 Feldern pro Inserat. Der Nachteil sind die Kosten – der Stealth-Proxy-Modus von ScrapingBee kostet , sodass ein 49-Dollar-Monatsplan nur etwa 3.333 Stealth-Requests ermöglicht.
Airbnb ohne Python scrapen: Die No-Code-Alternative mit Thunderbit
Nicht jeder, der Airbnb scrapen will, ist Entwickler. Hosts wollen Preisvergleiche. Investoren wollen Marktdaten. Analysten wollen eine Tabelle. Wenn du die Python-Abschnitte gelesen hast und denkst: „Das ist mehr Wartung, als ich wollte“, ist dieser Teil für dich.
So scrapt Thunderbit Airbnb mit wenigen Klicks
ist ein KI-Web-Scraper, der als läuft. So funktioniert es:
- Erweiterung installieren aus dem Chrome Web Store
- Zu einer Airbnb-Suchergebnisseite navigieren – für genaue Preise die Daten in die URL aufnehmen (z. B.
?checkin=2025-08-01&checkout=2025-08-03) - Auf „AI Suggest Fields“ klicken – Thunderbit scannt die Seite und erkennt automatisch Spalten wie Inseratsname, Preis, Bewertung, Ort und URL
- Auf „Scrape“ klicken – die Daten werden in einer strukturierten Tabelle befüllt
- „Scrape Subpages“ verwenden – damit besucht das Tool jede Detailseite und zieht Ausstattungen, Bewertungen, Host-Infos und vollständige Preisaufschlüsselungen heraus, ganz ohne zusätzliche Konfiguration
- Exportieren nach Google Sheets, Excel, Airtable oder Notion
Die Subpage-Scraping-Funktion ist hier besonders wichtig. Bei Python-Ansätzen bedeutet das Scrapen von Detailseiten zusätzliche Parsing-Logik, Paging innerhalb von Bewertungen und parallele Requests. Mit Thunderbit ist es ein Klick.
Warum Thunderbit die drei größten Airbnb-Scraping-Probleme löst
Die drei Probleme von oben – Anti-Bot-Schutz, JavaScript-Rendering und DOM-Brüche – sind genau das, was Python-Scraper wartungsintensiv macht. Thunderbit adressiert alle drei:
- Keine IP-Blockierungs-Sorgen: Der Cloud-Scraping-Modus von Thunderbit ĂĽbernimmt die Proxy-Rotation intern
- Keine Selektor-Brüche: Die KI liest die Seite jedes Mal neu – keine CSS-Selektoren, die gepflegt werden müssen, kein Code-Update bei Airbnb-Redesigns
- Keine Einrichtungsprobleme: Keine Selenium-Driver, keine Python-Umgebung, keine Dependency-Konflikte
- Geplantes Scraping: Beschreibe das Zeitintervall in natürlicher Sprache für laufendes Preis-Monitoring – ideal für dynamische Preis- und Wettbewerbsbeobachtung
Wann Python sinnvoller ist und wann Thunderbit
Das ist kein Entweder-oder – es hängt von deinem Bedarf ab:
| Bedarf | Python | Thunderbit |
|---|---|---|
| Volle Kontrolle über die Scraping-Logik | ✅ Ja | ❌ Nein |
| Funktioniert ohne Programmierkenntnisse | ❌ Nein | ✅ Ja |
| Kommt automatisch mit DOM-Änderungen klar | ❌ Nein | ✅ Ja (KI-basiert) |
| Subpage-Scraping (Detailseiten) | Komplexes Setup | 1 Klick |
| Geplantes/wiederkehrendes Scraping | Eigenes Cron-Job-Setup | Integrierter Scheduler |
| Export nach Sheets/Excel/Airtable | Manueller Code | Integriert |
| Integration in Data Pipelines | ✅ Ja | Eingeschränkt |
| Kosten in groĂźem Umfang (10.000+ Seiten) | Server- plus Proxy-Kosten | Thunderbit-Preise |
Wenn du Kontrolle auf Code-Ebene, eigene Logik oder die Einbindung in eine bestehende Datenpipeline brauchst, nimm Python. Wenn du die Daten schnell und ohne Wartungsaufwand möchtest, ist Thunderbit die pragmatische Wahl.
Rechtliche und ethische Hinweise zum Scraping von Airbnb
Kurz und praxisnah – ich bin kein Anwalt, und das hier ist keine Rechtsberatung.
Was das Gesetz grob sagt:
- Das Urteil stellte klar, dass das Scrapen öffentlich zugänglicher Daten von Websites ohne Authentifizierungszwang nicht gegen den CFAA verstößt
- (Januar 2024): Ein Richter entschied, dass Nutzungsbedingungen Scraper im ausgeloggten Zustand nicht binden
- Der Fall (2025) bringt eine neue Theorie ins Spiel: Das Umgehen von CAPTCHAs und Rate Limits könnte DMCA-Umgehungsverbote verletzen – das ist noch nicht getestet, aber sollte beobachtet werden
Was Airbnb sagt: Die verbieten automatisierte Datenerfassung ausdrücklich. Airbnb hat jedoch nie öffentlich gegen einen Scraper geklagt. ist seit über 11 Jahren ohne rechtliche Schritte aktiv, obwohl Airbnb das Projekt als „Müll“ bezeichnet.
Praktische Leitlinien:
- Nur öffentlich verfügbare Daten scrapen (keine Login-Schranken umgehen)
robots.txt-Hinweise respektieren- Server nicht mit aggressiven Request-Raten ĂĽberlasten
- Personenbezogene Daten unter GDPR/CCPA sorgfältig behandeln
- FĂĽr kommerzielle Use Cases juristischen Rat einholen
Fazit und wichtigste Erkenntnisse
Airbnb-Scraping reicht von „schnell und schmutzig“ bis „produktionstauglich“. Die wichtigsten Punkte:
- Daten immer in die URL aufnehmen (
checkin- undcheckout-Parameter) – ohne sie sind Preisdaten praktisch nutzlos - Nicht auf CSS-Klassennamen verlassen. Nutze stattdessen
data-testid-Attribute, schema.org-Microdata oder das Abfangen der GraphQL-API - Residential Proxies sind im groĂźen MaĂźstab Pflicht. Rechenzentrums-IPs werden sofort blockiert
- Requests drosseln – zufällige Pausen von 3–10 Sekunden, Sticky Sessions und exponentielles Backoff bei Fehlern
- Für Scraping ohne Wartungsaufwand eliminieren KI-basierte Tools wie Selektor-Brüche komplett – genau das Problem, das Python-Scraper teuer in der Pflege macht
- Wähle das Tool passend zum Projekt. Schnelle Recherche?
pyairbnb. Dynamische Preisanalyse? Playwright mit API-Abfangen. Laufendes Monitoring ohne Code? Thunderbit. Produktion im groĂźen MaĂźstab? Eine Scraping-API.
Wenn du den No-Code-Weg ausprobieren möchtest, bietet – du kannst es in etwa zwei Minuten auf ein paar Airbnb-Suchergebnisseiten testen. Für den Python-Ansatz lassen sich alle Code-Muster in diesem Artikel direkt auf deinen konkreten Anwendungsfall anpassen.
Mehr zu Web-Scraping-Ansätzen und Tools findest du in unseren Leitfäden zu , und . Außerdem kannst du Tutorials auf dem ansehen.
FAQs
Kann Airbnb dich fĂĽrs Scraping blockieren?
Ja. Airbnb nutzt Akamai Bot Manager mit TLS-Fingerprinting, JavaScript-Challenges, Browser-Fingerprinting und IP-Reputation-Bewertung. Wenn du erkannt wirst, bekommst du 403-, 429- oder CAPTCHA-Antworten. Proxy-Rotation, realistische Header und gedrosselte Requests senken das Risiko, aber bei groĂźen Mengen gibt es keine sichere Garantie, unerkannt zu bleiben.
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), aber Airbnbs Nutzungsbedingungen verbieten es ausdrücklich. Die Rechtslage variiert je nach Land, und die neue DMCA-Umgehungstheorie (Reddit v. Perplexity) könnte Scraper betreffen, die Anti-Bot-Maßnahmen umgehen. Für kommerzielle Nutzung solltest du juristischen Rat einholen.
Welche Daten kann man von Airbnb scrapen?
Aus Suchergebnissen: Inseratsname, Preis (mit Daten), Bewertung, Anzahl der Bewertungen, Ort, Immobilientyp und URL. Von Detailseiten: vollständige Beschreibung, Ausstattungen, Host-Infos, alle Bewertungen, Fotos, Kalenderverfügbarkeit, Reinigungsgebühren und Preisaufschlüsselungen. Die Tiefe hängt davon ab, ob du nur Suchseiten scrapen oder auch einzelne Inseratsseiten besuchen.
Brauche ich Proxies, um Airbnb mit Python zu scrapen?
Für ein paar Seiten kommst du eventuell ohne Proxies aus. Für alles über 20–30 Requests wird eine Residential-Proxy-Rotation jedoch stark empfohlen. Rechenzentrums-IPs werden sofort blockiert. Der Community-Konsens empfiehlt maximal rund 100 Seiten pro Stunde von einer einzigen IP mit zufälligen Pausen von 3–10 Sekunden zwischen den Requests.
Was ist der einfachste Weg, Airbnb ohne Programmierung zu scrapen?
ermöglicht das Scrapen von Airbnb-Suchergebnissen und Detailseiten mit KI-gestützter Felderkennung – keine Selektoren, kein Code. Das Tool unterstützt Subpage-Scraping für Ausstattungen, Bewertungen und Host-Infos, exportiert nach Google Sheets, Excel, Airtable oder Notion und bietet geplantes Scraping für laufendes Preis-Monitoring.
Mehr erfahren
