Zillow房源HOA费用爬取异常求助:部分房源无法获取
Zillow房源爬取HOA费用不稳定问题的解决方案
问题根源分析
- 动态类名失效:你使用的CSS类名(如
Text-c11n-8-84-0__sc-aiai24-0)是Zillow自动生成的动态类名,平台更新代码后这类类名会随时变化,导致部分页面匹配失败。 - 会话不一致触发反爬:爬取房源详情页时每次新建
requests.session(),没有复用列表页的会话,Cookie不一致可能被反爬机制拦截,返回不完整页面。 - 动态内容未加载:部分房源的HOA数据是通过JavaScript动态加载的,
requests只能获取静态HTML,无法拿到异步加载的内容。 - 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
相关产品推荐
相关产品推荐

