Python Selenium实现无限滚动时while循环内jobCards值不更新怎么办
问题原因
- 滚动触发位置不符合加载规则:你调用
scrollIntoView时使用的block: 'center'参数会把最后一张卡片滚动到视口中间,绝大多数无限滚动页面的加载触发逻辑是监听「滚动到页面底部/距离底部一定阈值」的位置才会发起新数据请求,中间位置无法触发加载,所以只会更新一次甚至完全不更新。 - 滚动动画未预留执行时间:
behavior: 'smooth'是平滑滚动效果,本身需要几百毫秒的执行时间,滚动到指定位置后页面才会触发加载逻辑,原有等待逻辑没有覆盖这个时间差的话,很可能拿到的还是滚动前的DOM数据。 - 元素缓存问题:如果循环外提前获取过
jobCards,部分场景下Selenium会复用旧的DOM查询缓存,没有重新拉取最新的DOM节点。
修复方案
修改后代码如下:
def totalJobs(self): # 每次调用强制查询最新DOM,避免缓存 jobCards = self.find_elements_by_css_selector( 'div[class^="job-cardstyle__JobCardHeader"]') return jobCards last_job_count = 0 while True: # 先获取当前最新的卡片列表 jobCards = self.totalJobs() current_job_count = len(jobCards) print("Total Jobs - " + str(current_job_count)) # 连续两次查询卡片数量一致,说明已经加载完全部内容,退出循环 if current_job_count == last_job_count: break last_job_count = current_job_count # 滚动到最后一张卡片的底部,对齐视口底部触发加载 self.execute_script( "arguments[0].scrollIntoView({behavior: 'smooth',block: 'end'});", jobCards[-1]) # 等待滚动完成+新内容渲染,可根据网站实际加载速度调整时长 time.sleep(3)
优化建议
可以把固定的time.sleep替换为Selenium显式等待,监听卡片数量变化,比硬等待效率更高,也能避免网络波动导致的等待时长不足问题。如果网站存在旧卡片回收销毁的机制,可以额外记录最后一张卡片的唯一属性(比如职位ID)判断是否有新内容加载,比单纯判断总长度更准确。
内容的提问来源于stack exchange,提问作者Idrs
相关产品推荐
相关产品推荐

