Herramientas de raspado de datos para raspar datos inmobiliarios usando Python
Publicado: 2019-08-12Los principales sitios inmobiliarios del mundo son un tesoro de datos valiosos. La base de datos de cualquier sitio inmobiliario popular de EE. UU. puede contener información sobre más de 100 millones de viviendas. Estas casas incluyen las que están en venta, alquiler o incluso las que no están actualmente en el mercado. El raspado de datos inmobiliarios también proporciona datos para estimaciones de alquileres y propiedades llamados "Zestimates". Ayuda a los propietarios, así como a los clientes, a planificar mejor al tratar de estimar los precios de las propiedades en los próximos años.
Cuando se trata de comprar o alquilar propiedades, sabemos que lo primero que viene a la mente es la comparación de precios. Estos sitios de vivienda brindan una comparación de precios con todos los listados en esa área, así como información básica como el tipo de casa, la cantidad de habitaciones, el tamaño, una breve descripción, etc.
¿Por qué rastrear datos de sitios inmobiliarios?
Las grandes empresas de listado de propiedades apuntan a una región entera y trabajan en millones de propiedades. Pero en caso de que sea un agente de bienes raíces, en lugar de tratar de recopilar datos manualmente usted mismo, puede rastrear mejor los datos de un sitio web importante de listados de bienes raíces.
También puede crear modelos de aprendizaje automático para predecir los precios de las propiedades y comparar sus predicciones con Zestimates de Zillow y ver cuál es mejor o más cercano a los valores reales.
¿Cómo raspar datos de bienes raíces usando Python?
En caso de que haya seguido alguno de nuestros artículos anteriores sobre "Cómo rastrear o escapar", es posible que ya tenga la configuración necesaria lista en sus computadoras. En caso de que no lo haya hecho, le recomiendo que siga este artículo para configurar el raspado de datos de Python, sus paquetes y el editor de texto antes de que pueda ensuciarse las manos con el código.
¿Dónde está El Código?
Sin mucho preámbulo, decidimos traerle el código para raspar datos de bienes raíces usando python que lo ayudará a extraer información de un sitio web de listado de propiedades. El código de rastreo de datos está escrito en Python y, posteriormente, le mostraré cómo ejecutarlo y qué obtendrá una vez que lo ejecute.
[lenguaje de código = "python"]
#!/usr/bin/python
# -*- codificación: utf-8 -*-
importar urllib.request
importar urllib.parse
importar urllib.error
de bs4 importar BeautifulSoup
importar ssl
importar json
importar ast
importar sistema operativo
de urllib.request Solicitud de importación, urlopen
# Para ignorar los errores del certificado SSL
ctx = ssl.create_default_context()
ctx.check_hostname=Falso
ctx.verify_mode = ssl.CERT_NONE
# Entrada del usuario
url = input('Ingrese la URL de la lista de Zillow House-')
# Hacer que el sitio web crea que está accediendo a él usando un navegador mozilla
req = Solicitud (url, encabezados = {'Agente de usuario': 'Mozilla/5.0'})
página web = urlopen(req).read()
# Creación de un objeto BeautifulSoup de la página html para una fácil extracción de datos.
sopa = BeautifulSoup(página web, 'html.parser')
html = sopa.prettify('utf-8')
propiedad_json = {}
property_json['Detalles_Broad'] = {}
property_json['Dirección'] = {}
# Extraer Título de la lista de propiedades
para título en sopa.findAll('título'):
property_json['Título'] = título.texto.strip()
descanso
para meta en sopa.findAll('meta', attrs={'nombre': 'descripción'}):
property_json['Detalle_Corto'] = meta['contenido'].strip()
para div en sopa.findAll('div', attrs={'clase': 'character-count-truncated'}):
property_json['Details_Broad']['Description'] = div.text.strip()
for (i, script) en enumerate(soup.findAll('script',
attrs={'tipo': 'aplicación/ld+json'})):
si yo == 0:
json_data = json.loads(secuencia de comandos.texto)
property_json['Details_Broad']['Número de habitaciones'] = json_data['númeroDeHabitaciones']
property_json['Details_Broad']['Tamaño del piso (en pies cuadrados)'] = json_data['floorSize']['value']
property_json['Dirección']['Calle'] = json_data['dirección']['dirección de la calle']
property_json['Address']['Locality'] = json_data['address']['addressLocality']
property_json['Dirección']['Región'] = json_data['dirección']['direcciónRegión']
property_json['Dirección']['Código postal'] = json_data['dirección']['Código postal']
si yo == 1:
json_data = json.loads(secuencia de comandos.texto)
property_json['Precio en $'] = json_data['ofertas']['precio']
property_json['Imagen'] = json_data['imagen']
descanso
con open('data.json', 'w') como archivo de salida:
json.dump(propiedad_json, archivo de salida, sangría=4)
con open('output_file.html', 'wb') como archivo:
archivo.escribir(html)
print ('———-La extracción de datos está completa. Verifique el archivo json.———-')
[/código]
Para ejecutar el código anterior, debe guardarlo en un archivo con la extensión, como propertyScraper.py. Una vez hecho esto, desde la terminal, ejecute el comando –
[lenguaje de código = "python"]
python propertyScraper.py
[/código]
Cuando lo ejecute, se le pedirá que ingrese la URL de una lista de propiedades. Esta es la página web que el programa realmente rastreará en busca de datos. Hemos usado dos enlaces y raspado los datos de dos propiedades. Aquí están los enlaces –
- https://www.zillow.com/homedetails/638-Grant-Ave-North-Baldwin-NY-11510/31220792_zpid/
- https://www.zillow.com/homedetails/10-Walnut-St-Arlington-MA-02476/56401372_zpid/
Los archivos JSON obtenidos al ejecutar el código en lo que se indica en un subtema posterior.

Código Explicación
Antes de analizar cómo se ejecuta el código y qué devuelve, es importante comprender el código en sí. Como de costumbre, primero presionamos la URL proporcionada y capturamos todo el HTML que convertimos en un hermoso objeto de sopa. Una vez hecho esto, extraemos divs, scripts, títulos y otras etiquetas específicas con atributos específicos. De esta manera, podemos identificar información específica que es posible que deseemos extraer de una página.
Puede ver que también hemos extraído un enlace de imagen para cada propiedad. Esto se ha hecho deliberadamente ya que, para algo como los bienes raíces, las imágenes tienen tanto valor como otra información. Si bien hemos extraído varios campos de las páginas de listados de bienes raíces, se debe tener en cuenta que la página HTML contiene muchos más puntos de datos. Por lo tanto, también estamos guardando el contenido HTML localmente para que pueda revisarlo y rastrear más información.
Algunos de los listados de casas que raspamos
Como mencionamos antes, en realidad rastreamos algunas listas de propiedades para mostrarle cómo se verían los datos extraídos por Python en formato JSON. Además, hemos mencionado la propiedad para la cual es un JSON en particular, bajo JSON. Ahora hablemos de los puntos de datos que raspamos.
Obtuvimos una imagen de la propiedad (aunque muchas imágenes para cada propiedad están disponibles en una página de listado, obtuvimos una para cada una, esa es la imagen superior de cada listado). También obtuvimos el precio (en $) que figura en la lista, el título de la propiedad y una descripción que lo ayudaría a crear una imagen mental de la propiedad.
Junto con esto, raspamos la dirección, desglosada en cuatro partes separadas: la calle, la localidad, la región y el código postal. Tenemos otro campo de detalles que tiene múltiples subcampos, como el número de habitaciones, el tamaño del piso y una descripción larga. En ciertos casos, falta la descripción, como descubrimos una vez que raspamos varias páginas.
[lenguaje de código = "python"]
{
"Detalles_Broad": {
“Número de Habitaciones”: 4,
“Tamaño del piso (en pies cuadrados)”: “1,728”
},
"Dirección": {
“Calle”: “638 Grant Ave”,
“Localidad”: “North baldwin”,
“Región”: “Nueva York”,
“Código Postal”: “11510”
},
“Título”: “638 Grant Ave, North Baldwin, NY 11510 | MLS n.º 3137924 | Zillow”,
“Detail_Short”: “638 Grant Ave, North baldwin, NY 11510-1332 es una casa unifamiliar listada para la venta en $299,000. La casa de 1,728 pies cuadrados es una propiedad de 4 dormitorios y 2.0 baños. Encuentre 31 fotos de la casa 638 Grant Ave en Zillow. Vea más detalles de propiedades, historial de ventas y datos de Zestimate en Zillow. MLS n.° 3137924”,
“Precio en $”: 299000,
“Imagen”: “https://photos.zillowstatic.com/p_h/ISzz1p7wk4ktye1000000000.jpg”
}
[/código]
[lenguaje de código = "python"]
{
"Detalles_Broad": {
“Descripción”: “Casa unifamiliar de tres buhardillas situada en el vecindario Brattle de Arlington, entre Arlington Heights y Arlington Center. Construida en la década de 1920, esta casa ofrece hermosos detalles de época, pisos de madera noble, techos con vigas, sala de estar con chimenea y solárium privado, un comedor formal, tres amplios dormitorios, una oficina y dos baños completos. El potencial de mejorar esta propiedad para expandir el espacio habitable y personalizarlo a su gusto personal es excepcional. Cerca de Minuteman Commuter Bikeway, las líneas de autobús Rt 77 y 79, escuelas, tiendas y restaurantes. Se proporcionan fotos virtuales de puesta en escena y renovación virtual para ayudarlo a visualizar”.,
“Número de Habitaciones”: 4,
“Tamaño del piso (en pies cuadrados)”: “2,224”
},
"Dirección": {
“Calle”: “Calle Nogal 10”,
“Localidad”: “Arlington”,
“Región”: “MA”,
“Código Postal”: “02476”
},
“Título”: “10 Walnut St, Arlington, MA 02476 | #72515880 | Zillow”,
“Detail_Short”: “10 Walnut St, Arlington, MA 02476-6116 es una casa unifamiliar listada para la venta en $725,000. La casa de 2,224 pies cuadrados es una propiedad de 4 dormitorios y 2.0 baños. Encuentre 34 fotos de la casa 10 Walnut St en Zillow. Vea más detalles de propiedades, historial de ventas y datos de Zestimate en Zillow. MLS n.° 72515880”,
“Precio en $”: 725000,
“Imagen”: “https://photos.zillowstatic.com/p_h/ISifzwig3xt2re1000000000.jpg”
}
[/código]
[lenguaje de código = "python"]
{
"Detalles_Broad": {
“Número de Habitaciones”: 4,
“Tamaño del piso (en pies cuadrados)”: “1,728”
},
"Dirección": {
“Calle”: “638 Grant Ave”,
“Localidad”: “North baldwin”,
“Región”: “Nueva York”,
“Código Postal”: “11510”
},
“Título”: “638 Grant Ave, North Baldwin, NY 11510 | MLS n.º 3137924 | Zillow”,
“Detail_Short”: “638 Grant Ave, North baldwin, NY 11510-1332 es una casa unifamiliar listada para la venta en $299,000. La casa de 1,728 pies cuadrados es una propiedad de 4 dormitorios y 2.0 baños. Encuentre 31 fotos de la casa 638 Grant Ave en Zillow. Vea más detalles de propiedades, historial de ventas y datos de Zestimate en Zillow. MLS n.° 3137924”,
“Precio en $”: 299000,
“Imagen”: “https://photos.zillowstatic.com/p_h/ISzz1p7wk4ktye1000000000.jpg”
}
[/código]
Raspado de datos inmobiliarios a gran escala
Usando un código como este, puede rastrear detalles relacionados solo con algunas propiedades inmobiliarias específicas. Puede verificar manualmente las propiedades que le interesan de vez en cuando. Sin embargo, si desea dirigirse a una región específica en los EE. UU. o a nivel internacional, necesitará un proveedor de servicios de extracción de datos web experto o herramientas de extracción de datos que lo ayuden a recopilar listados de propiedades de una serie de sitios web.
PromptCloud, como proveedor líder de web scraping, cree que las soluciones de web scraping deben ser sencillas y deben contener solo dos pasos: el cliente proporciona el requisito y recibe datos limpios.
Además, tenga en cuenta que aquí en el blog hemos utilizado tanto el rastreador como el raspador. No se confunda más o menos, ambos son lo mismo, pero si quiere saber más, puede consultar nuestro blog sobre el rastreo de datos web frente al raspado de datos web.
Descargo de responsabilidad: el código presente en nuestro tutorial es solo para fines de aprendizaje. No seremos responsables de la forma en que se use, y no habrá responsabilidad de nuestra parte por ningún efecto adverso del código fuente. La mera presencia de este código en nuestro sitio no implica que promovamos el raspado o el rastreo de los sitios web mencionados en el artículo. El único propósito de este tutorial es mostrar la técnica de escribir web scrapers para los principales portales web. Sin embargo, no estamos obligados a brindar soporte para el código; lo alentamos a agregar sus preguntas y comentarios en la sección de comentarios para que podamos verificar y responder en ciertos intervalos .
