Scraper de Zillow: cómo extraer datos de propiedades con Python

Comparar anuncios en toda una ciudad se vuelve tedioso cuando los precios cambian y la hoja de cálculo de ayer ya está desactualizada. Un scraper de Zillow recopila información de las páginas de anuncios y la organiza en registros que puedes comparar, actualizar y exportar sin tener que rehacer la hoja de cálculo a mano.
TL;DR
Comprueba primero el acceso: los términos publicados de Zillow prohíben las consultas automatizadas, incluido el scraping. Antes de planificar una extracción en vivo, elige un programa de datos aprobado u otra fuente que estés autorizado a recopilar y reutilizar.
Prueba con una muestra pequeña. Contrasta los precios, direcciones y detalles de las propiedades extraídos con sus fuentes.
Gestiona con cuidado los resultados adicionales. Sigue la paginación, elimina duplicados y investiga los valores que faltan.
Ajusta la configuración del proxy a la tarea. Considera los proxies residenciales rotativos para controlar la ubicación y la sesión, o los proxies móviles para tráfico ilimitado. Ninguno garantiza el acceso a Zillow.
Valida antes de exportar. Mantén los precios de venta solicitados separados de las estimaciones y conserva las fechas de recopilación.
Vista previa de las columnas del CSV
zpid,address,listing_status,asking_price,bedrooms,bathrooms,source_url,collected_at
Qué datos puede extraer un scraper de Zillow
Un scraper de datos de Zillow puede recopilar información distinta de los resultados de búsqueda, de las páginas de cada propiedad y de los perfiles profesionales. Los resultados de búsqueda pueden ofrecer resúmenes de anuncios, mientras que las páginas de propiedad pueden añadir descripciones, estimaciones o historial. Los campos de contacto requieren una verificación aparte, porque el contacto de un agente o una agencia no equivale a los datos de un propietario.
Antes de hacer scraping de datos de Zillow, define el resultado. El ejemplo en Python que aparece más abajo usa este esquema solo para ventas:
Campo | Formato | Significado en este ejemplo |
zpid | Cadena obligatoria | Identificador de la propiedad, conservado como texto y usado para eliminar duplicados. |
address | Cadena obligatoria | Texto de la dirección que aporta el registro de búsqueda. |
listing_status | Cadena obligatoria | FOR_SALE; el ejemplo excluye los demás estados de anuncio. |
asking_price | Número o null | Precio de venta solicitado, que en este ejemplo se supone en USD. |
bedrooms | Número o null | Número de dormitorios indicado; cero sigue siendo un valor válido. |
bathrooms | Número o null | Número de baños indicado, incluidos los valores fraccionarios cuando se proporcionan. |
zestimate | Número o null | Valor estimado de la propiedad según el supuesto de USD del ejemplo, separado del precio solicitado. |
description | Cadena o null | Descripción extraída del documento de detalle de la propiedad seleccionada. |
source_url | Cadena obligatoria | URL de la propiedad asociada al registro de búsqueda. |
search_source_url | Cadena obligatoria | URL que identifica el documento de búsqueda del que procede el registro. |
collected_at | Marca de tiempo con zona horaria | Momento de observación del documento de búsqueda. |
detail_collected_at | Marca de tiempo o null | Momento de observación independiente del documento de detalle; null cuando no se procesó ningún documento de detalle. |
synthetic | Booleano | Marca los registros derivados de entradas declaradas sintéticas. Un valor false no es por sí solo una prueba de autenticidad. |
En los documentos guardados, los momentos de observación proceden del manifiesto de entrada; el recolector en vivo opcional registra la hora en que termina cada descarga. La demostración incluida usa marcas de tiempo ficticias.
Los valores opcionales ausentes se mantienen como null en JSON y en blanco en CSV. Si faltan campos obligatorios o hay valores numéricos mal formados, el ejemplo se detiene en lugar de generar valores supuestos.
El alquiler, el último precio de venta, la superficie, el historial y los campos de contacto profesional requieren asignaciones adicionales verificadas. Este ejemplo no los exporta. Al ampliar el esquema, mantén separados los precios solicitados, los precios de venta, los importes de alquiler y las estimaciones.
Elige entre Python, herramientas de scraping y acceso a datos de Zillow
Elige la vía en función del conjunto de datos que necesitas y del mantenimiento que puedes asumir. Una exportación puntual a una hoja de cálculo puede encajar con una herramienta alojada, mientras que la recopilación repetida con campos personalizados exige más control sobre la extracción, la validación y las actualizaciones.
Enfoque | Más adecuado para | Consideración principal |
Script de Python | Extracción, validación y almacenamiento personalizados | Tú mantienes el código y verificas el acceso a la fuente. |
Extracción reutilizable con navegador mediante un servicio local | Requiere despliegue y un preset de extracción probado con las páginas previstas. | |
Extensión de navegador o scraper alojado | Exportaciones sin mantener el recolector | Revisa los campos disponibles, los límites de recopilación, la privacidad y el coste total. |
API de scraping gestionada | Externalizar la descarga de páginas o la extracción | Confirma si la respuesta contiene HTML o registros de propiedades estructurados. |
Programa oficial de datos o descarga de investigación | Integraciones aprobadas o análisis del mercado regional | Revisa la cobertura del conjunto de datos, las condiciones de acceso y los usos permitidos. |
Antes de decidirte por una herramienta, prueba una muestra pequeña que contenga los campos que necesitas. Comprueba si obtiene los detalles de las propiedades o solo resúmenes de búsqueda, cómo gestiona los valores ausentes y si su exportación conserva los identificadores y las fechas.
Un producto de terceros comercializado como “API de Zillow” no es necesariamente un servicio oficial de Zillow. Puede recopilar contenido del sitio web y entregarlo a través de su propio endpoint; el nombre por sí solo no acredita afiliación, licencia ni permiso de recopilación.
Zillow Research ofrece métricas regionales del mercado de la vivienda, como valores de las viviendas, alquileres e inventario. Los programas para desarrolladores de Zillow Group cubren productos concretos con sus propias condiciones de acceso. Estas opciones sirven para fines distintos y no deben tratarse como acceso sin restricciones a todos los anuncios ni a todos los campos de contacto.
Más información sobre No-Code Web Scraper.
Cómo hacer scraping de Zillow con Python
Este ejemplo convierte documentos guardados de búsqueda y de propiedades en registros CSV y JSON. Se probó con muestras de HTML sintético y respuestas HTTP simuladas, sin descargar ninguna página real de Zillow durante la validación.
El script lee un documento de búsqueda, conserva hasta cinco propiedades FOR_SALE únicas y puede completar una propiedad seleccionada a partir de un documento de detalle coincidente. El límite de cinco registros pertenece a este ejemplo y no es un tope de resultados de búsqueda de Zillow.
Entorno de prueba: Linux x86_64, Python 3.12.14, Requests 2.34.2 y Beautiful Soup 4.15.0. Las dependencias están fijadas en requirements.txt. El ejemplo se probó el 4 de noviembre de 2026 y se volvió a comprobar el 5 de noviembre de 2026. Descarga el ejemplo en Python, las dependencias fijadas, el ejemplo probado, las pruebas automatizadas y las exportaciones CSV y JSON correspondientes.
Configura Python y define la salida
Extrae los archivos de ejemplo adjuntos, abre su directorio y crea un entorno de Python:
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txtLa salida contiene identificadores de propiedad, direcciones, estado del anuncio, precios solicitados, dormitorios, baños, URL de origen y marcas de tiempo de observación. Los detalles opcionales de la propiedad incluyen un Zestimate y una descripción.
Mantén las credenciales fuera del script. Su configuración de proxy HTTP opcional lee ZILLOW_PROXY_URL del entorno; si no se define, se usa una conexión directa. Este cliente de Python no hereda la configuración de proxy de Chrome de escritorio.
El archivo sample.json incluido identifica dos archivos HTML sintéticos y sus fechas de captura de ejemplo. El procesamiento de páginas guardadas conserva esas marcas de tiempo en lugar de presentar la fecha del análisis como fecha de recopilación.
Inspecciona una página de búsqueda y una página de propiedad
Antes de decidir cómo extraer datos de Zillow, inspecciona las páginas que cubre tu autorización. Compara la respuesta HTML original con la página renderizada por el navegador para determinar dónde aparece la información necesaria.
El parser de ejemplo busca JSON incrustado en:
<script id="__NEXT_DATA__" type="application/json">A continuación comprueba estas estructuras concretas:
Search records:
props.pageProps.searchPageState.cat1.searchResults.listResults
Property details:
props.pageProps.componentProps.gdpClientCacheSon supuestos comprobados con las muestras incluidas, no interfaces permanentes de Zillow. Verifícalos con los documentos de origen permitidos antes de usar el parser.
Si los campos aparecen solo después de ejecutar JavaScript, una solicitud HTTP y un parser de HTML no reproducirán ese renderizado. Puede ser necesaria la automatización del navegador, pero el renderizado por sí solo ni acredita permiso ni garantiza el acceso.
Descarga y valida la respuesta
La función fetch_html() del script completo comprueba el estado HTTP, la URL final y el tipo de contenido antes de devolver el HTML:
defp fetch_html(url):
url = source_url(url)
proxy = os.getenv("ZILLOW_PROXY_URL")
if proxy and urlsplit(proxy).scheme != "http":
raise ValueError("This example supports an HTTP proxy endpoint only")
with requests.Session() as session:
session.trust_env = False
if proxy:
session.proxies = {"https": proxy}
with session.get(
url,
timeout=(5, 20),
allow_redirects=False,
) as response:
if response.status_code != 200:
raise ValueError(
f"Stopped: HTTP {response.status_code}; no automatic retry"
)
if response.url != response.request.url:
raise ValueError("Unexpected final URL")
source_url(response.url)
media_type = (
response.headers.get("Content-Type", "")
.split(";")[0]
.lower()
.strip()
)
if media_type not in {"text/html", "application/xhtml+xml"}:
raise ValueError("Expected an HTML response")
return response.textLos valores de timeout conceden cinco segundos para establecer la conexión y veinte segundos de inactividad en la lectura; no son un plazo total de ejecución. Requests documenta esta distinción en su guía sobre timeouts.
Una respuesta HTTP 200 sigue necesitando validación del contenido. Una página de desafío, un documento inesperado o una estructura de datos modificada no deben convertirse en una exportación correcta con cero registros. La siguiente función comprueba si existe el contenedor JSON esperado:
def page_props(html):
soup = BeautifulSoup(html, "html.parser")
node = soup.find("script", id="__NEXT_DATA__")
if node is None:
raise ValueError(
"Expected JSON block absent: inspect the returned page"
)
try:
props = json.loads(node.get_text())["props"]["pageProps"]
except (KeyError, TypeError, json.JSONDecodeError) as exc:
raise ValueError("Invalid or changed page-data structure") from exc
if not isinstance(props, dict):
raise ValueError("Expected a pageProps object")
return propsExtrae los registros de anuncios y los detalles de la propiedad seleccionada
El ejemplo conserva los registros marcados explícitamente como FOR_SALE, exige un identificador y una dirección, y elimina los ZPID duplicados antes de aplicar su límite de cinco registros. Los registros de alquiler y de propiedades vendidas se excluyen para evitar que sus precios se etiqueten como precios solicitados.
Los campos numéricos opcionales permanecen como None cuando faltan. Las cadenas inesperadas, los valores negativos y los números no válidos detienen el procesamiento en lugar de convertirse silenciosamente:
def number(value, positive=False):
if value is None:
return None
if (
isinstance(value, bool)
or not isinstance(value, (int, float))
or not math.isfinite(value)
or value < 0
or (positive and value == 0)
):
raise ValueError(
"Unexpected numeric value; review the field mapping"
)
return valueIncluye la página de detalle opcional solo cuando necesites campos adicionales. Su URL y su identificador de propiedad deben coincidir con un registro de búsqueda seleccionado. El parser guarda su Zestimate por separado del precio solicitado y registra una marca de tiempo independiente para la página de detalle.
Esto es fundamental para aprender a hacer scraping de datos de Zillow con precisión: conserva el significado de cada campo y nunca inventes valores ausentes.
Ejecuta una muestra pequeña e inspecciona el resultado
Ejecuta el script completo con las páginas sintéticas incluidas:
python zillow_sample.py sample.json --output run-01El directorio de salida debe ser nuevo. La muestra probada produce:
Saved 2 unique listings to run-01Un registro resultante tiene este aspecto. Toda la información de propiedades que aparece a continuación es ficticia:
{
"zpid": "9000000001",
"address": "100 Example Lane, Sample City, TX 00000",
"listing_status": "FOR_SALE",
"asking_price": 395000,
"bedrooms": 3,
"bathrooms": 2,
"source_url": "https://www.zillow.com/homedetails/example-property/9000000001_zpid/",
"search_source_url": "https://www.zillow.com/synthetic-test-city/",
"collected_at": "2026-11-04T10:00:00+00:00",
"zestimate": 400000,
"description": "Synthetic property description for parser testing only.",
"detail_collected_at": "2026-11-04T10:01:00+00:00",
"synthetic": true
}Algunas columnas seleccionadas de la exportación CSV muestran cómo se conservan los valores ausentes:
zpid,listing_status,asking_price,bedrooms,bathrooms,zestimate
9000000001,FOR_SALE,395000,3,2,400000
9000000002,FOR_SALE,,0,1,Contrasta con las entradas los identificadores, los precios, los campos ausentes y el recuento de duplicados. El segundo registro conserva a propósito un precio ausente y mantiene cero dormitorios.
Para una recopilación en vivo autorizada, aporta un manifiesto aparte con URL verificadas y usa --live; en ese modo el script rechaza las entradas sintéticas. Las pruebas incluidas pueden volver a ejecutarse con:
python -m unittest -vQue estas pruebas se superen confirma el comportamiento demostrado, no el acceso actual a Zillow. Valida la estructura real de las páginas y una muestra permitida antes de ampliar la recopilación.
Nota de validación
Las 13 pruebas automatizadas se superaron el 4 de noviembre de 2026 y volvieron a superarse el 5 de noviembre. Las comprobaciones usaron muestras de HTML sintético y respuestas HTTP simuladas.
Comprobación | Resultado |
Alcance de la muestra | Un documento de búsqueda y un documento de detalle coincidente. |
Entradas sin procesar | Tres entradas de búsqueda antes de eliminar duplicados. |
Registros exportados | Dos propiedades únicas tras eliminar un duplicado. |
Registros rechazados | Ninguno en la muestra de demostración incluida. |
Registros incompletos | Un registro conservado contiene valores opcionales ausentes. |
Valores ausentes | asking_price, zestimate, description y detail_collected_at son null en ese registro. |
Comparación de exportaciones | Los CSV y JSON regenerados coincidieron con los archivos de muestra incluidos. |
La ausencia de marca de tiempo de detalle significa que no se procesó ningún documento de detalle para esa propiedad; no indica que la solicitud de detalle haya fallado.
Pruebas independientes comprobaron los fallos esperados, entre ellos respuestas denegadas, URL o tipos de contenido inesperados, identificadores ausentes, JSON mal formado y estructuras modificadas. No se validaron la compatibilidad en vivo con Zillow, la paginación ni las conexiones a través de un proveedor de proxies.
Usa Yozh Scraper para una extracción reutilizable
Yozh Scraper en GitHub ofrece un servicio autoalojado para el renderizado en navegador, la extracción de campos y los trabajos asíncronos. Puedes reutilizar las reglas de extracción entre solicitudes y dejar que Python se encargue de la validación y el almacenamiento.
Yozh Scraper proporciona renderizado en navegador, reglas de extracción y presets reutilizables para crear una configuración personalizada. Esta guía no incluye un preset de Zillow verificado con páginas reales. Valida los campos necesarios con documentos de origen permitidos antes de usar un preset personalizado para la recopilación periódica de propiedades, al emplearlo como web scraper de Zillow.
Inicia el servicio y comprueba su estado. Tras clonar el repositorio, copia .env.example a .env y ejecuta docker compose up --build. En otra terminal, comprueba http://localhost:8000/api/v1/health. Una respuesta correcta confirma que el servicio está disponible, no que la extracción de propiedades funcione.
Crea y verifica un preset personalizado. Abre http://localhost:8000/docs y crea un preset con reglas CSS o XPath verificadas. Dale un nombre que empiece por user_, como user_zillow_property. Pruébalo con POST /api/v1/presets/{name}/test usando una muestra permitida. Revisa otra página de propiedad antes de reutilizar las reglas.
Ejecuta un trabajo pequeño. Envía la URL de una sola propiedad con POST /api/v1/scrape/preset/page usando la configuración del preset guardado. Conserva el job_id devuelto; identifica la tarea en segundo plano, no confirma que la extracción haya tenido éxito.
Valida los campos de la propiedad. Asigna los resultados al mismo esquema que el ejemplo en Python: identificador de propiedad, dirección, estado del anuncio, precio solicitado, dormitorios, baños y URL de origen. Añade la marca de tiempo de recopilación, comprueba los tipos numéricos y conserva los valores opcionales ausentes. Compara la salida con la fuente antes de aumentar el volumen.
Recupera los resultados desde Python. Consulta GET /api/v1/scrape/{job_id} con una pausa entre consultas y un tiempo límite global, y gestiona los trabajos fallidos o cancelados. Al terminar, solicita GET /api/v1/scrape/{job_id}/results, revisa los errores y advertencias y valida los registros antes de exportarlos.
Para instrucciones de instalación más amplias y el probador visual opcional, sigue la guía de screen scraping.
Gestiona la paginación y los resultados de búsqueda incompletos
Una búsqueda en Zillow debe tratarse como una muestra definida, no como el inventario regional completo. Los límites geográficos, los filtros de anuncios, la paginación y los fallos de recopilación pueden afectar a qué registros aparecen, incluso cuando la búsqueda muestra un total mayor.
Antes de ampliar la recopilación, define qué representa un registro: una propiedad, una unidad individual, un edificio o un anuncio. Un edificio de apartamentos y sus unidades disponibles no deben fusionarse solo porque compartan dirección postal.
El ejemplo de Python anterior lee una sola página de búsqueda y no implementa paginación. Para ampliarlo, inspecciona la interfaz de búsqueda permitida y verifica cómo se solicita la página siguiente. Conserva los límites geográficos, los filtros y la ordenación originales durante toda la ejecución y regístralos junto con el conjunto de datos.
Detente cuando una página se repita, no devuelva identificadores nuevos o alcance el límite configurado de páginas, registros o tiempo de ejecución. Registra el motivo de la detención para distinguir una muestra limitada a propósito de una recopilación fallida.
Elimina los duplicados de resultados solapados usando el ZPID cuando identifique la entidad deseada, u otro identificador verificado de propiedad, unidad o anuncio. No te bases solo en la dirección.
En cada ejecución, registra:
Registros sin procesar: entradas devueltas antes de eliminar duplicados y validar.
Registros únicos: entradas conservadas tras eliminar duplicados.
Registros rechazados: entradas excluidas, con sus motivos.
Registros incompletos: entradas conservadas a las que les faltan campos opcionales; también cuentan como únicos.
Informa de la cobertura demostrada por el método probado. Las guías revisadas describen límites de búsqueda y enfoques distintos, así que evita presentar una cifra fija como tope universal de resultados de Zillow.
Limpia los datos de Zillow y expórtalos a CSV o JSON
Los registros extraídos resultan útiles cuando su significado se mantiene al ordenar, filtrar y comparar. Antes de exportar, normaliza cada campo de forma coherente y contrasta algunos registros con la fuente.
Conserva los códigos postales como cadenas. Los ceros iniciales importan, así que importa la columna como texto al abrir un CSV en Excel.
Separa los componentes del precio. Guarda por separado el importe, la moneda, el tipo de precio y el periodo del alquiler. El precio solicitado, el último precio de venta y el Zestimate pertenecen a campos distintos o a registros claramente etiquetados.
Conserva las unidades de superficie. Guarda la medida junto con su unidad, por ejemplo pies cuadrados, para que los cálculos posteriores usen valores comparables.
Distingue los valores ausentes del cero. Usa null en JSON o una celda vacía en CSV para la información no disponible. Cero dormitorios puede describir un estudio; no debe convertirse automáticamente en un valor ausente.
Conserva la procedencia. Incluye la URL de origen y la marca de tiempo de recopilación para poder rastrear y comprobar cada observación.
El CSV funciona bien para registros de propiedades planos. Guarda en JSON los historiales anidados de precios o anuncios, o expórtalos a una tabla aparte vinculada por el identificador de propiedad.
Para el seguimiento, conserva observaciones fechadas en lugar de sobrescribir los valores anteriores. Que un anuncio desaparezca en una ejecución posterior no prueba que la propiedad se haya vendido: pueden explicar su ausencia unos filtros distintos, una recopilación incompleta o la retirada del anuncio.
Ejemplo de registro JSON de los archivos de prueba incluidos
Este es el segundo registro generado por el ejemplo en Python. Su identificador de propiedad, dirección, URL y marca de tiempo de observación son ficticios. El precio solicitado ausente permanece como null, mientras que cero dormitorios sigue siendo el número cero.
Luego inserta este JSON:
{
"zpid": "9000000002",
"address": "200 Example Lane, Sample City, TX 00000",
"listing_status": "FOR_SALE",
"asking_price": null,
"bedrooms": 0,
"bathrooms": 1,
"source_url": "https://www.zillow.com/homedetails/second-example/9000000002_zpid/",
"search_source_url": "https://www.zillow.com/synthetic-test-city/",
"collected_at": "2026-11-04T10:00:00+00:00",
"zestimate": null,
"description": null,
"detail_collected_at": null,
"synthetic": true
}Las comprobaciones siguientes también cubren campos que puedes añadir más adelante; el script incluido usa el esquema más reducido, solo para ventas, definido antes.
Elige proxies y ajustes de sesión para la tarea
Un proxy controla la ruta de red y la IP de salida que usa tu scraper. Elige la conexión según el volumen de tráfico, la ubicación y la continuidad de la sesión; ningún tipo de proxy garantiza el acceso a Zillow.
Conexión | Idoneidad según la carga de trabajo | Precio |
Residencial rotativo | Segmentación por ubicación, con sticky sessions de hasta 24 horas para pasos encadenados; ideal para web scraping, recopilación de datos para IA, automatización, SEO e investigación de mercado. | Pool estándar: $2/GB con geotargeting gratuito |
Móvil | IP limpias con tráfico ilimitado, lo que ayuda a controlar los costes de ancho de banda cuando se renderizan repetidamente descargas, scripts e imágenes; ideal para web scraping, automatización, SEO e investigación de mercado. | LTE/5G $1.7/día con compatibilidad con los protocolos HTTP, SOCKS5 y UDP. |
Una dirección fija encaja con observaciones repetidas que necesitan un enrutamiento coherente, con ancho de banda ilimitado; ideal para web scraping, pruebas de QA, automatización y acceso específico por región. | $5.29/mes con 99.9% de disponibilidad. | |
Proxies de datacenter dedicados de alta velocidad con IPv4/IPv6 y ancho de banda ilimitado; ideales para web scraping, automatización, monitorización, integración de API y recopilación de datos a gran escala. | $2.18/mes con compatibilidad con los protocolos HTTP y SOCKS5. |
Para un recolector basado en navegador, una configuración documentada es Ubuntu 24.04, Playwright Chromium y un proxy HTTP con autenticación de usuario y contraseña. Define server, username y password mediante browser.new_context(proxy=...), cargando las credenciales desde variables de entorno. Playwright documenta las credenciales de proxy HTTP por separado de la compatibilidad con SOCKSv5, así que no des por hecho que SOCKS5 con autenticación funciona igual.
Abre una página de comprobación de IP dentro de ese mismo contexto de navegador y verifica la IP de salida y la ubicación. Después prueba una extracción representativa y permitida e inspecciona los registros devueltos antes de aumentar la carga de trabajo.
Obtén la comprobación de dirección IP de CyberYozh App con una evaluación real, basada en los principales sistemas antifraude.
Cómo hacer scraping de Zillow con números de teléfono
La disponibilidad de los campos de contacto depende del anuncio, de la fuente y del método de extracción. Antes de añadir números de teléfono a un scraper de Zillow, verifica que la fuente permitida exponga el campo de contacto e identifique a quién pertenece.
Los contactos de agentes y agencias no son lo mismo que los datos de los propietarios. Un número que aparece junto a un anuncio no debe convertirse automáticamente en owner_phone en tu conjunto de datos. Inspecciona el nombre y la etiqueta que lo acompañan y conserva la relación indicada en lugar de suponer quién contesta.
Por cada contacto profesional permitido, conserva:
Número de teléfono: almacenado como texto, con la extensión si se muestra.
Nombre y cargo: exactamente como los identifica la fuente.
URL de origen: la página que contiene esa información de contacto.
Marca de tiempo de recopilación: cuándo se observó la información.
Mantén separados los contactos múltiples para que el número de un agente no quede asociado al nombre de la agencia. Los números ausentes deben permanecer como null en JSON o en blanco en CSV; registra los errores de extracción aparte en lugar de rellenar los huecos con datos supuestos.
Que un dato se muestre públicamente no establece permiso para cualquier fin de recopilación, reutilización o contacto comercial. Revisa las condiciones de acceso de la fuente y los requisitos de privacidad aplicables antes de recopilar o usar contactos profesionales.
Alquila un número móvil virtual o un número residencial compatible con los servicios en línea más populares.
Soluciona los problemas habituales del scraping de Zillow
Identifica la etapa que ha fallado antes de cambiar la configuración. Los problemas de conexión afectan al enrutamiento, la autenticación o el transporte; las restricciones de acceso deniegan o limitan las solicitudes; los errores de extracción se producen cuando el recolector no interpreta correctamente el contenido devuelto.
Síntoma | Causa probable | Siguiente comprobación |
Respuesta 403 o página de desafío | Rechazo de acceso o comprobación de tráfico automatizado | Inspecciona el cuerpo de la respuesta e identifica qué servicio la devolvió. Pausa los intentos repetidos y verifica el método de acceso permitido. |
Límite de frecuencia de solicitudes | Respeta Retry-After cuando esté presente. Reduce la frecuencia y la concurrencia de las solicitudes, usa esperas crecientes entre reintentos y limita el número de intentos. | |
HTTP 200, sin registros | Contenido inesperado o desajuste en la extracción | Comprueba la URL final, el tipo de contenido y el documento guardado. Confirma que existen los campos esperados antes de cambiar los selectores. |
Cobertura de anuncios incompleta | Filtros, paginación, límites de recopilación o solicitudes fallidas | Compara los límites geográficos y los filtros; revisa el número de páginas, los registros rechazados y el motivo de la detención. |
Propiedades duplicadas | Búsquedas solapadas o páginas repetidas | Elimina duplicados con un identificador verificado, conservando las unidades distintas y las observaciones fechadas. |
Faltan números de teléfono | Campo no disponible o mal asignado | Inspecciona la fuente y la etiqueta del contacto. Conserva los valores ausentes en lugar de suponerlos. |
Precios incorrectos o ausentes | Campo de precio equivocado o error de conversión | Verifica por separado el precio solicitado, el alquiler, el precio de venta y el Zestimate. Comprueba la moneda y el periodo del alquiler. |
El parser se detuvo tras un cambio en la página | Estructura de HTML o de JSON incrustado modificada | Compara las muestras guardadas, actualiza los selectores o rutas afectados y vuelve a validar una muestra pequeña. |
Ante fallos de conexión, verifica el endpoint, la autenticación y el enrutamiento efectivo en el cliente que realiza las solicitudes. Tras cualquier corrección, compara los valores extraídos con la fuente antes de reiniciar una ejecución mayor.
Crea un conjunto de datos verificable
Elige una fuente permitida, valida una muestra pequeña y conserva el significado de cada campo al exportar. Amplía solo después de comparar la salida con la fuente. Prueba tus reglas de extracción verificadas en Yozh Scraper antes de configurar una recopilación periódica.
Si la recopilación requiere una ubicación de salida concreta o una IP constante, elige una conexión adecuada en el catálogo de proxies y pruébala con tu configuración de extracción verificada.
