{"id":44371,"date":"2026-05-13T21:04:47","date_gmt":"2026-05-13T21:04:47","guid":{"rendered":"https:\/\/floppydata.com\/sin-categoria\/como-raspar-zillow-una-guia-que-funciona\/"},"modified":"2026-05-13T21:04:47","modified_gmt":"2026-05-13T21:04:47","slug":"how-to-scrape-zillow-a-guide-that-works","status":"publish","type":"post","link":"https:\/\/floppydata.com\/es\/blog\/how-to-scrape-zillow-a-guide-that-works\/","title":{"rendered":"C\u00f3mo raspar Zillow: Una gu\u00eda que funciona"},"content":{"rendered":"<h2><strong>Introducci\u00f3n<\/strong><\/h2>\n<p>Al ser una de las principales plataformas inmobiliarias de EE.UU., Zillow se convierte en una plataforma a la que muchas empresas quieren recurrir para obtener datos sobre propiedades. La plataforma recibe actualmente alrededor de <a href=\"https:\/\/www.businessofapps.com\/data\/zillow-statistics\/\" target=\"_blank\" rel=\"noopener\">243 millones de visitas al mes<\/a>, por lo que, naturalmente, alberga una enorme cantidad de datos inmobiliarios \u00fatiles. <\/p>\n<p>Sin embargo, los desarrolladores a menudo comparten en Reddit c\u00f3mo les resulta dif\u00edcil eludir el cortafuegos de Zillow o se bloquean permanentemente mientras intentan hacer scraping. Si acabas de experimentar esto y est\u00e1s buscando una gu\u00eda estable que funcione, sigue leyendo. <\/p>\n<p>En esta gu\u00eda, te mostrar\u00e9 c\u00f3mo extraer datos clave de listados de Zillow utilizando Python y una API web sencilla.<\/p>\n<h2><strong>\u00bfQu\u00e9 es Zillow Scraping?<\/strong><\/h2>\n<p>El scraping de Zillow es el proceso de recopilar datos inmobiliarios disponibles p\u00fablicamente de las p\u00e1ginas de Zillow y convertirlos en un formato estructurado, como CSV o JSON, que puedas utilizar con fines comerciales o personales.<\/p>\n<p>En lugar de abrir los listados uno por uno, puede utilizar un scraper para extraer los detalles clave de las p\u00e1ginas de b\u00fasqueda y de las p\u00e1ginas de detalles de los listados de propiedades.<\/p>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-44250\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3.png\" alt=\"Raspado de Zillow\" width=\"1999\" height=\"1385\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3.png 1999w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-300x208.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-1024x709.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-768x532.png 768w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image3-3-1536x1064.png 1536w\" sizes=\"(max-width: 1999px) 100vw, 1999px\" \/><\/p>\n<p>Entre ambas p\u00e1ginas se puede sacar:<\/p>\n<ul>\n<li>Precio, direcci\u00f3n, camas, ba\u00f1os, metros cuadrados, estado y d\u00edas en el mercado<\/li>\n<li>Zestimate y Rent Zestimate<\/li>\n<li>Fotos del anuncio y nombre del agente<\/li>\n<li>Historial de precios e impuestos<\/li>\n<\/ul>\n<h3><strong>\u00bfPor qu\u00e9 raspar datos de Zillow?<\/strong><\/h3>\n<p>Imagine poder acceder a listados de propiedades actualizados al minuto, detalles de precios y an\u00e1lisis de mercado sin tener que abrir manualmente cientos de p\u00e1ginas de Zillow.<\/p>\n<p>Ese es el verdadero valor de raspar Zillow.<\/p>\n<p>Si trabajas en el sector inmobiliario, la inversi\u00f3n en propiedades, la investigaci\u00f3n de mercado, la generaci\u00f3n de clientes potenciales o el an\u00e1lisis de precios, Zillow tiene datos p\u00fablicos \u00fatiles que pueden ayudarte a detectar tendencias m\u00e1s r\u00e1pidamente.<\/p>\n<h2><strong>\u00bfQu\u00e9 hace que Zillow sea tan dif\u00edcil de raspar?<\/strong><\/h2>\n<p>Zillow no va tan lejos como otras plataformas cuando se trata de bloquear bots, pero a\u00fan as\u00ed est\u00e1 construida para cerrar el tr\u00e1fico que no parece humano.<\/p>\n<p>La mayor\u00eda de los desguaces fracasan por dos razones. Veamos ambas: <\/p>\n<h3><strong>Protecci\u00f3n PerimeterX<\/strong><\/h3>\n<p>Zillow utiliza PerimeterX para detectar y bloquear el tr\u00e1fico bot en tiempo real. Si tu scraper tiene cabeceras err\u00f3neas, proviene de una IP de baja confianza o env\u00eda demasiadas solicitudes demasiado r\u00e1pido, puede ser marcado. <\/p>\n<p>La mayor\u00eda de las veces, esa bandera conduce a un rompecabezas CAPTCHA, que romper\u00eda la mayor\u00eda de los raspadores. PerimeterX tambi\u00e9n comprueba muchas se\u00f1ales, como cabeceras, comportamiento del navegador, huellas TLS, velocidad de solicitud y reputaci\u00f3n IP. <\/p>\n<p>Si el tr\u00e1fico parece automatizado, es posible que el scraper nunca llegue a los datos reales del listado.<\/p>\n<p>Por lo tanto, incluso si renderiza la p\u00e1gina en un navegador sin cabeza, eso no garantiza el \u00e9xito. Sigues necesitando proxies de alta calidad, sesiones limpias y un comportamiento realista de las peticiones. <\/p>\n<p>Por eso prefiero utilizar Floppydata&#8217;s Web Unlocker para el scraping de Zillow.<\/p>\n<h3><strong>HTML no estructurado y sin selectores estables<\/strong><\/h3>\n<p>Analizar Zillow tambi\u00e9n puede ser tan frustrante como superar sus defensas. Casi no hay nombres de clase, IDs o atributos de datos consistentes en la fuente de la p\u00e1gina. <\/p>\n<p>Los elementos que parecen sencillos, como el precio o la direcci\u00f3n, est\u00e1n envueltos en etiquetas gen\u00e9ricas &lt;div&gt; o no tienen ning\u00fan identificador.<\/p>\n<p>Peor a\u00fan, los nombres de las clases cambian a menudo y no siguen ning\u00fan patr\u00f3n. As\u00ed que hay que usar concordancias flexibles (como find() basado en palabras clave o incluso regex) para extraer datos de nodos de texto sin procesar. <\/p>\n<p>Esto hace que Zillow sea uno de los sitios m\u00e1s inestables para scrapear si conf\u00edas en selectores est\u00e1ticos.<\/p>\n<h2><strong>Extraer informaci\u00f3n de listados de Zillow con Python<\/strong><\/h2>\n<p>Para esta gu\u00eda, me centrar\u00e9 en la <a href=\"https:\/\/www.zillow.com\/boston-ma\/\" target=\"_blank\" rel=\"noopener\">p\u00e1gina de resultados de b\u00fasqueda de Zillow en Boston<\/a>, que contiene varios listados de propiedades. A partir de ah\u00ed, podemos extraer campos como el precio, la direcci\u00f3n, las camas, los ba\u00f1os, los metros cuadrados, el estado y los enlaces de los listados. <\/p>\n<p><strong><em>Nota:<\/em><\/strong><em>  Las p\u00e1ginas de Zillow cambian a menudo. Si la p\u00e1gina de Boston parece diferente para cuando leas esto, ve a Zillow, busca cualquier ciudad o barrio, copia la URL de los resultados y sustit\u00fayela en el c\u00f3digo. <\/em><\/p>\n<p>Empecemos por la configuraci\u00f3n:<\/p>\n<h3><strong>Requisitos previos<\/strong><\/h3>\n<p>Necesitar\u00e1s tres cosas antes de empezar:<\/p>\n<ul>\n<li><strong>Python 3.10 o superior<\/strong> instalado en su m\u00e1quina<\/li>\n<li><strong>Una cuenta de Floppydata<\/strong> con una clave API para el Web Unlocker<\/li>\n<li>Dos bibliotecas Python: <strong>requests<\/strong> para las llamadas HTTP y <strong>beautifulsoup4<\/strong> para el an\u00e1lisis sint\u00e1ctico de HTML<\/li>\n<\/ul>\n<p>Si a\u00fan no tienes una cuenta de Floppydata, reg\u00edstrate en floppydata.com y obt\u00e9n tu<strong> clave API<\/strong> desde el<a href=\"https:\/\/app.floppydata.com\/tools\/scrape\"> panel de control de Web Unlocker<\/a>.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44259\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3.png\" alt=\"Clave API\" width=\"1336\" height=\"646\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3.png 1336w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3-300x145.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3-1024x495.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image1-3-768x371.png 768w\" sizes=\"(max-width: 1336px) 100vw, 1336px\" \/><\/p>\n<p>Las cuentas nuevas vienen con <strong>cinco raspados gratuitos<\/strong>, as\u00ed que puedes seguir todo este tutorial sin pagar nada.<\/p>\n<p>La biblioteca de peticiones suele venir preinstalada, pero puedes ejecutar este comando para asegurarte de que est\u00e1 correctamente instalada:<\/p>\n<div style=\"margin: 18px 0 26px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 16px 18px; margin: 0; font-size: 14px; line-height: 1.7;\"><code><span style=\"color: #9333ea;\">pip<\/span> <span style=\"color: #16a34a;\">install<\/span> requests beautifulsoup4<\/code><\/pre>\n<\/div>\n<p>Una vez hecho esto, cree una nueva carpeta y un nuevo archivo de proyecto:<\/p>\n<div style=\"margin: 18px 0 26px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 16px 18px; margin: 0; font-size: 14px; line-height: 1.7;\"><code><span style=\"color: #9333ea;\">mkdir<\/span> zillow-scraper\n<span style=\"color: #9333ea;\">cd<\/span> zillow-scraper\n<span style=\"color: #9333ea;\">touch<\/span> zillow_scraper.py<\/code><\/pre>\n<\/div>\n<p>Ahora, ya est\u00e1 listo.<\/p>\n<h3><strong>Env\u00edo de la primera solicitud<\/strong><\/h3>\n<p>Lo primero que intenta la mayor\u00eda de la gente es una petici\u00f3n Python normal. Que por lo general se parece a esto: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">import<\/span> requests\n\n<span style=\"color: #0891b2;\">url<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/boston-ma\/\"<\/span>\n<span style=\"color: #0891b2;\">response<\/span> = <span style=\"color: #9333ea;\">requests.get<\/span>(<span style=\"color: #0891b2;\">url<\/span>)\n\n<span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #0891b2;\">response<\/span>.status_code)\n<span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #0891b2;\">response<\/span>.text)<\/code><\/pre>\n<\/div>\n<p>Pero cuando lo prob\u00e9, no tard\u00f3 ni dos intentos, ya que mi primera petici\u00f3n volvi\u00f3 bloqueada. Recib\u00ed una respuesta 403 con una p\u00e1gina de bloqueo de PerimeterX: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #16a34a;\">403<\/span>\n<span style=\"color: #9333ea;\">&lt;!DOCTYPE<\/span> <span style=\"color: #16a34a;\">html<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n<span style=\"color: #9333ea;\">&lt;html<\/span> <span style=\"color: #16a34a;\">lang=<\/span><span style=\"color: #dc2626;\">\"en\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n<span style=\"color: #9333ea;\">&lt;head&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;meta<\/span> <span style=\"color: #16a34a;\">charset=<\/span><span style=\"color: #dc2626;\">\"utf-8\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;meta<\/span> <span style=\"color: #16a34a;\">name=<\/span><span style=\"color: #dc2626;\">\"viewport\"<\/span> <span style=\"color: #16a34a;\">content=<\/span><span style=\"color: #dc2626;\">\"width=device-width, initial-scale=1\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;meta<\/span> <span style=\"color: #16a34a;\">name=<\/span><span style=\"color: #dc2626;\">\"description\"<\/span> <span style=\"color: #16a34a;\">content=<\/span><span style=\"color: #dc2626;\">\"px-captcha\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span>\n  <span style=\"color: #9333ea;\">&lt;title&gt;<\/span>Access to this page has been denied<span style=\"color: #9333ea;\">&lt;\/title&gt;<\/span>\n<span style=\"color: #9333ea;\">&lt;\/head&gt;<\/span><\/code><\/pre>\n<\/div>\n<p>Ahora, este es el problema con el scraping de Zillow directamente. Una petici\u00f3n Python normal no se comporta como una sesi\u00f3n de navegaci\u00f3n real. Tampoco tiene la huella digital correcta del navegador, la calidad de IP o el renderizado de JavaScript que permite a Zillow detectarlo inmediatamente y bloquear la solicitud.  <\/p>\n<p>Esta es la raz\u00f3n por la que no construyo el raspador principal alrededor de llamadas directas <strong>requests() <\/strong>a Zillow. En su lugar, env\u00edo mis peticiones a trav\u00e9s de Floppydata&#8217;s Web Unlocker y dejo que se encargue de las partes dif\u00edciles. <\/p>\n<h2><strong>Scraping Zillow con Floppydata Web Unlocker<\/strong><\/h2>\n<p>Enviemos una petici\u00f3n a la p\u00e1gina de b\u00fasqueda utilizando el Desbloqueador Web. Zillow no es el objetivo m\u00e1s dif\u00edcil de escrapear, pero s\u00ed se preocupa por la reputaci\u00f3n IP y el comportamiento del navegador. <\/p>\n<p>Aqu\u00ed es donde entra en juego Web Unlocker. Enruta su solicitud a trav\u00e9s de una IP residencial de confianza, aplica una huella digital real del navegador y devuelve el HTML completamente renderizado. <\/p>\n<p>Una cosa que me gusta mucho de Floppydata es que s\u00f3lo pagas por las solicitudes que tienen \u00e9xito. Si un scrape falla, no cuenta para tu consumo. <\/p>\n<p>El panel de control tambi\u00e9n muestra an\u00e1lisis de las solicitudes en tiempo real, para que pueda realizar un seguimiento de su uso, las tasas de \u00e9xito y los cr\u00e9ditos restantes sin salir de la p\u00e1gina.<\/p>\n<p><img decoding=\"async\" class=\"alignnone size-full wp-image-44268\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image4-4.png\" alt=\"Floppydata Web Unlocker  \" width=\"1999\" height=\"1129\"><\/p>\n<p>Antes de escribir cualquier c\u00f3digo, me gusta probar primero la URL de destino en<a href=\"https:\/\/app.floppydata.com\/tools\/scrape\"> el Web Unlocker <\/a>sin c\u00f3digo. Esto me permite ver la respuesta HTML antes de construir un analizador, as\u00ed que s\u00e9 exactamente qu\u00e9 selectores y datos esperar. <\/p>\n<p>Utilizar la herramienta Web Unlocker es literalmente tan f\u00e1cil como el abecedario. Simplemente abre el <a href=\"https:\/\/app.floppydata.com\/tools\/scrape\">Desbloqueador<\/a> Web desde tu panel de Floppydata. A continuaci\u00f3n, pegue esta URL<a href=\"https:\/\/www.zillow.com\/boston-ma\/\" target=\"_blank\" rel=\"noopener\">\u00abhttps:\/\/www.zillow.com\/boston-ma\/\u00bb<\/a>, haga clic en el bot\u00f3n <strong>Scrape <\/strong>y espere unos segundos  <\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-44278\" src=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3.png\" alt=\"Desbloqueador web\" width=\"1159\" height=\"881\" srcset=\"https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3.png 1159w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3-300x228.png 300w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3-1024x778.png 1024w, https:\/\/floppydata.com\/wp-content\/uploads\/2026\/05\/image2-3-768x584.png 768w\" sizes=\"(max-width: 1159px) 100vw, 1159px\" \/><\/p>\n<p>Una vez finalizado el scrape, compruebe el panel de <strong>vista previa de salida<\/strong> que aparece a continuaci\u00f3n. Deber\u00eda ver la p\u00e1gina HTML completa que contiene los resultados de nuestra b\u00fasqueda en Zillow. <\/p>\n<p>Si los datos tienen buena pinta, utilice <strong>Copiar HTML<\/strong> para obtenerlos o <strong>Descargar<\/strong> para guardar el archivo localmente.<\/p>\n<h3><strong>Comprender la estructura de paginaci\u00f3n de Zillow<\/strong><\/h3>\n<p>La vista previa de la salida devuelve HTML sin formato, lo que es \u00fatil porque puedo inspeccionar la estructura exacta antes de escribir el c\u00f3digo.<\/p>\n<p>Esto es similar a abrir las herramientas de desarrollo del navegador pulsando <strong>F12<\/strong> e inspeccionar la p\u00e1gina directamente. Dentro del HTML descargado, encontr\u00e9 una cosa importante que facilita mucho el an\u00e1lisis sint\u00e1ctico. <\/p>\n<p>La mayor\u00eda de los tutoriales te dir\u00e1n que cojas las tarjetas de listado con selectores CSS, pero Zillow s\u00f3lo muestra 9 tarjetas en el marcado de la p\u00e1gina. Las otras 32 se cargan a medida que te desplazas por la p\u00e1gina, por lo que el scraping con selectores CSS pierde la mayor parte de los datos. <\/p>\n<p>M\u00e1s bien, los resultados de la b\u00fasqueda est\u00e1n dentro de un gran objeto JSON en la p\u00e1gina HTML. Ese JSON se encuentra dentro de esta etiqueta script: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #9333ea;\">&lt;script<\/span> <span style=\"color: #16a34a;\">id=<\/span><span style=\"color: #dc2626;\">\"__NEXT_DATA__\"<\/span> <span style=\"color: #16a34a;\">type=<\/span><span style=\"color: #dc2626;\">\"application\/json\"<\/span><span style=\"color: #9333ea;\">&gt;<\/span><\/code><\/pre>\n<\/div>\n<p>La p\u00e1gina utiliza ese JSON para cargar los datos en el frontend, y nosotros tambi\u00e9n podemos leerlo. Dentro de ese JSON, los listados se encuentran en esta ruta exacta: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #0891b2;\">data<\/span>[<span style=\"color: #dc2626;\">\"props\"<\/span>][<span style=\"color: #dc2626;\">\"pageProps\"<\/span>][<span style=\"color: #dc2626;\">\"searchPageState\"<\/span>][<span style=\"color: #dc2626;\">\"cat1\"<\/span>][<span style=\"color: #dc2626;\">\"searchResults\"<\/span>][<span style=\"color: #dc2626;\">\"listResults\"<\/span>]<\/code><\/pre>\n<\/div>\n<p>As\u00ed que nuestro plan de an\u00e1lisis es simple.<\/p>\n<p>Encontraremos el script <strong>__NEXT_DATA__ <\/strong>con BeautifulSoup, parsearemos el JSON, nos moveremos al array <strong>listResults<\/strong>, y sacaremos los campos que necesitemos.<\/p>\n<h2><strong>Zillow web scraping con Python y Web Unlocker<\/strong><\/h2>\n<p>Ahora podemos pasar del salpicadero al c\u00f3digo.<\/p>\n<p>El snippet del dashboard usa <strong>httpx<\/strong>, pero usar\u00e9 <strong>requests<\/strong> aqu\u00ed porque es m\u00e1s familiar para la mayor\u00eda de los lectores de Python.<\/p>\n<h3><strong>Paso 1: Preparar la solicitud<\/strong><\/h3>\n<p>Empecemos con la configuraci\u00f3n b\u00e1sica. Necesitamos el endpoint de Web Unlocker, nuestra clave API y la URL de Zillow de destino: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">import<\/span> requests\n<span style=\"color: #ea580c;\">import<\/span> json\n<span style=\"color: #ea580c;\">from<\/span> bs4 <span style=\"color: #ea580c;\">import<\/span> BeautifulSoup\n\n<span style=\"color: #0891b2;\">API_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/client-api.floppy.host\/v1\/webUnlocker\"<\/span>\n<span style=\"color: #0891b2;\">API_KEY<\/span> = <span style=\"color: #dc2626;\">\"YOUR_API_KEY\"<\/span>\n<span style=\"color: #0891b2;\">SEARCH_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/boston-ma\/\"<\/span>\n\n<span style=\"color: #0891b2;\">SEARCH_URL<\/span> = <span style=\"color: #dc2626;\">\"live_zillow_boston.json\"<\/span><\/code><\/pre>\n<\/div>\n<p><em>Sustituya <\/em><strong><em>YOUR_API_KEY<\/em><\/strong><em> con la clave de su panel de Floppydata.<\/em><\/p>\n<p>Aqu\u00ed estoy utilizando Boston como mercado objetivo, pero si quieres hacer scraping de otra ciudad, s\u00f3lo tienes que sustituir la URL de b\u00fasqueda.<\/p>\n<h3><strong>Paso 2: Obtener la p\u00e1gina a trav\u00e9s de Web Unlocker<\/strong><\/h3>\n<p>Web Unlocker recibe una carga JSON con la URL de destino y algunas opciones. Devuelve una respuesta JSON que contiene el HTML renderizado en un campo <strong>html<\/strong>: <\/p>\n<p>Ahora creo una funci\u00f3n <strong>fetch_html()<\/strong>para enviar la URL de Zillow a Web Unlocker y devolver el HTML renderizado<\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">url<\/span>):\n    <span style=\"color: #0891b2;\">response<\/span> = <span style=\"color: #9333ea;\">requests.post<\/span>(\n        <span style=\"color: #0891b2;\">API_URL<\/span>,\n        headers={\n            <span style=\"color: #dc2626;\">\"Content-Type\"<\/span>: <span style=\"color: #dc2626;\">\"application\/json\"<\/span>,\n            <span style=\"color: #dc2626;\">\"X-Api-Key\"<\/span>: <span style=\"color: #0891b2;\">API_KEY<\/span>,\n        },\n        json={\n            <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">url<\/span>,\n            <span style=\"color: #dc2626;\">\"country\"<\/span>: <span style=\"color: #dc2626;\">\"US\"<\/span>,\n            <span style=\"color: #dc2626;\">\"city\"<\/span>: <span style=\"color: #dc2626;\">\"Boston\"<\/span>,\n            <span style=\"color: #dc2626;\">\"difficulty\"<\/span>: <span style=\"color: #dc2626;\">\"medium\"<\/span>,\n            <span style=\"color: #dc2626;\">\"expiration\"<\/span>: <span style=\"color: #16a34a;\">0<\/span>,\n        },\n        timeout=<span style=\"color: #16a34a;\">120<\/span>,\n    )\n    <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">raise_for_status<\/span>()\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">json<\/span>()\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"html\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">html<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Unlocker response did not include an 'html' field.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">html<\/span><\/code><\/pre>\n<\/div>\n<p>Aqu\u00ed ocurren varias cosas. Los campos de <strong>pa\u00eds<\/strong> y <strong>ciudad<\/strong> ayudan a que la solicitud coincida mejor con la ubicaci\u00f3n de destino. He utilizado <strong>dificultad<\/strong> <strong>\u00abmedia\u00bb<\/strong> porque Zillow no es una simple p\u00e1gina est\u00e1tica, por lo que necesita un proceso de desbloqueo m\u00e1s fuerte.  <\/p>\n<p>El campo de <strong>caducidad<\/strong> se establece en <strong>0<\/strong>, por lo que obtengo una respuesta nueva. Despu\u00e9s de que la solicitud tiene \u00e9xito, Web Unlocker devuelve una respuesta JSON, y el HTML renderizado est\u00e1 dentro del campo <strong>html<\/strong>. <\/p>\n<h3><strong>Paso 3: Extraer los listados<\/strong><\/h3>\n<p>Ahora podemos aplicar el plan de an\u00e1lisis de antes. Crear\u00e9 una funci\u00f3n <strong>extract_listings()<\/strong>. Esta funci\u00f3n toma el HTML, encuentra los datos JSON de Zillow y extrae los listados:  <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>):\n    <span style=\"color: #0891b2;\">soup<\/span> = <span style=\"color: #9333ea;\">BeautifulSoup<\/span>(<span style=\"color: #0891b2;\">html<\/span>, <span style=\"color: #dc2626;\">\"html.parser\"<\/span>)\n    <span style=\"color: #0891b2;\">next_data<\/span> = <span style=\"color: #0891b2;\">soup<\/span>.<span style=\"color: #9333ea;\">find<\/span>(<span style=\"color: #dc2626;\">\"script\"<\/span>, id=<span style=\"color: #dc2626;\">\"__NEXT_DATA__\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span> <span style=\"color: #ea580c;\">or<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span>.string:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Could not find Zillow's __NEXT_DATA__ script.\"<\/span>)\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #9333ea;\">json.loads<\/span>(<span style=\"color: #0891b2;\">next_data<\/span>.string)\n    <span style=\"color: #0891b2;\">search_state<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"props\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"pageProps\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchPageState\"<\/span>, {})\n    <span style=\"color: #0891b2;\">list_results<\/span> = (\n        <span style=\"color: #0891b2;\">search_state<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"cat1\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchResults\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"listResults\"<\/span>, [])\n    )\n\n    <span style=\"color: #0891b2;\">listings<\/span> = []\n\n    <span style=\"color: #ea580c;\">for<\/span> <span style=\"color: #0891b2;\">item<\/span> <span style=\"color: #ea580c;\">in<\/span> <span style=\"color: #0891b2;\">list_results<\/span>:\n        <span style=\"color: #0891b2;\">listings<\/span>.<span style=\"color: #9333ea;\">append<\/span>(\n            {\n                <span style=\"color: #dc2626;\">\"zpid\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"zpid\"<\/span>),\n                <span style=\"color: #dc2626;\">\"address\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"address\"<\/span>),\n                <span style=\"color: #dc2626;\">\"price\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"price\"<\/span>),\n                <span style=\"color: #dc2626;\">\"beds\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"beds\"<\/span>),\n                <span style=\"color: #dc2626;\">\"baths\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"baths\"<\/span>),\n                <span style=\"color: #dc2626;\">\"sqft\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"area\"<\/span>),\n                <span style=\"color: #dc2626;\">\"status\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"statusType\"<\/span>),\n                <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"detailUrl\"<\/span>),\n            }\n        )\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">listings<\/span><\/code><\/pre>\n<\/div>\n<p>Usando BeautifulSoup, puedo f\u00e1cilmente ir directamente al JSON estructurado dentro de la p\u00e1gina. Luego analic\u00e9 el contenido del script como JSON y obtuve la matriz <strong>listResults<\/strong>. <\/p>\n<p>Cada elemento en listResults es un listado de propiedades, y de cada listado, podemos recoger datos valiosos como:<\/p>\n<ul>\n<li>direcci\u00f3n<\/li>\n<li>precio<\/li>\n<li>camas<\/li>\n<li>ba\u00f1os<\/li>\n<li>zona<\/li>\n<li>statusType<\/li>\n<li>detailUrl<\/li>\n<\/ul>\n<p>He cambiado el nombre del \u00e1rea a pies cuadrados en el resultado final porque es m\u00e1s f\u00e1cil de entender.<\/p>\n<h3><strong>Paso 4: Guardar los resultados en un archivo JSON<\/strong><\/h3>\n<p>Por \u00faltimo, podemos a\u00f1adir una funci\u00f3n <strong>main()<\/strong> para ejecutar el scraper y guardar la salida en un archivo JSON: <\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">main<\/span>():\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Fetching data from: {<span style=\"color: #0891b2;\">SEARCH_URL<\/span>}\"<\/span>)\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">SEARCH_URL<\/span>)\n    <span style=\"color: #0891b2;\">listings<\/span> = <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">listings<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">SystemExit<\/span>(<span style=\"color: #dc2626;\">\"No listings found in Zillow's JSON data.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">with<\/span> <span style=\"color: #9333ea;\">open<\/span>(<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>, <span style=\"color: #dc2626;\">\"w\"<\/span>, encoding=<span style=\"color: #dc2626;\">\"utf-8\"<\/span>) <span style=\"color: #ea580c;\">as<\/span> <span style=\"color: #0891b2;\">file<\/span>:\n        <span style=\"color: #9333ea;\">json.dump<\/span>(<span style=\"color: #0891b2;\">listings<\/span>, <span style=\"color: #0891b2;\">file<\/span>, indent=<span style=\"color: #16a34a;\">2<\/span>)\n\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Found {<span style=\"color: #9333ea;\">len<\/span>(<span style=\"color: #0891b2;\">listings<\/span>)} listings\"<\/span>)\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Saved results to {<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>}\"<\/span>)<\/code><\/pre>\n<\/div>\n<p>Esta funci\u00f3n obtiene la p\u00e1gina, extrae los listados, comprueba que la lista no est\u00e1 vac\u00eda y lo guarda todo en un archivo JSON. Una vez que los datos se ven bien, podemos convertirlos a CSV m\u00e1s tarde o utilizar los datos directamente en nuestras aplicaciones. <\/p>\n<h3><strong>El gui\u00f3n completo<\/strong><\/h3>\n<p>Aqu\u00ed est\u00e1 todo el c\u00f3digo que utilic\u00e9 para extraer con \u00e9xito mis listados de Zillow:<\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code><span style=\"color: #ea580c;\">from<\/span> bs4 <span style=\"color: #ea580c;\">import<\/span> BeautifulSoup\n<span style=\"color: #ea580c;\">import<\/span> requests\n<span style=\"color: #ea580c;\">import<\/span> json\n\n<span style=\"color: #0891b2;\">API_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/client-api.floppy.host\/v1\/webUnlocker\"<\/span>\n<span style=\"color: #0891b2;\">API_KEY<\/span> = <span style=\"color: #dc2626;\">\"Your_API_KEY\"<\/span>\n<span style=\"color: #0891b2;\">SEARCH_URL<\/span> = <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/boston-ma\/\"<\/span>\n<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span> = <span style=\"color: #dc2626;\">\"live_zillow_boston.json\"<\/span>\n\n\n<span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">url<\/span>):\n    <span style=\"color: #0891b2;\">response<\/span> = <span style=\"color: #9333ea;\">requests.post<\/span>(\n        <span style=\"color: #0891b2;\">API_URL<\/span>,\n        headers={\n            <span style=\"color: #dc2626;\">\"Content-Type\"<\/span>: <span style=\"color: #dc2626;\">\"application\/json\"<\/span>,\n            <span style=\"color: #dc2626;\">\"X-Api-Key\"<\/span>: <span style=\"color: #0891b2;\">API_KEY<\/span>,\n        },\n        json={\n            <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">url<\/span>,\n            <span style=\"color: #dc2626;\">\"country\"<\/span>: <span style=\"color: #dc2626;\">\"US\"<\/span>,\n            <span style=\"color: #dc2626;\">\"city\"<\/span>: <span style=\"color: #dc2626;\">\"Boston\"<\/span>,\n            <span style=\"color: #dc2626;\">\"difficulty\"<\/span>: <span style=\"color: #dc2626;\">\"medium\"<\/span>,\n            <span style=\"color: #dc2626;\">\"expiration\"<\/span>: <span style=\"color: #16a34a;\">0<\/span>,\n        },\n        timeout=<span style=\"color: #16a34a;\">120<\/span>,\n    )\n    <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">raise_for_status<\/span>()\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #0891b2;\">response<\/span>.<span style=\"color: #9333ea;\">json<\/span>()\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"html\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">html<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Unlocker response did not include an 'html' field.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">html<\/span>\n\n\n<span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>):\n    <span style=\"color: #0891b2;\">soup<\/span> = <span style=\"color: #9333ea;\">BeautifulSoup<\/span>(<span style=\"color: #0891b2;\">html<\/span>, <span style=\"color: #dc2626;\">\"html.parser\"<\/span>)\n    <span style=\"color: #0891b2;\">next_data<\/span> = <span style=\"color: #0891b2;\">soup<\/span>.<span style=\"color: #9333ea;\">find<\/span>(<span style=\"color: #dc2626;\">\"script\"<\/span>, id=<span style=\"color: #dc2626;\">\"__NEXT_DATA__\"<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span> <span style=\"color: #ea580c;\">or<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">next_data<\/span>.string:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">ValueError<\/span>(<span style=\"color: #dc2626;\">\"Could not find Zillow's __NEXT_DATA__ script.\"<\/span>)\n\n    <span style=\"color: #0891b2;\">data<\/span> = <span style=\"color: #9333ea;\">json.loads<\/span>(<span style=\"color: #0891b2;\">next_data<\/span>.string)\n    <span style=\"color: #0891b2;\">search_state<\/span> = <span style=\"color: #0891b2;\">data<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"props\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"pageProps\"<\/span>, {}).<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchPageState\"<\/span>, {})\n    <span style=\"color: #0891b2;\">list_results<\/span> = (\n        <span style=\"color: #0891b2;\">search_state<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"cat1\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"searchResults\"<\/span>, {})\n        .<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"listResults\"<\/span>, [])\n    )\n\n    <span style=\"color: #0891b2;\">listings<\/span> = []\n\n    <span style=\"color: #ea580c;\">for<\/span> <span style=\"color: #0891b2;\">item<\/span> <span style=\"color: #ea580c;\">in<\/span> <span style=\"color: #0891b2;\">list_results<\/span>:\n        <span style=\"color: #0891b2;\">listings<\/span>.<span style=\"color: #9333ea;\">append<\/span>(\n            {\n                <span style=\"color: #dc2626;\">\"zpid\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"zpid\"<\/span>),\n                <span style=\"color: #dc2626;\">\"address\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"address\"<\/span>),\n                <span style=\"color: #dc2626;\">\"price\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"price\"<\/span>),\n                <span style=\"color: #dc2626;\">\"beds\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"beds\"<\/span>),\n                <span style=\"color: #dc2626;\">\"baths\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"baths\"<\/span>),\n                <span style=\"color: #dc2626;\">\"sqft\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"area\"<\/span>),\n                <span style=\"color: #dc2626;\">\"status\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"statusType\"<\/span>),\n                <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #0891b2;\">item<\/span>.<span style=\"color: #9333ea;\">get<\/span>(<span style=\"color: #dc2626;\">\"detailUrl\"<\/span>),\n            }\n        )\n\n    <span style=\"color: #ea580c;\">return<\/span> <span style=\"color: #0891b2;\">listings<\/span>\n\n\n<span style=\"color: #ea580c;\">def<\/span> <span style=\"color: #9333ea;\">main<\/span>():\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Fetching data from: {<span style=\"color: #0891b2;\">SEARCH_URL<\/span>}\"<\/span>)\n    <span style=\"color: #0891b2;\">html<\/span> = <span style=\"color: #9333ea;\">fetch_html<\/span>(<span style=\"color: #0891b2;\">SEARCH_URL<\/span>)\n    <span style=\"color: #0891b2;\">listings<\/span> = <span style=\"color: #9333ea;\">extract_listings<\/span>(<span style=\"color: #0891b2;\">html<\/span>)\n\n    <span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #ea580c;\">not<\/span> <span style=\"color: #0891b2;\">listings<\/span>:\n        <span style=\"color: #ea580c;\">raise<\/span> <span style=\"color: #9333ea;\">SystemExit<\/span>(<span style=\"color: #dc2626;\">\"No listings found in Zillow's JSON data.\"<\/span>)\n\n    <span style=\"color: #ea580c;\">with<\/span> <span style=\"color: #9333ea;\">open<\/span>(<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>, <span style=\"color: #dc2626;\">\"w\"<\/span>, encoding=<span style=\"color: #dc2626;\">\"utf-8\"<\/span>) <span style=\"color: #ea580c;\">as<\/span> <span style=\"color: #0891b2;\">file<\/span>:\n        <span style=\"color: #9333ea;\">json.dump<\/span>(<span style=\"color: #0891b2;\">listings<\/span>, <span style=\"color: #0891b2;\">file<\/span>, indent=<span style=\"color: #16a34a;\">2<\/span>)\n\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Found {<span style=\"color: #9333ea;\">len<\/span>(<span style=\"color: #0891b2;\">listings<\/span>)} listings\"<\/span>)\n    <span style=\"color: #9333ea;\">print<\/span>(<span style=\"color: #dc2626;\">f\"Saved results to {<span style=\"color: #0891b2;\">OUTPUT_FILE<\/span>}\"<\/span>)\n\n\n<span style=\"color: #ea580c;\">if<\/span> <span style=\"color: #6366f1;\">__name__<\/span> == <span style=\"color: #dc2626;\">\"__main__\"<\/span>:\n    <span style=\"color: #9333ea;\">main<\/span>()<\/code><\/pre>\n<\/div>\n<p>Si todo est\u00e1 configurado correctamente, deber\u00eda ver una salida como \u00e9sta:<\/p>\n<div style=\"margin: 20px 0 28px 0;\">\n<pre style=\"background: #f8fafc; border: 1px solid #e5e7eb; border-radius: 10px; padding: 18px; margin: 0; font-size: 13px; line-height: 1.6; overflow-x: auto; white-space: pre-wrap; word-wrap: break-word;\"><code>[\n  {\n    <span style=\"color: #dc2626;\">\"zpid\"<\/span>: <span style=\"color: #dc2626;\">\"59174136\"<\/span>,\n    <span style=\"color: #dc2626;\">\"address\"<\/span>: <span style=\"color: #dc2626;\">\"45 Garden St APT 3, Boston, MA 02114\"<\/span>,\n    <span style=\"color: #dc2626;\">\"price\"<\/span>: <span style=\"color: #dc2626;\">\"$685,000\"<\/span>,\n    <span style=\"color: #dc2626;\">\"beds\"<\/span>: <span style=\"color: #16a34a;\">2<\/span>,\n    <span style=\"color: #dc2626;\">\"baths\"<\/span>: <span style=\"color: #16a34a;\">1<\/span>,\n    <span style=\"color: #dc2626;\">\"sqft\"<\/span>: <span style=\"color: #16a34a;\">525<\/span>,\n    <span style=\"color: #dc2626;\">\"status\"<\/span>: <span style=\"color: #dc2626;\">\"FOR_SALE\"<\/span>,\n    <span style=\"color: #dc2626;\">\"url\"<\/span>: <span style=\"color: #dc2626;\">\"https:\/\/www.zillow.com\/homedetails\/45-Garden-St-APT-3-Boston-MA-02114\/59174136_zpid\/\"<\/span>\n  }\n]<\/code><\/pre>\n<\/div>\n<p>En este punto, tu scraper est\u00e1 funcionando, lo que significa que ahora eres capaz de raspar informaci\u00f3n clave de cualquier listado de Zillow.<\/p>\n<h2><strong>Resoluci\u00f3n de problemas comunes<\/strong><\/h2>\n<p>Si rastreas los datos inmobiliarios de Zillow con frecuencia, seguro que en alg\u00fan momento te topas con alg\u00fan muro. Yo mismo me he enfrentado a un par de ellos. Por lo tanto, te puedo decir qu\u00e9 esperar, incluyendo:  <\/p>\n<ul>\n<li><strong>Errores<\/strong><strong>403<\/strong>: Significa que Zillow ha bloqueado tu bot. Prueba a cambiar tus cabeceras o a utilizar un proxy para seguir obteniendo datos de Zillow. <\/li>\n<li><strong>Respuestas<\/strong><strong>vac\u00edas<\/strong>: Eso podr\u00eda deberse a la renderizaci\u00f3n de JavaScript. Prueba a utilizar una herramienta que renderice completamente la p\u00e1gina antes de devolver el HTML, como Web Unlocker. <\/li>\n<li><strong>Faltan<\/strong> <strong>datos<\/strong>: No todos los listados tienen la misma informaci\u00f3n. Utiliza siempre .get() cuando extraigas datos de Zillow para que tu scraper no se bloquee al faltar una clave.<\/li>\n<\/ul>\n<p>Como Zillow no ofrece una API gratuita, tendr\u00e1s que encontrar una forma de evitarlo. Si necesitas una forma fiable de acceder a los datos de los listados de Zillow, la mejor opci\u00f3n es Web Unlocker de Floppydata. <\/p>\n<h2><strong>Conclusi\u00f3n<\/strong><\/h2>\n<p>Zillow no parece un sitio de alta seguridad, pero est\u00e1 protegido por PerimeterX y un sistema de detecci\u00f3n por capas que vigila tu IP, cabeceras, huella digital TLS y se\u00f1ales de comportamiento. Si act\u00faas de forma sospechosa, ser\u00e1s marcado y bloqueado indefinidamente. <\/p>\n<p>Por lo tanto, es necesario tener cuidado al rasparlo. Aqu\u00ed es donde entra Floppydata Web Unlocker. Lo:  <\/p>\n<ul>\n<li>Rota los proxies residenciales premium<\/li>\n<li>Rotaci\u00f3n de cabeceras y huella digital real del navegador<\/li>\n<li>Se carga siempre limpio y con HTML completo<\/li>\n<li>S\u00f3lo se facturan las respuestas positivas<\/li>\n<\/ul>\n<p>Con esta configuraci\u00f3n, no tienes que luchar contra el sistema anti-bot de Zillow por ti mismo; deja que Floppy Data Web Unlocker te ayude. <a href=\"https:\/\/app.floppydata.com\/tools\/scrape\">Comience a raspar Zillow<\/a> ahora con <strong>5 raspados gratis<\/strong>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Al ser una de las principales plataformas inmobiliarias de EE.UU., Zillow se convierte en una plataforma a la que muchas empresas quieren recurrir para obtener datos sobre propiedades. La plataforma recibe actualmente alrededor de 243 millones de visitas al mes, por lo que, naturalmente, alberga una enorme cantidad de datos inmobiliarios \u00fatiles. Sin embargo, [&hellip;]<\/p>\n","protected":false},"author":20,"featured_media":44294,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[149,563,545],"tags":[],"class_list":["post-44371","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","category-scraping","category-how-to"],"acf":[],"_links":{"self":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/posts\/44371","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/users\/20"}],"replies":[{"embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/comments?post=44371"}],"version-history":[{"count":0,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/posts\/44371\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/media\/44294"}],"wp:attachment":[{"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/media?parent=44371"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/categories?post=44371"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/floppydata.com\/es\/wp-json\/wp\/v2\/tags?post=44371"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}