Redfin aktualizuje 70% nowych ofert MLS w USA w ciągu pięciu minut od ich pojawienia się w systemie. Taka świeżość danych to prawdziwy magnes dla każdego, kto buduje pipeline danych o nieruchomościach — i właśnie dlatego tak wiele scraperów celuje w Redfin, a potem zostaje zablokowanych w kilka minut.
Od lat pracuję nad narzędziami do ekstrakcji danych w Thunderbit i mogę powiedzieć jedno: przepaść między „pobrać dane z Redfin” a „pobrać dane z Redfin bez blokady” to miejsce, w którym większość poradników się rozsypuje. Pokazują kod oparty na BeautifulSoup, pomijają moment, w którym Cloudflare zjada Twoje zapytania żywcem, i zostawiają Cię z kodem 403 oraz pytaniem, co poszło nie tak. Ten przewodnik jest inny. Przeprowadzę Cię przez trzy realne podejścia — parsowanie HTML, ukryte API Redfin oraz ścieżkę no-code z Thunderbit — a sporo miejsca poświęcę też zabezpieczeniom anty-bot, które naprawdę mają znaczenie. Na końcu będziesz dokładnie wiedzieć, która metoda pasuje do Twoich umiejętności, skali i tolerancji na problemy z utrzymaniem.
Wypróbuj Thunderbit do pobierania danych z Redfin
Czym jest Redfin i dlaczego jego dane są tak ważne?
Redfin to biuro nieruchomości oparte na technologii, z agentami na pensji, którzy pobierają oferty bezpośrednio z feedów MLS. Obejmuje ponad 100 metropolii w USA i Kanadzie w 42 stanach i obsługuje prawie 50 milionów użytkowników miesięcznie. W przeciwieństwie do portali będących jedynie agregatorami, dane Redfin są weryfikowane przez agentów, a własny model Redfin Estimate AVM obejmuje ponad 95 milionów nieruchomości przy medianie błędu zaledwie 1,96% dla domów dostępnych na rynku.

To połączenie — świeżość na poziomie MLS, jakość potwierdzana przez brokerów i precyzyjny AVM — sprawia, że inwestorzy nieruchomości, agenci, startupy proptech i analitycy danych chcą programowego dostępu do danych Redfin. Python jest do tego naturalnym wyborem: ekosystem do scrapingu (requests, BeautifulSoup, Selenium, Playwright) jest dojrzały, wsparcie społeczności ogromne, a integracja z pandas i Jupyterem do analizy działa bezproblemowo.
Dlaczego warto pobierać dane z Redfin w Pythonie?
Zastosowania są tak różne, jak osoby, które potrzebują tych danych. Oto, jak różne grupy zwykle wykorzystują dane pobrane z Redfin:
| Odbiorca | Główny cel pobierania danych | Przykładowe zastosowanie |
|---|---|---|
| Agenci nieruchomości | Pozyskiwanie leadów, analiza rynku | Nowe oferty i wygasłe oferty w obszarze działania; katalog agentów do analizy konkurencji |
| Inwestorzy nieruchomości | Deal flow, analiza stopy kapitalizacji | Wyszukiwanie rentowności najmu, wykrywanie niedowartościowanych nieruchomości, codzienne alerty o nowych ofertach |
| Startupy proptech | Pipeline danych produktowych | Dane treningowe do AVM, dashboardy rynkowe, silniki przejęć dla iBuyerów |
| Analitycy danych | Badania rynku, BI | Trendy mediany cen na poziomie ZIP code, szeregi czasowe dni na rynku, wskaźniki sprzedaż/oferta |
| Hurtownicy / flipperzy | Monitorowanie nieruchomości w złym stanie | Wykrywanie obniżek cen, egzekucji, porównań poza rynkiem |
Szerszy trend to potwierdza: ponad 72% firm z branży nieruchomości korzysta dziś z analityki predykcyjnej, by identyfikować okazje i zarządzać ryzykiem. Rynek PropTech ma osiągnąć 47 mld USD w 2025 roku przy CAGR 16,4%. Strukturalne dane o nieruchomościach nie są już „miłym dodatkiem” — to dziś absolutna podstawa.
Wszystkie pola danych Redfin, które możesz pobrać (pełna lista)
Zanim napiszesz choćby jedną linię kodu, musisz wiedzieć, co właściwie jest dostępne. Przeanalizowałem strony wyników wyszukiwania Redfin, strony szczegółów nieruchomości i profile agentów — a także porównałem je z open-source’owymi wrapperami Stingray API, takimi jak projekty reteps/redfin i RedfinPlus. Łącznie daje to 117 unikalnych pól w różnych typach stron.
Ta tabela nadaje się do zapisania w zakładkach. Znajomość schematu danych przed rozpoczęciem pracy oszczędza godziny szukania selektorów metodą prób i błędów.
Pola na stronie wyników wyszukiwania
To lekkie pola dostępne na kartach ofert — często możliwe do pobrania bez pełnego renderowania JS:
| Pole | Typ danych | Uwagi |
|---|---|---|
| ID nieruchomości | Liczba | Wewnętrzny identyfikator Redfin, parsowany z /home/{id} w href |
| Cena ofertowa | Liczba | |
| Pełny adres | Tekst | |
| Liczba sypialni / łazienek / stóp kw. | Liczba | Trzy wartości po kolei |
| Typ nieruchomości | Wybór pojedynczy | SFH, Condo, Townhouse, Multi |
| Status | Tekst | Active, Pending, Contingent |
| Liczba dni na rynku | Liczba | |
| Wskaźnik obniżki ceny | Liczba | Różnica względem ceny początkowej |
| Główne zdjęcie | URL obrazu | Jedno zdjęcie na kartę |
| Odznaka Hot Home | Wartość logiczna | |
| Data/godzina open house | Tekst | |
| Atrybucja biura | Tekst |
Pola na stronie szczegółów nieruchomości
Strona szczegółów to miejsce, gdzie kryje się prawdziwa głębia. Wiele z tych pól wymaga renderowania JavaScript lub korzystania z API Stingray:
| Pole | Typ danych | Uwagi |
|---|---|---|
| Redfin Estimate (na rynku) | Liczba | Przez /stingray/api/home/details/avm |
| Redfin Estimate (poza rynkiem) | Liczba | Przez /stingray/api/home/details/owner-estimate; mediana błędu 7,52% |
| Rok budowy / modernizacji | Liczba | |
| Wielkość działki | Liczba | |
| Opłaty HOA | Liczba | Miesięczne, jeśli dotyczą |
| Podatek od nieruchomości (roczny) | Liczba | |
| Oszacowana wartość podatkowa | Liczba | |
| Tabela historii sprzedaży | Tabela | Cena, data, typ zdarzenia |
| Opis nieruchomości | Tekst | Akapit marketingowy |
| URL-e zdjęć (karuzela) | URL-e obrazów | 20+ na ofertę |
| Imię, telefon, e-mail agenta | Tekst / Telefon / E-mail | Telefon często maskowany |
| Oceny szkół (podstawowa/gimnazjum/liceum) | Liczba | Plus nazwa okręgu szkolnego |
| Walk / Transit / Bike Score | Liczba | |
| Oceny ryzyka klimatycznego | Liczba | Powódź, pożar, upał, wiatr |
| Podobne aktywne / sprzedane / pobliskie domy | URL-e | Dane z karuzeli |
| Parking, garaż, ogrzewanie, klimatyzacja | Tekst | Grupy udogodnień |
Pola profilu agenta
| Pole | Typ danych | Uwagi |
|---|---|---|
| Imię agenta, zdjęcie, biuro, bio | Tekst / Obraz | |
| Telefon, formularz kontaktowy | Telefon / Tekst | Kliknij, by ujawnić |
| Liczba aktywnych ofert | Liczba | |
| Sprzedaż z ostatnich 12 miesięcy / łączny wolumen | Liczba | |
| Średni stosunek ceny ofertowej do sprzedaży | Liczba | |
| Ocena w gwiazdkach / liczba opinii | Liczba | |
| Lata doświadczenia / nr licencji | Tekst / Liczba |
Jeśli użyjesz funkcji Thunderbit AI Suggest Fields na stronie Redfin, narzędzie automatycznie wykryje większość z tych kolumn i przypisze właściwe typy danych — bez ręcznego mapowania selektorów CSS. Wrócimy do tego za chwilę.
Jak Redfin blokuje scraperów? Rozbijamy zabezpieczenia anty-bot na czynniki pierwsze
Tu chcę postawić sprawę jasno, bo większość poradników przeskakuje temat blokad i od razu przechodzi do „kup proxy od naszego sponsora”. To nie pomaga. Jeśli nie rozumiesz co Redfin robi, aby wykrywać scraperów, przepalisz kredyty proxy i i tak zostaniesz zablokowany. ScrapeOps ocenia trudność anty-bot Redfin na 7,5/10, a Scraperly klasyfikuje ją jako średnią (3/5) — „mniej agresywną niż enterprise WAF Zillow, opartą na własnym rate limitingu i wyzwaniach JavaScript”.
Redfin działa wielowarstwowo: Cloudflare na brzegu (wyzwanie JS, Turnstile, fingerprinting TLS/JA3) plus specyficzny dla Redfin limiter na poziomie aplikacji. W ich robots.txt nie ma dyrektywy Crawl-delay, bo egzekwowanie odbywa się na poziomie WAF.
Dlaczego zwykłe requests + BeautifulSoup nie działa na Redfin
Jeśli wyślesz zwykłe requests.get() do strony nieruchomości Redfin z domyślnymi nagłówkami, zwykle dzieje się to:
- HTTP 403 — wyzwanie JS od Cloudflare nie zostało rozwiązane, więc zamiast oferty dostajesz stronę challenge.
- Strona pośrednia z wyzwaniem — treść HTML zawiera widget Turnstile Cloudflare, a nie dane nieruchomości.
- HTTP 200 z niepełnym HTML — dostajesz powłokę z dużym osadzonym blobem JSON pod
root.__reactServerState.InitialContext, ale bez wyrenderowanych kart wyników, historii cen czy ocen szkół.
Redfin używa własnego frameworka React SSR (nie Next.js), a klucz hydratacji jest specyficzny dla Redfin — root.__reactServerState.InitialContext z danymi ofert zagnieżdżonymi w ReactServerAgent.cache.dataCache. To nie jest __NEXT_DATA__ ani window.__INITIAL_STATE__.
Najczęstsza przyczyna cichych 403? Brak nagłówków Sec-Fetch-*. Redfin/Cloudflare jawnie sprawdza Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-Dest i Sec-Fetch-User. Jeśli ich nie ma, od razu trafiasz na listę podejrzanych.
Plan działania: opóźnienia, nagłówki, proxy i sesje
Oto pełne zestawienie mechanizmów obronnych i sposobów ich obejścia:
| Zabezpieczenie Redfin | Co robi | Sygnał wykrycia | Strategia obejścia |
|---|---|---|---|
| Wyzwanie JS Cloudflare | Strona pośrednia wydająca cookie cf_clearance | 403 + HTML Cloudflare | curl_cffi z impersonate="chrome120"; rozgrzanie sesji przez stronę główną; proxy z amerykańskim IP residential |
| Cloudflare Turnstile | Interaktywny CAPTCHA dla sesji wysokiego ryzyka | 403 + widget Turnstile | Headless browser z stealth + proxy residential |
| Błąd Cloudflare 1020 (ban ASN) | Blokuje podejrzane IP/ASN na poziomie WAF | Treść 403 „Error 1020 Access Denied” | Rotacja na proxy residential/mobile; nigdy nie używaj ASN z data center |
| Fingerprinting TLS/JA3 | Wykrywa stos TLS nieprzypominający przeglądarki | Cichy 403 mimo dobrych nagłówków | Impersonacja w curl_cffi lub prawdziwa przeglądarka |
| Fingerprinting HTTP/2 | Sprawdza SETTINGS HTTP/2 i kolejność HPACK | Cicha blokada | curl_cffi mówi HTTP/2 jak Chrome |
| Walidacja nagłówków (UA, Sec-Fetch-*) | Zestaw nagłówków zgodny z przeglądarką | 403 przy pierwszym żądaniu | Pełny zestaw nagłówków Chrome, w tym Sec-Fetch-Site/Mode/Dest/User, realistyczny Referer |
| Ciągłość cookies/sesji | Śledzi cf_clearance, RF_BROWSER_ID | Challenge przy zimnym wejściu na głęboki URL | Trwała sesja; najpierw rozgrzej na homepage |
| Rate limit na poziomie aplikacji | Limiter żądań per IP | 429 | Opóźnienie 2–5 s z jitterem; exponential backoff |
| Reputacja IP z data center | Blokuje znane ASN z DC | Natychmiastowe 1020/403 | Tylko proxy residential lub mobile w USA |
| Wykrywanie współbieżności | Wiele równoległych żądań z jednego IP | Nagła eskalacja do Turnstile | Maks. 2 równoległe połączenia na IP |
Praktyczne progi z testów społeczności:
- Bezpieczne tempo: 1 żądanie co 2–3 sekundy na IP
- Utrzymanie >20–30 żądań/min z jednego data center IP wywołuje challenge w ciągu kilku minut
- Miękkie limity schodzą po 5–15 minutach bez ruchu
- Bany na IP z data center (AWS, GCP, Azure, OVH) mogą trwać od godzin do dni
Standardowe Python requests (urllib3 + OpenSSL) generuje fingerprint JA3, który nie pasuje do żadnej przeglądarki — i zostaje zablokowany po cichu, nawet przy idealnych nagłówkach. Branżowym rozwiązaniem jest curl_cffi z impersonate="chrome120", który mówi TLS + HTTP/2 w sposób zgodny z Chrome.
Trzy sposoby pobierania danych z Redfin w Pythonie (i który wybrać)

Nie spotkałem jeszcze jednego poradnika konkurencyjnego, który porównywałby te trzy podejścia obok siebie. Oto macierz decyzyjna:
| Kryterium | Parsowanie HTML (BS4 + Selenium) | Ukryte API Stingray | Thunderbit (No-Code) |
|---|---|---|---|
| Trudność konfiguracji | Średnia (środowisko Python + driver przeglądarki) | Wysoka (reverse engineering endpointów) | Niska (instalacja rozszerzenia Chrome) |
| Ryzyko blokady anty-bot | Wysokie (żądania DOM są najbardziej widoczne) | Średnie (żądania podobne do API wyglądają czyściej) | Najniższe (korzysta z Twojej prawdziwej sesji przeglądarki) |
| Jakość struktury danych | Średnia (nieustrukturyzowany HTML → ręczne parsowanie) | Doskonała (wcześniej ustrukturyzowany JSON) | Wysoka (AI automatycznie wykrywa pola i typy) |
| Koszt utrzymania | Wysoki — jedna zmiana layoutu psuje selektory | Średni — endpointy mogą się zmienić bez ostrzeżenia | Najniższy — AI dopasowuje się do zmian layoutu |
| Skala | Niska–średnia (setki przy użyciu proxy) | Średnia–wysoka (tysiące, czystsze żądania) | Średnia (50 stron/wsad w cloud scraping) |
| Najlepsze dla | Deweloperów chcących pełnej kontroli | Deweloperów potrzebujących czystego JSON | Osób nietechnicznych, szybkich projektów, stałych potrzeb bez zasobów dev |
Warto podkreślić koszt utrzymania. Redfin wdrożył dwie generacje DOM kart — starszą (homecardV2Price) i obecną (span.bp-Homecard__Price--value). Historia issue na GitHubie pokazuje, że selektory CSS psują się mniej więcej co 6–12 miesięcy. Gdy tak się stanie, scraper oparty na BeautifulSoup potrafi paść z dnia na dzień. Detektor pól oparty na AI potrafi się dostosować.
Zanim zaczniesz
- Poziom trudności: średni (podejścia 1 i 2), początkujący (podejście 3)
- Czas potrzebny: ok. 30 minut dla podejścia 1 lub 2; ok. 5 minut dla podejścia 3
- Czego potrzebujesz:
- Python 3.8+ z pip (podejścia 1 i 2)
- Przeglądarka Chrome (wszystkie podejścia)
- Thunderbit Chrome Extension (podejście 3)
- Amerykańskie proxy residential przy dużej skali (podejścia 1 i 2)
Pobieraj dane Redfin z pomocą AI Get Started Free
Podejście 1: pobieranie danych z Redfin w Pythonie przez parsowanie HTML (BeautifulSoup + Selenium)
To ścieżka „pełnej kontroli”. Ty piszesz selektory, Ty zarządzasz przeglądarką, Ty obsługujesz błędy.
To też najbardziej edukacyjne podejście. I najbardziej kruche.
Krok 1: skonfiguruj środowisko Python
Utwórz środowisko wirtualne i zainstaluj wymagane biblioteki:
python -m venv redfin-scraper
source redfin-scraper/bin/activate # Windows: redfin-scraper\Scripts\activate
pip install requests beautifulsoup4 selenium webdriver-manager pandas curl_cffi
curl_cffi jest tu kluczowy — dzięki niemu Twoje żądania HTTP mogą udawać prawdziwy fingerprint TLS Chrome, zamiast standardowego fingerprintu Python requests, który Cloudflare blokuje natychmiast.
Krok 2: skonfiguruj nagłówki przeglądarki i sesję
Tu większość początkujących wpada w kłopoty. Potrzebujesz pełnego zestawu nagłówków Chrome, w tym Sec-Fetch-*, które Redfin/Cloudflare jawnie sprawdza:
from curl_cffi import requests as curl_requests
HEADERS = {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/120.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-Site": "none",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Dest": "document",
"Sec-Fetch-User": "?1",
}
session = curl_requests.Session(impersonate="chrome120")
session.headers.update(HEADERS)
# Rozgrzej sesję — zbierz cookies cf_clearance i RF_BROWSER_ID
session.get("https://www.redfin.com/")
Rozgrzanie sesji jest krytyczne — wejście bezpośrednio na głęboki URL nieruchomości (bez wcześniejszych cookies i bez Referer) jest przez Cloudflare oceniane gorzej.
Zawsze zaczynaj od strony głównej.
Krok 3: pobierz wyniki wyszukiwania Redfin
Po rozgrzaniu sesji możesz pobrać stronę wyników dla miasta i sparsować karty ofert. Aktualne selektory (2024–2026):
import time
import random
from bs4 import BeautifulSoup
base_url = "https://www.redfin.com/city/17151/CA/San-Francisco"
listings = []
for page_num in range(1, 6): # Strony 1-5
url = f"{base_url}/page-{page_num}" if page_num > 1 else base_url
resp = session.get(url)
if resp.status_code != 200:
print(f"Blokada na stronie {page_num}: HTTP {resp.status_code}")
break
soup = BeautifulSoup(resp.text, "html.parser")
cards = soup.select("[data-rf-test-id='property-card'], a.bp-Homecard")
for card in cards:
price_el = card.select_one("span.bp-Homecard__Price--value")
addr_el = card.select_one("a.bp-Homecard__Address")
stats = card.select("span.bp-Homecard__LockedStat--value")
listing = {
"price": price_el.text.strip() if price_el else None,
"address": addr_el.text.strip() if addr_el else None,
"beds": stats[0].text.strip() if len(stats) > 0 else None,
"baths": stats[1].text.strip() if len(stats) > 1 else None,
"sqft": stats[2].text.strip() if len(stats) > 2 else None,
"url": "https://www.redfin.com" + addr_el["href"] if addr_el else None,
}
listings.append(listing)
# Losowe opóźnienie 2–5 sekund
time.sleep(random.uniform(2, 5))
print(f"Pobrano {len(listings)} ofert")
Powinieneś zobaczyć rosnącą listę słowników, z których każdy zawiera cenę oferty w San Francisco, adres, liczbę sypialni/łazienek/stóp kwadratowych oraz URL do strony szczegółów. Jeśli dostajesz 0 kart, sprawdź kod HTTP — 403 oznacza, że Cloudflare Cię wykrył i prawdopodobnie potrzebujesz proxy residential.
Krok 4: pobierz szczegóły pojedynczych nieruchomości
Wyniki wyszukiwania dają podstawy. Strony szczegółów pokazują Redfin Estimate, rok budowy, HOA, historię sprzedaży, dane agenta i zdjęcia. Te strony wymagają renderowania JavaScript, więc przełącz się na Selenium:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
import time
options = webdriver.ChromeOptions()
options.add_argument("--headless=new")
options.add_argument("--disable-blink-features=AutomationControlled")
options.add_argument("user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
for listing in listings[:10]: # Wzbogacamy pierwsze 10
driver.get(listing["url"])
time.sleep(random.uniform(3, 6)) # Czekaj na renderowanie JS
try:
estimate_el = driver.find_element(By.CSS_SELECTOR, "[data-rf-test-name='avmLdpPrice']")
listing["redfin_estimate"] = estimate_el.text.strip()
except:
listing["redfin_estimate"] = None
try:
year_built = driver.find_element(By.XPATH, "//span[contains(text(),'Year Built')]/following-sibling::span")
listing["year_built"] = year_built.text.strip()
except:
listing["year_built"] = None
driver.quit()
Po tym kroku pierwsze 10 ofert powinno być wzbogacone o wartości Redfin Estimate i dane o roku budowy. Selektory XPath są w takich zagnieżdżonych polach wygodniejsze niż CSS, ale nadal są kruche — każda zmiana struktury DOM może je zepsuć.
Krok 5: obsłuż blokady i błędy
Wdroż logikę ponawiania z exponential backoff:
import time
def fetch_with_retry(session, url, max_retries=3):
for attempt in range(max_retries):
resp = session.get(url)
if resp.status_code == 200:
return resp
elif resp.status_code in (403, 429, 503):
wait = (2 ** attempt) + random.uniform(1, 3)
print(f"Blokada ({resp.status_code}). Ponowienie za {wait:.1f}s...")
time.sleep(wait)
else:
print(f"Nieoczekiwany status: {resp.status_code}")
break
return None
Objawy blokady: HTTP 403 z HTML Cloudflare w treści, HTTP 429 (jawny rate limit), pusty body odpowiedzi albo „Error 1020 Access Denied” w treści strony. Jeśli widzisz to regularnie, czas dodać proxy residential albo przejść na podejście z API.
Podejście 2: pobieranie danych z Redfin w Pythonie przez ukryte API Stingray
To moje ulubione podejście. Frontend Redfin komunikuje się z wewnętrznym JSON API pod /stingray/api/home/details/*, a odpowiedzi wracają jako czysty, typowany JSON — bez parsowania HTML.
Jak odkryć ukryte endpointy API Redfin
Otwórz Chrome DevTools → zakładka Network → filtr Fetch/XHR → przejdź na dowolną stronę nieruchomości Redfin. Zobaczysz żądania do endpointów takich jak:
api/home/details/initialInfo— mapuje URL → propertyId, listingIdapi/home/details/aboveTheFold— cena, liczba sypialni, łazienek, metraż, zdjęcia, status, agent, MLS#api/home/details/belowTheFold— udogodnienia, HOA, podatki, parking, rok budowy, działka, historiaapi/home/details/avm— Redfin Estimate dla ofert aktywnychapi/home/details/owner-estimate— Redfin Estimate dla ofert poza rynkiemapi/home/details/descriptiveParagraph— opis marketingowy
W przypadku stron najmu rentalId (UUID o długości 36 znaków) jest wyciągany z URL tagu <meta property="og:image">.
Pobieranie danych nieruchomości przez API Stingray
Jest tu ważny niuans: odpowiedzi JSON z Stingray mają prefiks w postaci dosłownego ciągu {}&& jako zabezpieczenie anty-CSRF. Trzeba go usunąć przed parsowaniem:
import json
from curl_cffi import requests as curl_requests
session = curl_requests.Session(impersonate="chrome120")
session.headers.update(HEADERS)
# Rozgrzej sesję
session.get("https://www.redfin.com/")
# Pobierz stronę nieruchomości, aby dostać cookies i property ID
property_url = "https://www.redfin.com/CA/San-Francisco/123-Main-St-94102/home/12345678"
page_resp = session.get(property_url)
# Teraz wywołaj API Stingray
api_url = "https://www.redfin.com/stingray/api/home/details/aboveTheFold?propertyId=12345678"
api_resp = session.get(api_url, headers={"Referer": property_url})
# Usuń prefiks anty-CSRF
payload = json.loads(api_resp.text.replace("{}&&", "", 1))
# Wyciągnij ustrukturyzowane dane
listing_data = payload.get("payload", {})
print(json.dumps(listing_data, indent=2))
Odpowiedź zawiera typowane pola: cena jako liczba całkowita, sypialnie i łazienki jako liczby, zdjęcia jako tablice URL-i, dane agenta jako zagnieżdżone obiekty. Bez BeautifulSoup, bez selektorów CSS, bez zgadywania.
Zalety i ograniczenia podejścia z ukrytym API
Zalety:
- JSON już ustrukturyzowany — dużo czyściej niż parsowanie HTML
- Szybsze pojedyncze żądania (mniejsze payloady, bez renderowania)
- Mniejsze ryzyko blokady (żądania podobne do API z poprawnymi nagłówkami wyglądają naturalniej)
Ograniczenia:
- Endpointy mogą się zmienić bez ostrzeżenia — brak oficjalnej dokumentacji
robots.txtwprost zabrania/stingray/dla wildcard user-agenta- Wymaga reverse engineeringu, by odkrywać nowe endpointy
- Nadal potrzebuje rozgrzania sesji i poprawnych nagłówków, by uniknąć Cloudflare
Alternatywa no-code: pobieranie danych z Redfin za pomocą Thunderbit
Jeśli potrzebujesz danych z Redfin i nie chcesz utrzymywać skryptów w Pythonie — albo po prostu chcesz rezultatów w pięć minut — zacznij tutaj. Zbudowaliśmy Thunderbit właśnie po to: ustrukturyzowana ekstrakcja danych z dowolnej strony bez kodu.
Krok 1: zainstaluj Thunderbit i przejdź do Redfin
Zainstaluj Thunderbit Chrome Extension ze sklepu Chrome Web Store. Otwórz Redfin i przejdź na stronę wyników wyszukiwania — na przykład oferty domów na sprzedaż w San Francisco.
Krok 2: kliknij „AI Suggest Fields”
Kliknij ikonę Thunderbit w pasku narzędzi przeglądarki, a następnie „AI Suggest Fields.” AI czyta stronę Redfin i automatycznie proponuje kolumny takie jak „Address”, „Price”, „Beds”, „Baths”, „SqFt”, „Property Type” i „Listing Photo” — z właściwymi typami danych przypisanymi automatycznie.
Możesz usunąć niepotrzebne kolumny albo dodać własne, klikając „+ Add Column” i opisując po prostu, czego potrzebujesz, zwykłym językiem (np. „listing agent name” albo „days on market”).
Powinieneś zobaczyć podgląd tabeli z przygotowanymi kolumnami, gotowy do zapełnienia.
Krok 3: kliknij „Scrape” i obserwuj, jak dane się pojawiają
Kliknij przycisk „Scrape”. Thunderbit przetwarza widoczne oferty i wypełnia tabelę. W przypadku wyników stronicowanych obsługuje paginację automatycznie — bez pisania pętli.
W moich testach tabela z 50 wierszami wypełnia się w około 45 sekund. Dane są ustrukturyzowane i gotowe do eksportu.
Jak Thunderbit radzi sobie z ochroną anty-bot Redfin
Ponieważ Thunderbit działa w Twojej własnej przeglądarce, dziedziczy istniejące cookies Redfin, sesję i fingerprint przeglądarki. Dla Cloudflare wygląda to jak zwykły użytkownik przeglądający Redfin — bo technicznie nim jest. Nie ma headless browsera, nie ma IP z data center, nie ma niepasującego fingerprintu TLS. Dla publicznie dostępnych stron cloud scraping Thunderbit potrafi przetworzyć 50 stron jednocześnie.
To zupełnie inny model niż wysyłanie requests z Pythona na serwerze.
Twoja sesja przeglądarki jest już zaufana.
Pobieranie podstron Redfin z Thunderbit
Po zebraniu wyników wyszukiwania kliknij „Scrape Subpages”, aby AI odwiedziło każdą stronę szczegółów nieruchomości i wzbogaciło tabelę o dodatkowe pola — Redfin Estimate, rok budowy, opłaty HOA, dane agenta, zdjęcia nieruchomości i historię sprzedaży.
To odpowiednik 40-liniowej pętli Selenium z podejścia 1 — z tą różnicą, że wymaga jednego kliknięcia i zerowego utrzymania.
Gdy Redfin zmienia DOM z homecardV2Price na span.bp-Homecard__Price--value, AI dostosowuje się. Twoje selektory w Pythonie — nie.
Pobieraj podstrony Redfin z pomocą AI Get Started Free
Więcej niż CSV: eksport danych Redfin do Google Sheets, Airtable i Notion
Większość poradników kończy się na df.to_csv(). To wystarczy do jednorazowej analizy. Ale jeśli pracujesz w zespole nieruchomości, potrzebujesz danych współdzielonych i żyjących — nie statycznych plików zalegających na czyimś pulpicie.
Eksport z Pythona (gspread + Airtable API)
Google Sheets przez gspread:
import gspread
import pandas as pd
from gspread_dataframe import set_with_dataframe
df = pd.DataFrame(listings)
gc = gspread.service_account(filename="service_account.json")
sh = gc.open("Redfin Listings")
ws = sh.worksheet("Sheet1")
ws.clear()
set_with_dataframe(ws, df, include_index=False, resize=True)
# Renderuj zdjęcia nieruchomości w komórkach przez formułę IMAGE()
image_col = df.columns.get_loc("image_url") + 1
for row_idx, url in enumerate(df["image_url"], start=2):
ws.update_cell(row_idx, image_col, f'=IMAGE("{url}")')
Uwaga: Sheets ma twardy limit 10 milionów komórek na arkusz, a API dopuszcza 300 odczytów + 300 zapisów na minutę na projekt. Przy czymś większym niż kilka dziesiątek wierszy używaj ws.batch_update() zamiast pętli po komórkach.
Airtable przez pyairtable:
Ważna zmiana z 2024 roku: Airtable wycofał stare klucze API 1 lutego 2024. Teraz trzeba używać Personal Access Tokens (PAT) — każdy poradnik nadal pokazujący api_key=... jest już nieaktualny.
from pyairtable import Api
api = Api("patXXXXXXXXXXXXXX.yyyyyyyyyyyyyyyyyyyy")
table = api.table("appBaseId123", "Redfin Listings")
records = [
{
"Address": row["address"],
"Price": row["price"],
"Beds": row["beds"],
"Photo": [{"url": row["image_url"]}], # Airtable pobiera i hostuje plik ponownie
}
for row in listings
]
created = table.batch_create(records, typecast=True)
Limit Airtable to 5 żądań na sekundę na bazę, z 30-sekundową blokadą przy naruszeniu limitu. Pole załącznika przyjmuje payload [{"url": ...}] — serwery Airtable pobierają URL, hostują go ponownie na swoim CDN i automatycznie generują miniatury.
Eksport z Thunderbit (1 klik do Sheets, Airtable, Notion)
Thunderbit ma natywny eksport 1 kliknięciem do Google Sheets, Airtable i Notion — a to, z czego jestem naprawdę dumny, to fakt, że zdjęcia nieruchomości są przesyłane i renderowane jako obrazy inline w Notion i Airtable. Bez sztuczek z =IMAGE(), bez uszkodzonych linków CDN. Klikasz „Export to Airtable”, a Twój zespół dostaje wizualną bazę nieruchomości z miniaturami, które można przeglądać na telefonie.
Dla zespołów nieruchomości, które pracują wizualnie na ofertach, to różnica między użytecznym narzędziem a stertą wierszy CSV.
Czy scrapowanie Redfin jest legalne? Co mówią ToS, robots.txt i orzecznictwo
Nie jestem prawnikiem i to nie jest porada prawna. Ale po latach pracy z ekstrakcją danych mogę powiedzieć jedno: pytanie „czy to legalne?” zadaje każdy, a większość poradników je omija.
robots.txt Redfin
robots.txt Redfin jest bardzo szczegółowy. Najważniejsze punkty:
- Boty całkowicie zablokowane:
peer39_crawler/1.0,AmazonAdBot,FireCrawlAgent— Redfin wymienia nawet popularne narzędzie scrapujące z ery LLM - Najważniejsze blokady dla
User-agent: *:/stingray/(cała wewnętrzna przestrzeń API),/myredfin/,/api/v1/rentals/,/api/v1/properties/,/owner-estimate/ - Brak dyrektywy
Crawl-delay:dla jakiegokolwiek user-agenta - Ponad 50 sitemapów — sitemap to najczystszy i najmniej obciążający WAF sposób enumeracji URL-i
Warunki korzystania z Redfin
Sekcja 2.3.5 mówi: „Nie wolno automatycznie przeszukiwać ani odpytywać Usług w jakimkolwiek celu i w jakikolwiek sposób... chyba że wcześniej uzyskano wyraźną pisemną zgodę.”
To jest umowa typu browsewrap — akceptacja przez dalsze korzystanie, a nie kliknięcie „zgadzam się”. Sądy w USA historycznie podchodziły sceptycznie do egzekwowania browsewrap wobec użytkowników, którzy nie mieli rzeczywistej wiedzy o warunkach (zob. Nguyen v. Barnes & Noble, 9th Cir. 2014).
Istotne orzecznictwo (w skrócie)
- Van Buren v. United States (Sąd Najwyższy, 2021): klauzula CFAA „exceeds authorized access” działa według testu „brama włączona albo wyłączona”. Użycie otwartych drzwi do niechcianego celu nie jest federalnym hackowaniem.
- hiQ Labs v. LinkedIn (9th Cir., 2022): pobieranie publicznie dostępnych danych nie stanowi naruszenia CFAA. Ale hiQ ostatecznie zapłaciło 500 000 USD w ugodzie z tytułu naruszenia umowy — bo założyło konta LinkedIn i kliknęło „I agree”.
- Meta Platforms v. Bright Data (N.D. Cal., styczeń 2024): sąd wydał wyrok skracający dla Bright Data — scrapowanie publicznych danych bez logowania nie czyniło Bright Data „użytkownikiem” związanym ToS Meta.
- X Corp. v. Bright Data (N.D. Cal., maj 2024): sędzia Alsup oddalił roszczenia X, uznając, że roszczenia stanowe próbujące kontrolować kopiowanie publicznych treści są wyłączone przez Copyright Act.
Praktyczne wskazówki
- Pobieraj tylko publicznie dostępne dane — nigdy nie rejestruj konta tylko po to, by potem scrapować (to tworzy ryzyko kontraktowe typu clickwrap)
- Szanuj limity — agresywne wolumeny mogą wspierać roszczenia o trespass to chattels
- Nie republkuj publicznie danych surowych ani zdjęć na dużą skalę — pozew CoStar v. Zillow (złożony w lipcu 2025, potencjalne odszkodowania przekraczające 1 mld USD) przypomina, że prawa autorskie do zdjęć są traktowane bardzo poważnie
- Podejście Thunderbit oparte na przeglądarce — działające w Twojej własnej autoryzowanej sesji — jest bliższe „ręcznemu przeglądaniu w prędkości maszyny” niż headless botowi z data center, a to najbardziej defensywna postawa bez licencjonowanego API
Wskazówki i typowe pułapki
Kilka twardo wypracowanych lekcji z budowania narzędzi do ekstrakcji danych i obserwowania tysięcy użytkowników scrapujących serwisy nieruchomości:
- Zawsze rozgrzewaj sesję. Wejdź na
redfin.com/przed jakimkolwiek głębokim URL-em. Zimne wejścia na deep URL są najczęstszym powodem wyzwań Cloudflare. - Rotuj User-Agent realistycznie. Nie używaj jednego — przełączaj się między 5–10 aktualnymi UA Chrome/Firefox. Ale nie rób tego zbyt agresywnie (inny UA przy każdym żądaniu wygląda podejrzanie).
- Deduplikuj po ID nieruchomości. Paginacja Redfin czasem się nakłada. Wyciągnij
/home/{id}z URL-a każdej oferty i usuń duplikaty przed wzbogacaniem danych. - Jeśli możesz, nie scrapuj w godzinach szczytu. Późna noc / wczesny ranek czasu USA zwykle oznacza mniejszą kontrolę WAF — przynajmniej z mojego doświadczenia.
- Jeśli dostaniesz 429, zwolnij wykładniczo. Nie próbuj od razu ponownie — w ten sposób miękki limit zamienisz w twardy ban IP.
- Przy dużych projektach (1000+ stron) zaplanuj budżet na proxy residential. IP z data center (AWS, GCP, Azure, OVH) są czarnolistowane przez system reputacji ASN Cloudflare. Error 1020 pojawi się niemal od razu.
Jak wybrać najlepszy sposób pobierania danych z Redfin
Którą metodę wybrać? To zależy od tego, kim jesteś i czego potrzebujesz.
Parsowanie HTML (BeautifulSoup + Selenium): najlepsze dla deweloperów, którzy chcą pełnej kontroli, czują się komfortowo z utrzymywaniem selektorów CSS i nie mają nic przeciwko przebudowie scraperów, gdy Redfin zmienia DOM. Spodziewaj się przeglądu kodu co 6–12 miesięcy.
Ukryte API Stingray: najlepsze dla deweloperów, którzy potrzebują czystego, strukturalnego JSON-u i potrafią reverse-engineerować niedokumentowane endpointy. Mniej utrzymania niż w parsowaniu HTML, ale endpointy mogą zmienić się bez ostrzeżenia. Pamiętaj, że /stingray/ jest wprost zabronione w robots.txt.
Thunderbit (No-Code): najlepsze dla osób nietechnicznych, szybkich projektów i zespołów, które potrzebują stałego dostępu do danych Redfin bez wsparcia programistów. AI dopasowuje się do zmian layoutu, pobieranie podstron wzbogaca dane jednym kliknięciem, a eksport do Google Sheets, Airtable lub Notion jest wbudowany. Jeśli jesteś zespołem nieruchomości, który potrzebuje żywej bazy ofert — a nie jednorazowego zrzutu CSV — to jest ścieżka o najmniejszym oporze.
Niezależnie od wybranej drogi: zrozum zabezpieczenia anty-bot Redfin, zanim zaczniesz, wiedz, jakich pól potrzebujesz, wybierz format eksportu pasujący do pracy Twojego zespołu i trzymaj się po właściwej stronie wytycznych prawnych.
Gotowy, by spróbować ścieżki no-code? Darmowy plan Thunderbit pozwoli Ci przetestować scrapowanie Redfin i zobaczyć wyniki w kilka minut. W przypadku podejść Pythona powyższe fragmenty kodu to działający punkt startowy — wystarczy dodać proxy i cierpliwość.
Wypróbuj Thunderbit do stałego pozyskiwania danych z Redfin
FAQ
Czy Redfin ma publiczne API?
Nie. Redfin nie oferuje oficjalnego publicznego API. Ukryte API Stingray (/stingray/api/home/details/*) zwraca ustrukturyzowany JSON i jest używane przez frontend Redfin, ale jest nieoficjalne, niedokumentowane, może zmienić się bez ostrzeżenia i jest wprost zabronione w robots.txt Redfin. Open-source’owe wrappery, takie jak reteps/redfin na PyPI, zapewniają dostęp z poziomu Pythona, ale używaj ich ze świadomością ryzyka.
Czy można scrapować Redfin bez Pythona?
Tak. Thunderbit to rozszerzenie AI do Chrome, które dziedziczy Twoją sesję przeglądarki, co zwiększa odporność na zabezpieczenia anty-bot — instalujesz je, otwierasz Redfin, klikasz „AI Suggest Fields” i eksportujesz do Excela, Google Sheets, Airtable lub Notion. Na rynku są też inne narzędzia no-code do scrapowania oraz gotowe dostawcy datasetów, jeśli chcesz porównać opcje.
Jak często Redfin zmienia układ swojej strony?
Historia issue na GitHubie pokazuje, że selektory CSS psują się mniej więcej co 6–12 miesięcy. Redfin wdrożył dwie generacje DOM kart — starszą (homecardV2Price, homeAddressV2) i obecną (bp-Homecard__Price--value, bp-Homecard__Address). Dojrzałe scrapery próbują obu po kolei.
Narzędzia oparte na AI, takie jak Thunderbit, dostosowują się automatycznie, ponieważ wykrywają pola po treści, a nie po selektorach CSS.
Jaki typ proxy jest najlepszy do scrapowania Redfin?
Przy dużej skali najlepiej sprawdzają się amerykańskie proxy residential — społecznościowe benchmarki wskazują skuteczność około 80%. Proxy data center trafiają na Cloudflare Error 1020 niemal natychmiast; zakresy IP AWS, GCP, Azure i OVH są czarnolistowane. Proxy mobile mają najwyższą skuteczność, ale kosztują 5–10 razy więcej.
Przy małej, osobistej skali (<100 stron) poprawne nagłówki + impersonacja curl_cffi + opóźnienia 2–5 sekund mogą działać nawet bez proxy.
Czy mogę pobierać dane o sprzedanych lub poza rynkiem nieruchomościach z Redfin?
Tak. Dane o sprzedanych nieruchomościach i Redfin Estimate poza rynkiem (mediana błędu 7,52%) są dostępne na stronach szczegółów przy użyciu tych samych metod. Pola różnią się od aktywnych ofert: strony poza rynkiem pokazują cenę sprzedaży, datę sprzedaży, historię nieruchomości i endpoint owner-estimate, ale nie zawierają aktualnej ceny ofertowej, dni na rynku ani informacji o open house. Endpoint Stingray dla estymacji poza rynkiem to api/home/details/owner-estimate, a nie api/home/details/avm.
Wypróbuj Thunderbit do pobierania danych z Redfin Get Started Free
Dowiedz się więcej


