Selenium用css selector查找元素未返回全部列表项,Zillow房源爬取不全如何解决
问题原因
Zillow搜索结果页采用懒加载机制,仅当房源滚动到可视区域时才会渲染对应DOM元素,首次打开页面只会加载首屏约9-10条房源,剩余房源需要滚动页面触发加载,同时超过一定数量的房源会拆分到多页展示,所以直接获取元素只能拿到首屏数据。
解决方法
- 先处理当前页懒加载
模拟用户滚动页面到最底部,等待新房源渲染完成后重复操作,直到连续两次滚动后房源数量不再变化,说明当前页所有房源已加载完成,参考代码如下:import time import random # 搜索跳转至结果页后执行以下逻辑 last_count = 0 while True: # 滚动到页面底部 driver.execute_script("window.scrollTo(0, document.body.scrollHeight)") # 随机等待2-4秒,避免触发反爬,同时留足加载时间 time.sleep(random.uniform(2, 4)) current_list = driver.find_elements_by_css_selector("#grid-search-results li .list-card-info a") current_count = len(current_list) # 数量无变化代表当前页加载完成 if current_count == last_count: break last_count = current_count # 此时current_list就是当前页全部房源链接 print(len(current_list)) for link in current_list: print(link.get_attribute('href')) - 处理多页数据
当前页数据采集完成后,定位页面底部的下一页按钮,判断按钮是否可点击,可点击的话模拟点击跳转下一页,重复上述滚动采集逻辑,直到下一页按钮置灰不可点击为止,就能拿到所有分页的全量房源。 - 更高效的替代方案
可以直接抓取Zillow的后端搜索接口:打开浏览器F12开发者工具切换到网络面板,筛选XHR请求,执行搜索后找到返回房源JSON数据的接口,直接构造请求参数调用接口拿数据,不需要处理前端懒加载、分页逻辑,采集效率更高。
注意事项
Zillow有严格的反爬机制,操作频率不要过高,可配合undetected-chromedriver替换原生Selenium驱动,降低被识别为爬虫的概率,避免弹出人机验证导致采集中断。
内容的提问来源于stack exchange,提问作者ambu360
相关产品推荐
相关产品推荐

