为何我的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
相关产品推荐
相关产品推荐

