Ir al contenido

Cómo extraer datos de Zillow: una guía paso a paso para profesionales del sector inmobiliario

Como uno de los sitios inmobiliarios más populares con más de 200 millones de visitas mensuales, Zillow ofrece un tesoro de datos para los profesionales de la industria. Al recopilar y analizar todos esos datos, puede descubrir información valiosa sobre el mercado para impulsar su negocio.

¿Pero por dónde empiezas? No temas: en esta guía, compartiré las técnicas exactas que he perfeccionado durante más de 10 años en la extracción de datos web para construir un raspador de Zillow escalable desde cero.

Por qué Zillow Data es una mina de oro

Primero hablemos de porque Los inversores y agentes inteligentes eliminan a Zillow en primer lugar:

  • Detectar oportunidades: Analice datos de precios y demanda para identificar áreas prometedoras o infravaloradas.
  • Enriquece tu base de datos: Aumente los registros de sus clientes con detalles de la propiedad como habitaciones, baños y valores impositivos.
  • Monitorear la competencia: Esté atento a los nuevos listados de otros agentes que ingresan al mercado.
  • Confirmar condición de propiedad: Investigamos casas vendidas recientemente para verificar las afirmaciones de los propietarios actuales.
  • Descubra las tendencias del mercado: Detectar el aumento de la demanda de propiedades cerca de nuevos desarrollos comerciales.

Con más de 9 mil millones de visitas y más de 50 millones de usuarios activos mensuales, Zillow ofrece una profundidad y amplitud de datos inmobiliarios incomparables.

Retos para superar

Por supuesto, aprovechar todos esos datos no siempre es sencillo. A continuación se detallan algunos obstáculos comunes que puede enfrentar:

  • Detección de robots: Zillow bloquea los raspadores con captcha, filtros de IP y otras defensas.
  • Representación de JavaScript: Los detalles clave se cargan dinámicamente a través de JS.
  • Cambios frecuentes de diseño: Las actualizaciones rompen constantemente los raspadores.
  • Limitación de velocidad: Bloqueos agresivos de solicitudes por minuto.

Pero no se preocupe: compartiré métodos probados para abordar cada problema. Con el enfoque correcto, puede extraer miles de registros por día de Zillow de manera confiable.

Paso 1: configurar un entorno de raspado web de Python

Para este proyecto, usaremos Python – el lenguaje ideal para web scraping y análisis de datos.

Primero, instale Python 3.6 o superior si aún no lo tiene. Recomiendo crear un entorno virtual para aislar las dependencias:

python3 -m venv zillowscraping

Active el entorno, luego instale los paquetes que necesitamos:

pip install requests beautifulsoup4 pandas matplotlib selenium webdriver-manager

Esto nos brinda herramientas para enviar solicitudes, analizar HTML, analizar datos, automatizar navegadores y más.

¡Ahora la diversión realmente puede comenzar!

Paso 2: inspeccionar las páginas de destino

A continuación, analizaremos manualmente las páginas que queremos extraer utilizando las herramientas de desarrollo del navegador:

Herramientas de desarrollo del navegador

En una página de resultados de búsqueda, el HTML tiene este aspecto:

<div class="property-card">
  <div class="details">
    <div class="price">$299,000</div> 
    <div class="address">
      <a href="/es/1234-maple-st">1234 Maple St</a>
    </div>
    <div class="specs">
      3 bd | 2 ba | 1,420 sqft
    </div>
  </div>
</div>

Podemos ver elementos claros como precio, dirección, habitaciones, baños y pies cuadrados. ¡Lindo!

Ahora revisemos una página de listado individual:

<script>window.dataLayer = [{"property":"1234 Maple St"}];</script>

<div id="price"></div>

<script src="getDetails.js"></script>

Hmm… los detalles se cargan dinámicamente a través de JavaScript. No hay problema: podemos usar Selenium para representar las páginas y extraer los datos que queramos.

Paso 3: extraer la página de resultados de búsqueda

Armados con nuestra exploración, eliminemos esos resultados de búsqueda.

Primero solicitaremos la página HTML:

import requests

url = "https://zillow.com/my-search-results/"
headers = {"User-Agent": "Mozilla..."} 

response = requests.get(url, headers=headers)
html = response.text

Luego podemos analizar con Beautiful Soup:

from bs4 import BeautifulSoup

soup = BeautifulSoup(html, "html.parser")

Ahora extrae los datos:

cards = soup.find_all("div", class_="property-card")

for card in cards:
  price = card.find("div", class_="price").text
  address = card.find("a").text
  beds, baths, sqft = card.find("div", class_="specs").text.split("|")

  print({
    "price": price, 
    "address": address,
    ...
  })

Para manejar la paginación, podemos buscar un enlace "Siguiente" y repetir el proceso hasta que no queden más páginas.

Paso 4: Raspe la página de detalles con Selenium

Para páginas de listado individuales, usaremos Selenio para automatizar un navegador y renderizar JavaScript.

Instale el controlador Chrome:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install()) 

Ahora podemos extraer detalles:

def get_listing_data(url):

  driver.get(url)

  price = driver.find_element_by_id("price").text
  address = driver.find_element_by_id("address").text
  ...

  return {
    "price": price,
    "address": address,
    ...
  }

Llame a esta función para extraer cada página a medida que recorremos las URL de los resultados de búsqueda.

Paso 5: Evite bloqueos con proxys y agentes de usuario

Para evitar las defensas de Zillow, es esencial enrutar las solicitudes a través de proxies y rotar regularmente agentes de usuario:

from random import choice 

proxies = ["192.168.1.1:8080", "192.168.1.2:8080"...]
user_agents = ["UA1", "UA2"...]

proxy = choice(proxies)
headers = {"User-Agent": choice(user_agents)}

response = requests.get(url, proxies={"http": proxy, "https": proxy}, headers=headers)

Esto ayuda a distribuir solicitudes entre muchas IP diferentes e imitar a usuarios reales.

Recomiendo asociarse con servicios de proxy como BrightData, SmartProxy o Microleaves para obtener acceso a millones de IP residenciales perfectas para evadir bloqueos.

Paso 6: implementar limitaciones y reintentos

Para evitar alcanzar los límites de velocidad, debemos limitar las solicitudes agregando retrasos aleatorios:

from time import sleep
from random import randint

# Make request
sleep(randint(1, 5)) # Random delay

Y use bloques try/except para reintentar errores:

from requests.exceptions import RequestException

try:
  response = requests.get(url)
except RequestException as e:
  # Retry with exponential backoff
  sleep(2**num_retries)  
  response = requests.get(url) 

Esto crea un raspador resistente que puede superar problemas intermitentes.

Paso 7: almacenar datos extraídos

Una vez extraídos, necesitamos almacenar los datos. Para proyectos más pequeños, los archivos CSV pueden ser suficientes:

import csv

with open("zillow.csv", "w") as f:
  writer = csv.writer(f)
  writer.writerow(["Address", "Price", "Beds", "Baths" ...])
  for listing in listings:
    writer.writerow(listing)  

Para conjuntos de datos más grandes, cárguelos en una base de datos SQL o en un almacén NoSQL como MongoDB. ¡Esto permite crear paneles y mapas interactivos para descubrir información!

¡Empecemos a raspar!

Ahí lo tiene: un proceso probado en batalla para extraer datos inmobiliarios de Zillow. Ahora puede aprovechar su gran cantidad de listados para llevar su negocio al siguiente nivel.

Cuando comiences a raspar, ¡no dudes en comunicarte con nosotros si tienes alguna otra pregunta! Siempre estaré encantado de ayudar a otros profesionales del sector inmobiliario a utilizar los datos de forma más eficaz.

¡Avísame una vez que comiences a extraer miles de listados nuevos de Zillow todos los días!

Únase a la conversación

Su dirección de correo electrónico no será publicada. Las areas obligatorias están marcadas como requeridas *