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

Zillow房源HOA费用爬取异常求助:部分房源无法获取

Zillow房源爬取HOA费用不稳定问题的解决方案

问题根源分析

  1. 动态类名失效:你使用的CSS类名(如Text-c11n-8-84-0__sc-aiai24-0)是Zillow自动生成的动态类名,平台更新代码后这类类名会随时变化,导致部分页面匹配失败。
  2. 会话不一致触发反爬:爬取房源详情页时每次新建requests.session(),没有复用列表页的会话,Cookie不一致可能被反爬机制拦截,返回不完整页面。
  3. 动态内容未加载:部分房源的HOA数据是通过JavaScript动态加载的,requests只能获取静态HTML,无法拿到异步加载的内容。
  4. DOM结构差异:不同房源的HOA信息可能放在不同的DOM节点中,单一选择器无法覆盖所有情况。

具体修复方案

1. 替换动态CSS选择器,改用稳定定位方式

放弃依赖动态类名,通过文本内容或更上层的稳定节点定位HOA信息:

# 替换原HOA爬取的循环代码
count = 0
for listingInfo in listingInfoList:
    hoa_text = "Invalid HOA fee"
    # 查找包含"HOA"且带费用标识的文本元素
    hoa_elements = listingInfo.find_all(text=lambda text: text and "HOA" in text)
    if hoa_elements:
        for elem in hoa_elements:
            if "$" in elem or "/month" in elem or "/year" in elem:
                hoa_text = elem.strip()
                break
    # 备用:通过详情页事实模块定位
    fact_group = listingInfo.find(class_="ds-home-fact-group")
    if fact_group:
        for item in fact_group.find_all("li"):
            if "HOA" in item.text:
                hoa_text = item.text.strip()
                break
    hoaList.append([hoa_text])
    count += 1

2. 复用会话避免反爬拦截

爬取详情页时使用之前创建的会话,不要每次新建:

# 重构会话使用逻辑,统一复用一个session
with requests.session() as session:
    city = str(input("City To Search In: ")) + "/"
    page = 1
    end_page = 10
    urlList = []
    requestList = []

    # 爬取列表页
    while page <= end_page:
        url = f"https://www.zillow.com/homes/for_sale/{city}/{page}_p"
        urlList.append(url)
        page += 1

    for url in urlList:
        request = session.get(url, headers=headers)
        requestList.append(request)

    # 解析列表页数据(地址、价格、链接代码保持不变)
    # ...

    # 爬取详情页时复用同一个session
    requestList2 = []
    for link in linkList:
        request2 = session.get(link, headers=headers)
        # 检查请求状态,避免无效响应
        if request2.status_code != 200:
            print(f"请求失败,状态码:{request2.status_code},链接:{link}")
            requestList2.append(None)
            continue
        requestList2.append(request2)

3. 添加请求延迟,降低反爬风险

在请求之间添加随机延迟,避免请求频率过高:

import time

# 列表页请求添加延迟
for url in urlList:
    time.sleep(random.uniform(1, 3))  # 随机延迟1-3秒
    request = session.get(url, headers=headers)
    requestList.append(request)

# 详情页请求添加延迟
for link in linkList:
    time.sleep(random.uniform(2, 4))
    request2 = session.get(link, headers=headers)
    requestList2.append(request2)

4. 处理动态内容(进阶方案)

如果静态HTML确实无法获取HOA数据,改用支持JS渲染的工具,比如requests-html:

from requests_html import HTMLSession

session = HTMLSession()
# 爬取详情页时启用JS渲染
response = session.get(link, headers=headers)
response.html.render()  # 渲染JS动态加载的内容
listingInfo = soup(response.html.html, "html.parser")

额外注意事项

  • 检查Zillow的robots.txt,确保爬取行为符合平台规则,避免账号被封。
  • 部分房源本身没有HOA费用,此时返回"无HOA费用"更准确,不要默认填充"$0 annually HOA fee"。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:53:09