跳到内容

如何从 Zillow 抓取数据:房地产专业人士的分步指南

作为每月访问量超过 200 亿次的最受欢迎的房地产网站之一,Zillow 为行业专业人士提供了丰富的数据宝库。 通过抓取和分析所有这些数据,您可以发现强大的市场洞察来促进您的业务。

但你从哪儿开始呢? 不用担心 - 在本指南中,我将分享我在 Web 数据提取方面磨练了 10 多年的确切技术,以从头开始构建可扩展的 Zillow 抓取工具。

为什么 Zillow 数据是一座金矿

我们先来说说 为什么 精明的投资者和代理商首先会抓取 Zillow:

  • 发现机会: 分析定价和需求数据,以确定新兴或被低估的领域。
  • 丰富您的数据库: 使用床位、浴室、税值等财产详细信息来丰富您的客户记录。
  • 监控比赛: 密切关注其他进入市场的代理商的新房源。
  • 确认房产状况: 最近进行的一项研究出售了房屋,以核实当前业主的说法。
  • 揭示市场趋势: 新商业开发项目附近的房产需求激增。

Zillow 拥有超过 9 亿次访问量和 50 多万月活跃用户,提供无与伦比的深度和广度的房地产数据。

克服的挑战

当然,利用所有这些数据并不总是那么简单。 以下是您可能面临的一些常见障碍:

  • 机器人检测: Zillow 使用验证码、IP 过滤器和其他防御措施来阻止抓取工具。
  • JavaScript 渲染: 关键细节通过 JS 动态加载。
  • 频繁的布局更改: 更新不断破坏爬虫。
  • 速率限制: 每分钟请求的积极阻止。

但别担心——我将分享解决每个问题的行之有效的方法。 通过正确的方法,您每天可以从 Zillow 可靠地提取数千条记录。

第 1 步:设置 Python 网页抓取环境

对于这个项目,我们将使用 蟒蛇 – 网络抓取和数据分析的理想语言。

首先,如果您尚未安装 Python 3.6 或更高版本,请安装它。 我建议创建一个虚拟环境来隔离依赖项:

python3 -m venv zillowscraping

激活环境,然后安装我们需要的包:

pip install requests beautifulsoup4 pandas matplotlib selenium webdriver-manager

这为我们提供了发送请求、解析 HTML、分析数据、自动化浏览器等的工具。

现在乐趣才真正开始!

第 2 步:检查目标页面

接下来,我们将使用浏览器开发人员工具手动分析要抓取的页面:

浏览器开发者工具

在搜索结果页面上,HTML 如下所示:

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

我们可以看到价格、地址、床位、浴室和平方英尺等清晰的元素。 好的!

现在让我们检查一个单独的列表页面:

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

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

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

嗯……详细信息是通过 JavaScript 动态加载的。 没问题——我们可以使用 Selenium 来渲染页面并提取我们想要的数据。

第 3 步:抓取搜索结果页面

有了我们的探索,让我们抓取这些搜索结果。

首先我们将请求页面 HTML:

import requests

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

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

然后我们可以用 Beautiful Soup 来解析:

from bs4 import BeautifulSoup

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

现在提取数据:

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,
    ...
  })

为了处理分页,我们可以检查“下一页”链接并重复该过程,直到没有更多页面为止。

第 4 步:使用 Selenium 抓取详细信息页面

对于单个列表页面,我们将使用 自动化浏览器并呈现 JavaScript。

安装 Chrome 驱动程序:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

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

现在我们可以提取详细信息:

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,
    ...
  }

当我们迭代搜索结果 URL 时,调用此函数来抓取每个页面。

第 5 步:避免代理和用户代理阻塞

为了避免 Zillow 的防御,必须通过以下方式路由请求: 代理 并定期轮换 用户代理:

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)

这有助于在许多不同的 IP 之间分发请求并模仿真实用户。

我建议与 BrightData、SmartProxy 或 Microleaves 等代理服务合作,以访问数百万个住宅 IP,非常适合规避封锁。

第 6 步:实施限制和重试

为了避免达到速率限制,我们需要通过添加随机延迟来限制请求:

from time import sleep
from random import randint

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

并使用 try/ except 块重试错误:

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) 

这创建了一个有弹性的刮刀,可以解决间歇性问题。

第7步:存储抓取的数据

抓取后,我们需要存储数据。 对于较小的项目,CSV 文件可能就足够了:

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)  

对于较大的数据集,请加载到 SQL 数据库或 NoSQL 存储(例如 MongoDB)中。 这使得能够构建交互式仪表板和地图来发现见解!

让我们开始抓取吧!

现在您已经得到了 – 一个经过实战检验的从 Zillow 抓取房地产数据的流程。 现在,您可以利用其丰富的列表,将您的业务提升到一个新的水平。

当您开始抓取时,如果您有任何其他问题,请随时与我们联系! 我总是很乐意帮助房地产专业人士更有效地使用数据。

一旦您开始每天提取数千个新鲜的 Zillow 列表,请告诉我!

标签:

加入谈话

您的电邮地址不会被公开。 必填带 *