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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:45:05