Python BS4开发的Zillow爬虫每页仅返回前9条结果,是什么原因?
Zillow房源爬虫单页仅返回9条数据的问题排查与修复
核心原因
- 前端动态渲染限制:Zillow的房源列表默认仅在初始HTML中静态渲染前9条房源,剩余31条需要用户滚动页面时通过AJAX异步加载,你直接用
requests请求初始页面只能拿到静态渲染的9条数据,异步加载的内容不会出现在初始返回的HTML中。 - 定位规则兼容性差:你写死了完整的
photo-cards photo-cards_wow photo-cards_short photo-cards_extra-attribution类名作为列表容器的定位条件,Zillow会频繁更新前端样式类名,只要任意一个类名发生变更,你就可能拿到不完整的列表节点,甚至定位失败。 - 参数编码错误:你在
searchQueryState参数中使用了HTML实体"代替双引号,requests传参时会自动对参数做URL编码,导致"被二次转义,Zillow后端无法正常识别你的查询参数,也可能导致返回的房源数量不足。
修复方案
方案1(推荐):直接抓取后端接口
Zillow的房源数据本质是通过后端接口返回的,无需解析HTML,直接抓接口即可拿到全量结构化数据:
- 打开浏览器F12开发者工具,切换到「网络」面板,筛选
Fetch/XHR请求,找到路径包含GetSearchPageState.htm的请求 - 模拟该请求的 headers 和参数直接发送请求,返回的JSON数据中包含单页全部40条房源信息,解析效率和准确率远高于HTML解析
方案2:适配动态渲染场景
如果坚持爬取HTML页面,改用无头浏览器工具模拟用户操作:
- 使用
Selenium或Playwright加载页面,模拟向下滚动操作,等待所有房源卡片渲染完成后再提取内容 - 优化列表容器定位规则,改为模糊匹配类名:
content.find('ul', class_=lambda c: c and 'photo-cards' in c),避免因为类名更新导致定位失败
其他代码优化点
- 修正参数编码:将
searchQueryState中的"全部替换为双引号,直接构造Python字典再序列化为JSON字符串作为参数值,避免转义错误 - 调整CSV写入逻辑:将
to_csv()调用移到分页循环外部,爬完所有页面后再一次性写入文件,减少不必要的IO操作
内容的提问来源于stack exchange,提问作者FormidableData
相关产品推荐
相关产品推荐

