Cómo Extraer Datos Inmobiliarios de Zillow: JSON de Búsqueda, Zestimate, PerimeterX
Zillow envía sus datos de listado como JSON oculto en la página — nunca necesitas analizar un solo div. Aquí te mostramos cómo manejar la API de búsqueda por límites de mapa, superar el límite de paginación y sobrevivir a PerimeterX.
Zillow posee más de 110 millones de propiedades y atrae alrededor de 245 millones de visitantes mensuales, lo que lo convierte en la fuente predeterminada para datos inmobiliarios en EE. UU. — precios, direcciones, camas, baños, zestimates y estimaciones de alquiler. También está detrás de PerimeterX y se renderiza del lado del cliente, por lo que los raspadores ingenuos obtienen un 403 y una página en blanco. La buena noticia: Zillow te entrega sus datos como JSON si sabes dónde buscar, y su búsqueda se maneja por coordenadas de mapa que puedes llamar directamente. Aquí está todo el enfoque.
No analices HTML — Zillow envía JSON
No hay necesidad de luchar con selectores CSS en una página de propiedad de Zillow. El registro completo de la propiedad está incrustado como datos web ocultos en una etiqueta de script. Dos ubicaciones cubren casi todas las páginas: <script id="__NEXT_DATA__"> contiene la caché de Next.js, y algunas páginas en su lugar usan <script id="hdpApolloPreloadedData"> (la caché de Apollo GraphQL). Toma cualquiera, analízalo, y tendrás un objeto limpio con zpid, price, livingArea, bedrooms, bathrooms, latLong, homeStatus, rentZestimate y más:
import json, re, requests
proxy = "http://USER:PASS@gate.quantumproxies.io:8000"
proxies = {"http": proxy, "https": proxy}
HEADERS = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0 Safari/537.36",
"accept-language": "en-US,en;q=0.9"}
def property_json(url):
r = requests.get(url, headers=HEADERS, proxies=proxies, timeout=20)
r.raise_for_status() # 403 => blocked, rotate IP
m = re.search(r'id="__NEXT_DATA__"[^>]*>(.*?)</script>', r.text, re.S)
if m:
data = json.loads(m.group(1))
cache = data["props"]["pageProps"]["componentProps"]["gdpClientCache"]
return next(iter(json.loads(cache).values()))["property"]
# fallback: Apollo cache
m = re.search(r'id="hdpApolloPreloadedData"[^>]*>(.*?)</script>', r.text, re.S)
cache = json.loads(json.loads(m.group(1))["apiCache"])
return next(v["property"] for k, v in cache.items() if "ForSale" in k)
El registro incrustado es mucho más rico que la página visible. Junto al precio y la dirección obtienes zestimate y rentZestimate — las propias valoraciones de venta y alquiler de Zillow — además de homeStatus (en venta, vendido, en alquiler), daysOnZillow, área de terreno y de vivienda, y latitud y longitud precisas. Eso es todo lo que un modelo de comparables, una canalización de puntuación de leads o un panel de mercado necesita, entregado como un solo objeto JSON limpio por propiedad en lugar de una docena de selectores CSS frágiles que se rompen en el próximo rediseño.
La API de búsqueda funciona con coordenadas de mapa
La búsqueda de Zillow no es primero por palabras clave — es primero por mapa. Bajo el capó, enviar una búsqueda dispara una solicitud a zillow.com/async-create-search-page-state con un objeto searchQueryState cuyo campo principal es mapBounds: cuatro números (norte, sur, este, oeste) que dibujan un rectángulo en el mapa. Dale una caja delimitadora y devuelve cada listado dentro, como JSON estructurado:
def search_area(bounds, page=1):
url = "https://www.zillow.com/async-create-search-page-state"
body = {
"searchQueryState": {
"pagination": {"currentPage": page},
"mapBounds": bounds, # {'north':..,'south':..,'east':..,'west':..}
"filterState": {"sortSelection": {"value": "days"}},
},
"wants": {"cat1": ["listResults", "mapResults"], "cat2": ["total"]},
"requestId": 2,
}
r = requests.put(url, json=body, headers=HEADERS, proxies=proxies, timeout=20)
return r.json()["cat1"]["searchResults"]["listResults"]
# New Haven, CT bounding box
listings = search_area({"north": 41.366, "south": 41.230,
"east": -72.827, "west": -73.030})

Supera el techo de 820 resultados
Zillow solo pagina 20 páginas de aproximadamente 41 elementos, por lo que una sola búsqueda se limita a aproximadamente 820 resultados sin importar cuántas casas haya en el área. Los mercados densos ocultan miles más. La solución es la división recursiva de cuadrantes: si una caja delimitadora devuelve el máximo de páginas, divídela en cuatro cajas más pequeñas y busca en cada una; sigue subdividiendo hasta que cada caja devuelva menos que el límite. Esta estrategia de acercamiento puede revelar cientos de miles de listados de una sola metrópoli que la búsqueda plana nunca mostraría — y solo se subdivide donde la densidad lo justifica, por lo que no desperdicias solicitudes en el campo vacío.
Hay un costo para esa exhaustividad: cada subdivisión multiplica las solicitudes, por lo que una metrópoli densa puede convertir una búsqueda en docenas. Presupuesta para ello — limita la profundidad de la recursión y solo acerca donde la cantidad de resultados lo justifique, lo cual el algoritmo hace por ti al subdividir únicamente cuando una caja aún alcanza el máximo de páginas. Para una actualización nocturna de toda una ciudad, la mayoría de las solicitudes entonces caen en el puñado de cajas densas del centro mientras que los suburbios se resuelven en una sola pasada, por lo que gastas en profundidad exactamente donde está el inventario y en ningún otro lugar.
PerimeterX es la razón por la que fallan los raspadores ingenuos
El bloqueo de Zillow no se basa principalmente en la tasa; es PerimeterX (ahora HUMAN) perfilando la solicitud. Las IPs de centros de datos, los encabezados de navegador faltantes y el tiempo inhumano activan un 403 o un desafío — eso es lo que realmente está verificando un assert status == 200. La solución es una solicitud coherente y confiable: proxies residenciales de EE. UU. para que la IP de salida parezca la de un comprador de vivienda, encabezados de navegador realistas y retroceso exponencial que rota a una IP nueva en cualquier 403 en lugar de intentar nuevamente con la quemada. Nuestro desglose de cómo PerimeterX detecta la automatización cubre las señales en profundidad; la misma postura se aplica a Walmart, que usa el mismo proveedor.
Cuando PerimeterX se endurece o prefieres no mantener una flota de navegadores, una Scraper API renderiza la página, rota IPs residenciales y resuelve el desafío por ti, devolviendo el mismo JSON oculto sin la carga operativa.
Extrae Zillow detrás de PerimeterX con IPs residenciales

Cuándo usar registros del condado en su lugar
Zillow es excelente para listados, fotos y estimaciones, pero es una fuente secundaria. Para propiedad autoritativa, historial de ventas y valores evaluados, las oficinas del tasador y registrador del condado publican registros públicos — a menudo a través de sus propios portales o exportaciones de datos masivas. Si tu caso de uso es título, comparables o datos fiscales en lugar de listados en vivo, los registros a nivel de condado son más limpios, más permisivos de recolectar y completamente libres de PerimeterX. Usa Zillow para la señal de mercado y registros del condado para la verdad en el terreno.
¿Es legal extraer datos de Zillow?
Esta es información general, no asesoramiento legal. Los datos de listados disponibles públicamente — precios, direcciones, atributos de propiedad — se consideran en general justos para recolectar a tasas respetuosas. Sin embargo, los resultados de Zillow pueden incluir datos personales: nombres de agentes, números de teléfono y detalles de corredores. Esos están protegidos bajo el GDPR y leyes similares, así que evita recolectarlos y almacenarlos sin una base legal. Recolecta los hechos de la propiedad, no las personas.
Preguntas frecuentes
¿Puedo extraer datos de Zillow?
Sí — los datos de listados visibles públicamente se pueden recolectar. Zillow incrusta cada registro de propiedad como JSON en una etiqueta de script (__NEXT_DATA__ o la caché de Apollo), y su búsqueda se ejecuta en una API de límites de mapa que puedes llamar directamente. El obstáculo no es el acceso sino PerimeterX, por lo que necesitas IPs residenciales y encabezados coherentes para evitar 403s.
¿Zillow tiene una API?
Zillow ofrece aproximadamente 20 APIs oficiales, incluyendo Detalles de Propiedad y Datos de Vecindario, pero requieren claves, tienen límites de uso y no cubren todos los campos o casos de uso masivo. Muchos equipos extraen las páginas públicas en su lugar precisamente porque el JSON oculto ya contiene el precio, camas, baños, área, zestimate y estimación de alquiler que necesitan.
¿Por qué mi raspador de Zillow obtiene un 403?
Un 403 en Zillow es casi siempre PerimeterX, no un límite de tasa. Las IPs de centros de datos, los encabezados de navegador faltantes o inconsistentes y el tiempo de solicitud robótico lo activan. Cambia a proxies residenciales de EE. UU., envía encabezados realistas, añade espaciado humano y rota a una IP nueva en cada 403 con retroceso exponencial en lugar de martillar la bloqueada.
¿Cómo extraigo más de 820 listados de Zillow de un área?
Una sola búsqueda se limita a aproximadamente 820 resultados (20 páginas de 41). Para ir más profundo, divide la caja de límites del mapa en cuatro cuadrantes y busca en cada uno; subdivide recursivamente cualquier cuadrante que aún alcance el límite. Este enfoque de acercamiento solo subdivide áreas densas, por lo que captura el inventario completo de una metrópoli sin desperdiciar solicitudes en regiones escasas.
Omite el HTML y lee el JSON incrustado, maneja la búsqueda por límites de mapa, divide cuadrantes para superar el límite y dirige todo a través de IPs residenciales limpias para mantenerte por delante de PerimeterX. Haz eso y Zillow se convierte en un feed estructurado de bienes raíces en lugar de un muro de 403s.