You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的Python爬虫无法抓取Zillow第一页全部房源价格?

解决方案:抓取Zillow第一页全部房源价格

问题分析

你遇到的问题确实是页面懒加载/分批加载导致的——Zillow不会在初始请求中返回第一页的所有房源数据,后续房源是通过滚动页面触发AJAX请求加载的。用requests直接获取静态HTML只能拿到初始加载的前9条,无法捕获动态加载的内容。

解决思路

处理动态加载内容有两种可行方案:

  • 方案1:模拟浏览器动态渲染页面(推荐)
    使用selenium模拟浏览器行为,触发滚动加载,直到第一页所有房源加载完成后再解析页面。
  • 方案2:直接调用Zillow的数据接口
    分析页面的AJAX请求,找到房源数据接口,直接请求接口获取完整JSON数据。这种方式效率更高,但接口可能存在签名或参数验证,需要抓包分析参数规则。

代码实现(方案1:Selenium模拟浏览器)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
from bs4 import BeautifulSoup

URL = "https://www.zillow.com/san-francisco-ca/?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22usersSearchTerm%22%3A%22San%20Francisco%2C%22CA%22%2C%22mapBounds%22%3A%7B%22west%22%3A-122.52499667529297%2C%22east%22%3A-122.34166232470703%2C%22south%22%3A37.662044543503555%2C%22north%22%3A37.88836615784793%7D%2C%22regionSelection%22%3A%5B%7B%22regionId%22%3A20330%2C%22regionType%22%3A6%7D%5D%2C%22isMapVisible%22%3Atrue%2C%22filterState%22%3A%7B%22sort%22%3A%7B%22value%22%3A%22days%22%7D%2C%22ah%22%3A%7B%22value%22%3Atrue%7D%7D%2C%22isListVisible%22%3Atrue%2C%22mapZoom%22%3A12%7D"

# 初始化Chrome浏览器(需下载对应版本的chromedriver)
driver = webdriver.Chrome()
driver.get(URL)

# 模拟滚动加载,直到页面不再新增内容
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
    # 滚动到页面底部
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    # 等待加载完成(可根据网络情况调整时长)
    time.sleep(2)
    # 对比页面高度,判断是否加载完成
    new_height = driver.execute_script("return document.body.scrollHeight")
    if new_height == last_height:
        break
    last_height = new_height

# 等待所有价格元素加载完毕
WebDriverWait(driver, 10).until(
    EC.presence_of_all_elements_located((By.CLASS_NAME, "PropertyCardWrapper__StyledPriceLine-srp__sc-16e8gqd-1"))
)

# 解析页面源码提取价格
web_page = driver.page_source
soup = BeautifulSoup(web_page, 'html.parser')

prices_dirty = soup.find_all("span", class_="PropertyCardWrapper__StyledPriceLine-srp__sc-16e8gqd-1 iMKTKr")
prices_list_clean = [price.getText().split()[0] for price in prices_dirty if price.getText().startswith('$')]
print(prices_list_clean)

# 关闭浏览器
driver.quit()

注意事项

  • 使用Selenium需下载对应浏览器的驱动(如Chrome的chromedriver),确保驱动版本与浏览器版本一致。
  • Zillow有反爬机制,频繁请求可能被封IP,建议添加请求间隔或使用代理IP。
  • 可根据网络状况调整time.sleep(2)的时长,保证内容完全加载。

备选方案说明(方案2)

打开浏览器开发者工具的网络面板,筛选XHR/Fetch请求,找到带有search或results关键词的房源数据接口。分析请求参数(如searchQueryState、验证签名等)后,用requests直接发送请求获取JSON数据,从中提取价格即可。这种方式效率更高,但接口参数规则可能随网站更新变化,需要定期验证。

内容的提问来源于stack exchange,提问作者SolidOpt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 07:27:45