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

Python爬取Zillow卧室数、面积及价格无返回,求排查class选择器问题

Zillow爬虫无结果问题:原因分析与解决

问题背景

向ChatGPT请求生成“用Python模拟火狐请求头爬取Zillow的卧室数、面积和价格”的代码,得到代码后运行无任何结果返回,推测问题出在soup.find_all方法或class_选择器的使用上。

原代码的核心问题

  1. 反爬拦截:Zillow会检测请求头,直接用requests.get发送请求会被识别为爬虫,返回的HTML中没有房源数据,导致后续查找元素为空。
  2. 选择器失效:原代码使用的property-card-data、list-card-details等class名称已不符合当前Zillow页面的DOM结构,find_all找不到对应元素,自然没有输出。
  3. 无异常处理:直接通过索引[1]获取平方英尺数据,若房源缺少该字段会直接报错,且没有判断元素是否存在的逻辑。

find_all与class_选择器工作原理

  • soup.find_all():在HTML文档中查找所有符合指定标签、属性等条件的元素,返回一个列表。如果没有匹配到任何元素,返回空列表,后续循环不会执行。
  • class_参数:由于class是Python的关键字,BeautifulSoup用class_来指定元素的CSS类名。必须完全匹配目标元素的class(若元素有多个class,需指定完整的类名或用CSS选择器语法),否则无法找到对应元素。

修复后的代码

import requests
from bs4 import BeautifulSoup

# 模拟火狐浏览器请求头,避免被反爬
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/117.0",
    "Accept-Language": "en-US,en;q=0.5"
}

url = "https://www.zillow.com/breckenridge-co/sold/?searchQueryState=%7B%22pagination%22%3A%7B%7D%2C%22usersSearchTerm%22%3A%22Breckenridge%2C%20CO%22%2C%22mapBounds%22%3A%7B%22west%22%3A-106.12936606713866%2C%22east%22%3A-105.9443151027832%2C%22south%22%3A39.45416110834031%2C%22north%22%3A39.497489978187815%7D%2C%22regionSelection%22%3A%5B%7B%22regionId%22%3A14934%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%22fsba%22%3A%7B%22value%22%3Afalse%7D%2C%22fsbo%22%3A%7B%22value%22%3Afalse%7D%2C%22nc%22%3A%7B%22value%22%3Afalse%7D%2C%22fore%22%3A%7B%22value%22%3Afalse%7D%2C%22cmsn%22%3A%7B%22value%22%3Afalse%7D%2C%22auc%22%3A%7B%22value%22%3Afalse%7D%2C%22rs%22%3A%7B%22value%22%3Atrue%7D%2C%22ah%22%3A%7B%22value%22%3Atrue%7D%7D%2C%22isListVisible%22%3Atrue%2C%22mapZoom%22%3A13%7D"

# 发送带请求头的GET请求
response = requests.get(url, headers=headers)
response.raise_for_status()  # 检查请求是否成功

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

# 更新选择器为当前Zillow页面的房源卡片class
results = soup.find_all("div", class_="ListItem-c11n-8-84-3__sc-10e22w8-0")

for result in results:
    # 提取价格
    price_elem = result.find("span", class_="Text-c11n-8-84-3__sc-aiai24-0")
    price = price_elem.text.strip() if price_elem else "N/A"

    # 提取卧室数、面积等详情
    details_list = result.find_all("span", class_="Text-c11n-8-84-3__sc-aiai24-0 hdp__sc-1mk4l8b-0")
    bedrooms = "N/A"
    square_footage = "N/A"
    for detail in details_list:
        text = detail.text.strip()
        if "bd" in text:
            bedrooms = text
        elif "sqft" in text:
            square_footage = text

    print("Bedrooms:", bedrooms)
    print("Square Footage:", square_footage)
    print("Price:", price)
    print()

修复说明

  1. 添加请求头:模拟火狐浏览器的User-Agent和Accept-Language,绕过Zillow的基础反爬检测,确保返回包含房源数据的页面。
  2. 更新选择器:通过查看Zillow页面的HTML结构,替换为当前有效的class名称(注意:Zillow的class可能会随时更新,若再次失效需重新查看页面DOM)。
  3. 异常处理:对每个元素的查找结果进行判断,避免因元素不存在导致报错;通过文本关键词匹配提取卧室数和面积,比索引更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:23:17