Airbnb obsługuje ponad w ponad 220 krajach — i nie udostępnia publicznego API z danymi rynkowymi. Jeśli potrzebujesz analizy cen, porównań z konkurencją albo zbiorów danych do badań, scrapowanie jest w praktyce jedyną opcją.
Problem? Airbnb to jedna z najtrudniejszych stron do scrapowania we współczesnym internecie. Działa na własnym WAF-ie wspieranym przez Akamai Bot Manager, renderuje wszystko po stronie klienta za pomocą Reacta i losowo zmienia nazwy klas CSS, jak paranoiczny ślusarz wymieniający klucze. Spędziłem mnóstwo czasu, testując różne podejścia do scrapowania Airbnb — od lekkich bibliotek HTTP, przez pełną automatyzację przeglądarki, po bezkodowe narzędzia AI — i rzeczywistość jest taka, że żadne pojedyncze rozwiązanie nie działa idealnie w każdym scenariuszu.
Ten przewodnik przeprowadzi Cię przez wszystkie pięć sensownych podejść, z prawdziwym kodem, uczciwym omówieniem kompromisów i praktycznymi wskazówkami, jak nie dostać bana na IP do niebytu. Niezależnie od tego, czy jesteś programistą Pythona, analitykiem danych, czy inwestorem w nieruchomości, który po prostu chce arkusza kalkulacyjnego, znajdziesz tu coś dla siebie.
Dlaczego scrapować Airbnb? Rzeczywiste zastosowania
Nikt nie scrapuje Airbnb dla samej przyjemności parsowania zagnieżdżonego HTML-a. Ludzie mają konkretne projekty i cele biznesowe — oto sześć najczęstszych:
| Przypadek użycia | Co scrapujesz | Kto z tego korzysta |
|---|---|---|
| Strategia dynamicznego ustalania cen | Stawki konkurencji za noc w określonym promieniu | Gospodarze, zarządcy nieruchomości |
| Analiza inwestycyjna | Wskaźniki obłożenia (częstotliwość recenzji, dostępność w kalendarzu), ADR, RevPAR | Inwestorzy nieruchomości |
| Benchmark opłat za sprzątanie | Opłaty za sprzątanie w różnych typach nieruchomości (średnie widełki od $81–$335 w największych miastach USA) | Gospodarze, konsultanci ds. cen |
| Analiza sentymentu recenzji | Opinie gości do analizy NLP/sentymentu | Data scientists, zespoły hotelarskie |
| Badania akademickie | Zbiory danych na poziomie rynku dla polityki mieszkaniowej, turystyki i ekonomii miejskiej | Badacze (48,7% z 1 021 prac naukowych o Airbnb wykorzystywało dane scrapowane) |
| Śledzenie konkurencji | Nowe oferty, zmiany cen, dostępność w czasie | Operatorzy STR, analitycy rynku |
W przypadku zastosowań ciągłych, takich jak monitorowanie cen czy śledzenie konkurencji, szczególnie wartościowe jest planowane lub automatyczne scrapowanie — potrzebujesz świeżych danych, a nie jednorazowego zrzutu.
Rynek najmu krótkoterminowego rośnie szybciej niż tradycyjne hotele: popyt na STR , podczas gdy popyt hotelowy spadł o 0,3%. Jeśli działasz w tej branży, dane są Twoją przewagą.
Co sprawia, że scrapowanie Airbnb jest trudne
Zanim napiszesz choćby jedną linię kodu, warto zrozumieć, dlaczego Airbnb ma ocenę pod względem trudności scrapowania. Nakładają się na siebie trzy problemy.
Ochrona antybotowa Airbnb
Airbnb używa własnego WAF-a połączonego z , systemem wykrywania botów klasy enterprise, który ocenia każde żądanie jednocześnie w wielu wymiarach. To nie jest zwykłe ograniczanie liczby zapytań — to fingerprinting oparty na AI.

Warstwa wykrywania, uporządkowana według poziomu ryzyka:
- Fingerprinting TLS (WYSOKIE): biblioteka Pythona
requestsma unikalny podpis uścisku TLS, który nie pasuje do żadnej prawdziwej przeglądarki. Akamai analizuje zestawy szyfrów, rozszerzenia i kolejność ALPN za pomocą metod JA3/JA4. Standardowyrequestsosiąga około wobec 92% w bibliotekach, które podszywają się pod TLS przeglądarki. - Wykonywanie JavaScriptu (WYSOKIE): Akamai wdraża skrypty po stronie klienta, które zbierają „dane sensoryczne” — właściwości urządzenia, możliwości sprzętowe, szczegóły systemu operacyjnego. Z tego powstaje plik cookie
_abck. Bez wykonania tego JavaScriptu żądania są blokowane. - Fingerprinting przeglądarki (WYSOKIE): analiza Canvas, WebGL i fontów wykrywa narzędzia automatyzujące. Przeglądarki headless ujawniają flagi
navigator.webdriver, brakujące wtyczki i niespójne wartości sprzętowe. - Analiza nagłówków HTTP (WYSOKIE): brak nagłówków
Sec-Fetch-*to na Airbnb. - Reputacja IP (ŚREDNIE): adresy z centrów danych są blokowane natychmiast. Na większą skalę konieczne są proxy residential.
- Analiza behawioralna (ŚREDNIE): idealnie regularne odstępy czasu, brak ruchu myszy, brak przewijania — to wszystko zdradza automatyzację.
Gdy zostaniesz zablokowany, zobaczysz: 403 Forbidden (błąd fingerprintu), 429 Too Many Requests (limit żądań), 503 Service Unavailable (strona wyzwania Akamai) albo stronę CAPTCHA.
Dynamiczne, ciężkie od JavaScriptu strony Airbnb
Zwykłe requests.get() do Airbnb zwraca powłokę Reacta z HTML-em zastępczym — bez faktycznych danych ofert. Jak ujął to : „Zwykłe żądania HTTP po prostu nie działają, a bez odpowiednich proxy i prawdziwego renderowania JavaScriptu nie scrapujesz Airbnb — scrapujesz tylko zastępniki.”
Rzeczywiste dane są pobierane po stronie klienta przez wewnętrzne wywołania API GraphQL (/api/v3/StaysSearch dla wyników wyszukiwania, /api/v3/PdpPlatformSections dla szczegółów oferty). To oznacza, że większość przydatnych danych wymaga pełnej przeglądarki albo przechwytywania API.
DOM zmienia się bez przerwy
Airbnb używa CSS-in-JS z haszowanymi nazwami klas, które zmieniają się przy każdym wdrożeniu. Udokumentowane przykłady to _tyxjp1, lxq01kf, atm_mk_h2mmj6, t1jojoys i _8s3ctt. Jak wyjaśnia : „Te klasy nie są zaprojektowane tak, by były stabilne, i mogą zmienić się w dowolnym momencie, często bez żadnych widocznych zmian na stronie.”
Społeczność deweloperska dokładnie opisała ten problem. , że „klasy CSS zmieniają się cały czas, a poleganie na nich to szybki sposób na zepsucie scrapera”. Jeden doświadczony programista na DEV Community dobrze to podsumował: „Scraper, który działa o 50% wolniej, ale nigdy się nie psuje, jest nieskończenie bardziej wartościowy niż szybki, który umiera co tydzień.”
Szacunki branżowe sugerują, że z powodu zmian w DOM, aktualizacji fingerprintingu albo ograniczania punktów końcowych.
Wybierz podejście: 5 sposobów na scrapowanie Airbnb
Zanim przejdziemy do kodu, oto porównanie. Każde podejście ma realne kompromisy — nie istnieje metoda uniwersalnie „najlepsza”.
| Podejście | Nakład pracy przy konfiguracji | Szybkość | Odporność na boty | Utrzymanie | Najlepsze dla |
|---|---|---|---|---|---|
Czysty HTTP (requests / pyairbnb) | Niski | Szybkie | Średnia (wrażliwe na zmiany API) | Średnie | Szybkie badania, małe zbiory danych |
| Automatyzacja przeglądarki (Selenium) | Wysoki | Wolne | Średnia | Wysokie (psucie przez DOM) | Dynamiczna treść, ceny zależne od dat |
| Automatyzacja przeglądarki (Playwright) | Średni | Średnie | Średnio-wysoka | Średnie | Nowoczesna alternatywa dla Selenium |
| Scraping API (ScrapingBee, Bright Data) | Niski | Szybkie | Wysoka (wbudowana rotacja proxy) | Niskie | Scrapowanie na skalę, użycie produkcyjne |
| No-code (Thunderbit) | Minimalny | Szybkie | Wysoka (AI dostosowuje się do zmian układu) | Brak | Osoby nietechniczne, jednorazowa analiza |
Reszta artykułu przeprowadzi Cię krok po kroku przez podejścia w Pythonie, a na końcu znajdziesz sekcję no-code dla tych, którzy wolą całkiem pominąć kod.
Krok po kroku: scrapowanie Airbnb w Pythonie z użyciem Requests (podejście HTTP-first)
To lekka, szybka opcja startowa — bez przeglądarki, bez problemów z chromedriverem. Kompromis: działa dla części danych, ale nie dla wszystkich.
Konfiguracja środowiska Pythona
Utwórz folder projektu i skonfiguruj środowisko wirtualne:
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 to lekka biblioteka (, ostatnia wersja z lutego 2026), która przechwytuje wewnętrzne API GraphQL StaysSearch Airbnb. W ogóle nie scrapuje HTML-a, dzięki czemu jest odporna na zmiany klas CSS. Model utrzymywany przez jedną osobę to czynnik ryzyka, ale projekt jest aktywnie rozwijany.
Opcja A: użycie pyairbnb do szybkich wyników wyszukiwania
Najszybsza droga do ustrukturyzowanych danych z Airbnb:
1import pyairbnb
2import pandas as pd
3# Wyszukiwanie według lokalizacji i dat
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# Konwersja do DataFrame
12df = pd.DataFrame(results)
13print(df[['name', 'price', 'rating', 'reviewsCount', 'url']].head())
14df.to_csv("airbnb_austin.csv", index=False)
pyairbnb obsługuje też get_details(), get_price(), get_reviews(), get_calendar() i get_listings_from_user(). Wszystkie funkcje przyjmują parametr proxy URL do rotacji.
Opcja B: ręczne żądania HTTP z BeautifulSoup
Jeśli wolisz nie polegać na bibliotece zewnętrznej, możesz wysyłać żądania bezpośrednio. Uwaga: zwykłe requests szybko dostają blokadę z powodu fingerprintingu TLS. Użycie curl_cffi (które podszywa się pod TLS przeglądarki) znacząco poprawia skuteczność.
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")
Wyodrębnianie danych z mikroformatów Schema.org
Airbnb osadza mikroformaty schema.org bezpośrednio w HTML-u — a te semantyczne znaczniki są . Szukaj kontenerów 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)
Ograniczenie: znaczniki schema.org dają nazwy ofert, adresy URL i pozycje — ale nie ceny, oceny ani udogodnienia. Do bogatszych danych potrzebujesz automatyzacji przeglądarki albo przechwytywania API.
Krok po kroku: scrapowanie Airbnb w Pythonie z użyciem Selenium lub Playwright
Gdy potrzebujesz dynamicznej treści — cen zależnych od dat, udogodnień ukrytych za przyciskiem „Pokaż więcej”, pełnego tekstu recenzji — automatyzacja przeglądarki jest właściwym narzędziem.
Kiedy używać automatyzacji przeglądarki
- Strony wymagające wybrania dat, aby pokazać rzeczywistą cenę
- Udogodnienia i recenzje ukryte za interaktywnymi elementami
- Każde dane ładowane dopiero po wykonaniu JavaScriptu
- Gdy trzeba wchodzić w interakcję ze stroną (przewijanie, klikanie)
Selenium kontra Playwright: Playwright wygrał (w większości)
Playwright wyprzedził Selenium jako preferowane narzędzie do automatyzacji przeglądarki. Jest szybszy, ma wbudowaną obsługę async, automatycznie instaluje binaria przeglądarki i lepiej radzi sobie z nowoczesnymi aplikacjami webowymi. Utrzymujący się problem Selenium z — gdy ChromeDriver pozostaje w tyle za aktualizacjami Chrome — nadal jest stałym źródłem frustracji.
To powiedziawszy, Selenium ma większy ekosystem poradników i odpowiedzi na Stack Overflow — więc użyj tego, z czym czujesz się pewniej.
Konfiguracja Playwright
1pip install playwright playwright-stealth
2playwright install chromium
Nawigacja do Airbnb i pobieranie ofert
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 jest bardziej ryzykowne
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 # Czekaj na karty ofert, używając data-testid (stabilniejsze niż klasy)
17 await page.wait_for_selector('[data-testid="card-container"]', timeout=15000)
18 # Pobieranie danych ofert
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())
Przechwytywanie API GraphQL (najbardziej niezawodna metoda DIY)
Zamiast parsować elementy DOM, które ciągle się psują, możesz przechwytywać wewnętrzne wywołania API Airbnb. Zwraca to czysty, ustrukturyzowany 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# Parsowanie odpowiedzi API
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')}")
Odpowiedź StaysSearch zawiera id, name, roomTypeCategory, bedrooms, bathrooms, personCapacity, avgRating, reviewsCount, isSuperhost oraz pełne rozbicie cen. To te same dane, których frontend Airbnb używa do renderowania strony.
Obsługa paginacji
Airbnb pokazuje około 18 ofert na stronę i używa parametru URL items_offset. Maksimum to mniej więcej 17 stron (~300 ofert na jedno wyszukiwanie).
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): # Maks. ok. 17 stron
6 offset = page_num * 18
7 paginated_url = f"{base_url}&items_offset={offset}"
8 # ... nawigacja i scrapowanie jak wyżej ...
9 time.sleep(random.uniform(3, 7)) # Losowa przerwa między stronami
Jak scrapować ceny Airbnb w Pythonie (rozwiązanie problemu cen zależnych od dat)
To sekcja, którą większość poradników pomija — a właśnie ona ma największe znaczenie w analizie cen.
Dlaczego ceny Airbnb nie pojawiają się bez dat
W około 90% przypadków Airbnb wymaga dat zameldowania i wymeldowania, zanim pokaże prawdziwą cenę. Bez dat dostajesz ogólny zakres „cena za noc” albo czasem w ogóle brak ceny. Jak zauważa : „Jeśli oferta nie pokazuje ceny (na przykład gdy Airbnb chce, byś zmienił daty lub liczbę gości), funkcja po prostu zwraca None.”
Dobra wiadomość: od kwietnia 2025 roku Airbnb domyślnie wszystkim gościom na świecie. Wcześniej dostępny był przełącznik „Pokaż cenę całkowitą” — użyło go prawie 17 milionów gości, zanim stał się ustawieniem domyślnym.
Przekazywanie dat przez parametry URL
Zawsze uwzględniaj checkin i checkout w adresie wyszukiwania:
1https://www.airbnb.com/s/Austin--TX/homes?checkin=2025-08-01&checkout=2025-08-03&adults=2
To sprawia, że Airbnb zwraca rzeczywiste ceny za noc i ceny całkowite w odpowiedziach strony oraz API.
Iterowanie po zakresach dat do analizy cen
Dla gospodarzy i inwestorów, którzy potrzebują danych cenowych z różnych sezonów:
1from datetime import datetime, timedelta
2start_date = datetime(2025, 7, 1)
3end_date = datetime(2025, 12, 31)
4stay_length = 2 # noce
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) # Tygodniowe odstępy
12for checkin, checkout in date_ranges:
13 url = f"https://www.airbnb.com/s/Austin--TX/homes?checkin={checkin}&checkout={checkout}&adults=2"
14 # ... scrapowanie danych cenowych ...
15 time.sleep(random.uniform(5, 10)) # Zachowaj rozsądne tempo
Podczas parsowania cen z odpowiedzi API GraphQL szukaj obiektu pricingQuote, który zawiera price.total, price.priceItems (pojedyncze pozycje, takie jak opłata za sprzątanie czy opłata serwisowa) oraz rate.amount (stawka za noc).
Jak sprawić, by Twój scraper Airbnb w Pythonie przetrwał redesign strony
To sekcja o utrzymaniu, której nikt nie chce pisać — ale prawdopodobnie najważniejsza część każdego projektu scrapowania Airbnb.
Selektory kruche kontra odporne
| Strategia selektora | Ryzyko awarii | Nakład kodu | Przykład |
|---|---|---|---|
Nazwy klas CSS (np. .t1jojoys) | 🔴 Wysokie — zmieniają się często | Niskie | soup.select('.t1jojoys') |
Atrybuty data-testid | 🟡 Średnie — bardziej stabilne | Niskie | soup.select('[data-testid="listing-card-title"]') |
| Mikroformaty Schema.org w HTML | 🟢 Niskie — standard strukturalny | Średnie | soup.find("meta", itemprop="name") |
| Przechwytywanie API GraphQL | 🟢 Niskie — ustrukturyzowany JSON | Średnie | response.json()["data"]["presentation"] |
| Ekstrakcja oparta na AI (Thunderbit) | 🟢 Brak — dostosowuje się automatycznie | Brak | interfejs 2 kliknięć, bez kodu |
Używanie atrybutów data-testid
Obecnie udokumentowane wartości data-testid na Airbnb obejmują card-container, listing-card-title, listing-card-subtitle i listing-card-name. Są one powiązane z wewnętrznym frameworkiem testowym Airbnb, a nie z warstwą wizualną, więc zmieniają się rzadziej niż klasy CSS. Nadal mogą się zmienić — po prostu mniej często.
1# Bardziej odporne niż selektory oparte na klasach
2title = await page.query_selector('[data-testid="listing-card-title"]')
Używanie mikroformatów Schema.org
Airbnb używa atrybutów itemprop bezpośrednio w HTML-u. Trzymają się one standardów webowych i zmieniają się znacznie rzadziej niż wizualne klasy CSS:
1# Pobranie wszystkich elementów ofert z użyciem znaczników schema.org
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"]
Przechwytywanie API GraphQL
Najbardziej niezawodne podejście DIY. Wewnętrzne API Airbnb zwraca czysty JSON, który jest ustrukturyzowany pod konsumpcję przez frontend. Format odpowiedzi zmienia się rzadziej niż DOM, bo korzysta z niego również sam zespół frontendowy.
Dlaczego ekstrakcja oparta na AI całkowicie usuwa problem utrzymania
Nawet najlepsze strategie selektorów w końcu się psują. Wartości data-testid są zmieniane. Struktury odpowiedzi API dostają wersje. Jedynym podejściem, które naprawdę eliminuje utrzymanie, jest takie, które za każdym razem odczytuje stronę na nowo przy użyciu AI — bez żadnych zakodowanych na sztywno selektorów. Więcej na ten temat w sekcji o Thunderbit poniżej.
Jak uniknąć blokady podczas scrapowania Airbnb
Praktyczne wskazówki oparte na doświadczeniu i konsensusie społeczności.
Rotuj proxy (residential są obowiązkowe)
Adresy IP z centrów danych są przez Airbnb blokowane natychmiast. Proxy residential są wymagane przy każdej sensownej skali. Najlepsi dostawcy pod względem wydajności i ceny:
| Dostawca | Cena (za GB) | Skuteczność | Uwagi |
|---|---|---|---|
| Decodo (dawniej Smartproxy) | ok. $2.20/GB przy 100 GB | 99,68% | Najszybszy zmierzony czas odpowiedzi (0,54 s) |
| Bright Data | ok. $5.04/GB przy 100 GB | 99%+ | Największa pula, najwięcej funkcji |
| Oxylabs | ok. $4/GB przy 100 GB | 99%+ | Mocne w e-commerce |
Ważna wskazówka dotycząca rotacji od doświadczonego programisty: „Rotowanie IP przy każdym żądaniu to w rzeczywistości sygnał ostrzegawczy. Prawdziwi użytkownicy trzymają ten sam IP przez całą sesję.” Zalecane są więc przyklejone sesje trwające 5–10 minut, z rotacją co 20–30 żądań.
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")
Ogranicz tempo żądań
Konsensus społeczności co do bezpiecznych progów:
- Maks. liczba stron na godzinę: ≤100 (~1,6/min)
- Opóźnienie między żądaniami: 3–10 sekund (losowo, najlepiej rozkład gaussowski)
- Przerwy w sesji: co 20 żądań zrób 30–60 sekund przerwy
- Optymalne okno scrapowania: godziny poza szczytem (~2:00 lokalnego czasu)
- Przy błędach 429: wykładniczy backoff z losowym dodatkiem
1import random
2import time
3delay = random.gauss(5, 1.5) # Średnia 5 s, odchylenie standardowe 1,5
4delay = max(2, min(delay, 10)) # Ogranicz do 2–10 sekund
5time.sleep(delay)
Używaj kompletnych i spójnych nagłówków
Brak nagłówków Sec-Fetch-* to . Każdy nagłówek musi być wewnętrznie spójny — jeśli User-Agent twierdzi, że to Chrome 131 na Windowsie, wszystkie pozostałe nagłówki muszą odpowiadać tej tożsamości.
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}
Używaj przeglądarek headless ostrożnie
W Playwright pakiet playwright-stealth łata około 17 modułów omijających wykrywanie (navigator.webdriver, plugins, languages, WebGL). Jednak nowoczesne systemy antybotowe sprawdzają ponad 40 właściwości, podczas gdy łatanych jest około 12. Uruchamianie w trybie nie-headless (headless=False) jest bezpieczniejsze, ale wolniejsze.
W Selenium undetected-chromedriver łata binarkę ChromeDriver, aby usunąć wskaźniki automatyzacji, ale tryb headless nadal pozostaje niestabilny.
Rozważ API do scrapowania przy większej skali
Jeśli scrapujesz tysiące stron, API do scrapowania zajmie się rotacją proxy, rozwiązywaniem CAPTCHA i renderowaniem JS. W Bright Data osiągnęło 99% skuteczności przy 48 polach na ofertę. Kompromis to koszt — stealth proxy mode w ScrapingBee kosztuje , więc plan za 49 USD miesięcznie daje tylko około 3 333 żądania stealth.
Scrapowanie Airbnb bez Pythona: alternatywa no-code z Thunderbit
Nie każdy, kto scrapuje Airbnb, jest programistą. Gospodarze chcą porównań cen. Inwestorzy chcą danych rynkowych. Analitycy chcą arkusza kalkulacyjnego. Jeśli czytając sekcje o Pythonie pomyślałeś: „to więcej utrzymania, niż się zapisywałem”, ta część jest dla Ciebie.
Jak Thunderbit scrapuje Airbnb w kilka kliknięć
to AI Web Scraper działający jako . Oto przepływ pracy:
- Zainstaluj rozszerzenie z Chrome Web Store
- Przejdź do strony wyników wyszukiwania Airbnb — uwzględnij daty w URL-u, aby uzyskać dokładne ceny (np.
?checkin=2025-08-01&checkout=2025-08-03) - Kliknij „AI Suggest Fields” — Thunderbit skanuje stronę i automatycznie wykrywa kolumny, takie jak nazwa oferty, cena, ocena, lokalizacja i URL
- Kliknij „Scrape” — dane pojawiają się w ustrukturyzowanej tabeli
- Użyj „Scrape Subpages”, aby wejść na każdą stronę szczegółów oferty i pobrać udogodnienia, recenzje, informacje o gospodarzu oraz pełne rozbicie cen — bez dodatkowej konfiguracji
- Eksportuj do Google Sheets, Excela, Airtable albo Notion
Funkcja scrapowania podstron ma tu ogromne znaczenie. W podejściach Pythonowych scrapowanie stron szczegółów oznacza pisanie osobnej logiki parsowania, obsługę paginacji w recenzjach i zarządzanie żądaniami równoległymi. W Thunderbit to jedno kliknięcie.
Dlaczego Thunderbit rozwiązuje trzy największe problemy scrapowania Airbnb
Trzy problemy opisane wcześniej — ochrona antybotowa, renderowanie JavaScriptu i psujący się DOM — to właśnie to, co sprawia, że scrapery w Pythonie wymagają dużo utrzymania. Thunderbit radzi sobie ze wszystkimi trzema:
- Brak problemów z blokadą IP: tryb Cloud Scraping w Thunderbit wewnętrznie obsługuje rotację proxy
- Brak psujących się selektorów: AI odczytuje stronę na nowo za każdym razem — bez selektorów CSS do utrzymywania i bez kodu do aktualizacji przy redesignie Airbnb
- Brak problemów z konfiguracją: bez sterowników Selenium, bez środowiska Pythona, bez konfliktów zależności
- Planowane scrapowanie: opisz interwał czasowy zwykłym językiem, aby monitorować ceny w czasie — świetne do dynamicznego ustalania cen i śledzenia konkurencji
Kiedy używać Pythona, a kiedy Thunderbit
To nie jest wybór „albo-albo” — wszystko zależy od potrzeb:
| Potrzeba | Python | Thunderbit |
|---|---|---|
| Pełna kontrola nad logiką scrapowania | ✅ Tak | ❌ Nie |
| Działa bez umiejętności kodowania | ❌ Nie | ✅ Tak |
| Automatyczna obsługa zmian w DOM | ❌ Nie | ✅ Tak (oparte na AI) |
| Scrapowanie podstron (stron szczegółów) | Złożona konfiguracja | 1 kliknięcie |
| Planowane/powtarzalne scrapowanie | Własny cron job | Wbudowany harmonogram |
| Eksport do Sheets/Excel/Airtable | Ręczny kod | Wbudowany |
| Integracja z potokami danych | ✅ Tak | Ograniczona |
| Koszt przy dużej skali (10 tys. + stron) | Koszty serwera + proxy | Cennik Thunderbit |
Jeśli potrzebujesz kontroli na poziomie kodu, logiki niestandardowej albo integracji z istniejącym potokiem danych, wybierz Pythona. Jeśli potrzebujesz danych szybko i bez utrzymania, Thunderbit to praktyczny wybór.
Wskazówki prawne i etyczne dotyczące scrapowania Airbnb
Zachowam to krótko i praktycznie — nie jestem prawnikiem i nie jest to porada prawna.
Co ogólnie mówi prawo:
- Orzeczenie ustanowiło, że scrapowanie publicznych danych ze stron niewymagających uwierzytelnienia nie narusza CFAA
- (styczeń 2024): sędzia orzekł, że Warunki korzystania nie wiążą scraperów niezalogowanych
- Sprawa (2025) wprowadza nowatorską teorię, że obchodzenie CAPTCHA i limitów może naruszać przepisy DMCA o obchodzeniu zabezpieczeń — to jeszcze nie zostało przetestowane, ale warto to śledzić
Co mówi Airbnb: ich wprost zakazują automatycznego zbierania danych. Jednak Airbnb nigdy publicznie nie pozwało scrapera. działa od ponad 11 lat bez wyzwania prawnego, mimo że Airbnb nazwało go „śmieciami”.
Praktyczne zasady:
- Scrapuj tylko publicznie dostępne dane (nie omijaj ekranów logowania)
- Przestrzegaj wytycznych
robots.txt - Nie obciążaj serwerów agresywnym tempem żądań
- Ostrożnie obchodź się z danymi osobowymi zgodnie z GDPR/CCPA
- W przypadku zastosowań komercyjnych skonsultuj się z prawnikiem
Podsumowanie i najważniejsze wnioski
Scrapowanie Airbnb mieści się na spektrum od „szybko i byle jak” do „gotowe produkcyjnie”. Najważniejsze wnioski:
- Zawsze przekazuj daty w URL-u (
checkinicheckout) — bez nich dane cenowe są bezużyteczne - Nie opieraj się na nazwach klas CSS. Zamiast tego używaj atrybutów
data-testid, mikroformatów schema.org albo przechwytywania API GraphQL - Proxy residential są obowiązkowe przy większej skali. IP z centrów danych są blokowane natychmiast
- Ogranicz tempo żądań — losowe opóźnienia 3–10 sekund, sticky sessions i wykładniczy backoff przy błędach
- Do scrapowania bez utrzymania narzędzia oparte na AI, takie jak , całkowicie eliminują problem psujących się selektorów — właśnie ten problem sprawia, że scrapery w Pythonie są kosztowne w utrzymaniu
- Dopasuj narzędzie do projektu. Szybkie badania?
pyairbnb. Analiza dynamicznych cen? Playwright z przechwytywaniem API. Ciągły monitoring bez kodu? Thunderbit. Skala produkcyjna? API do scrapowania.
Aby przetestować ścieżkę no-code, — możesz sprawdzić go na kilku stronach wyników Airbnb w około dwie minuty. W przypadku podejścia Pythonowego wszystkie wzorce kodu z tego artykułu są gotowe do dostosowania do Twojego konkretnego przypadku użycia.
Więcej o podejściach i narzędziach do web scrapingu znajdziesz w naszych poradnikach: , oraz . Możesz też obejrzeć poradniki na .
FAQ
Czy Airbnb może zablokować za scrapowanie?
Tak. Airbnb używa Akamai Bot Manager z fingerprintingiem TLS, wyzwaniami JavaScript, fingerprintingiem przeglądarki i oceną reputacji IP. Jeśli zostaniesz wykryty, otrzymasz odpowiedź 403, 429 albo CAPTCHA. Rotacja proxy, realistyczne nagłówki i ograniczanie tempa żądań zmniejszają ryzyko, ale przy dużej skali nie ma gwarantowanego sposobu na uniknięcie wykrycia.
Czy scrapowanie Airbnb jest legalne?
Scrapowanie publicznie dostępnych danych jest zwykle dopuszczalne w świetle orzecznictwa USA (hiQ v. LinkedIn, Meta v. Bright Data), ale Warunki korzystania Airbnb wyraźnie tego zabraniają. Sytuacja prawna zależy od jurysdykcji, a rozwijająca się teoria DMCA o obchodzeniu zabezpieczeń (Reddit v. Perplexity) może mieć wpływ na scrapery omijające mechanizmy antybotowe. W zastosowaniach komercyjnych skonsultuj się z prawnikiem.
Jakie dane można scrapować z Airbnb?
Z wyników wyszukiwania: nazwa oferty, cena (z datami), ocena, liczba recenzji, lokalizacja, typ nieruchomości i URL. Ze stron szczegółów: pełny opis, udogodnienia, informacje o gospodarzu, wszystkie recenzje, zdjęcia, dostępność w kalendarzu, opłaty za sprzątanie i rozbicie cen. Zakres zależy od tego, czy scrapujesz tylko strony wyników, czy także odwiedzasz pojedyncze strony ofert.
Czy potrzebuję proxy, żeby scrapować Airbnb w Pythonie?
Przy kilku stronach możesz poradzić sobie bez proxy. Przy czymkolwiek powyżej 20–30 żądań zdecydowanie zalecana jest rotacja proxy residential. IP z centrów danych są blokowane natychmiast. Konsensus społeczności sugeruje maksymalnie około 100 stron na godzinę z jednego IP i losowe opóźnienia 3–10 sekund między żądaniami.
Jaki jest najprostszy sposób na scrapowanie Airbnb bez kodowania?
pozwala scrapować wyniki wyszukiwania Airbnb i strony szczegółów ofert z wykrywaniem pól wspieranym przez AI — bez konfiguracji selektorów i bez pisania kodu. Obsługuje scrapowanie podstron (udogodnienia, recenzje i informacje o gospodarzu), eksport do Google Sheets, Excela, Airtable lub Notion oraz oferuje planowane scrapowanie do ciągłego monitorowania cen.
Dowiedz się więcej
