作为每月访问量超过 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 列表,请告诉我!