Python Selenium无限滚动页面失效问题求助
Selenium无限滚动失效问题定位与修复
现有代码的核心问题
- 滚动目标容器匹配错误:JustWatch该影片列表页的无限滚动逻辑绑定在页面内部的影片列表专属容器上,并非全局
document.body。直接读取body的滚动高度、对window执行滚动操作,实际没有触达承载内容的滚动区域,第一次执行滚动后body高度不会发生任何变化。如果原代码补全了“高度相等就跳出循环”的判断逻辑,就会直接退出滚动函数,根本不会触发后续的列表懒加载,紧接着就执行driver.quit()操作,对应了“全程无滚动、直接退出driver”的现象。 - 循环逻辑书写残缺:原
scroll函数内的while循环没有写全终止判断逻辑——计算完新的页面高度后,既没有和上一次记录的高度值做对比,也没有更新存储的历史高度,更没有设置跳出循环的判定条件,滚动逻辑本质只完成了一半。 - 固定等待策略容错性差:单纯靠固定
sleep等待内容加载,碰到网络波动的场景很容易在新内容未完全加载时就误判页面高度不再变化,提前终止滚动流程。
修复后可正常运行的实现代码
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time def scroll(driver): # 定位实际承载无限滚动的影片列表容器 scroll_container = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CSS_SELECTOR, ".title-list")) ) last_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) while True: # 对目标容器执行滚动到底部操作 driver.execute_script("arguments[0].scrollTo(0, arguments[0].scrollHeight);", scroll_container) # 等待容器内新内容完成加载 time.sleep(2) # 计算滚动完成后的容器最新高度 new_height = driver.execute_script("return arguments[0].scrollHeight", scroll_container) # 连续两次滚动后高度无变化时,判定已加载完全部内容,跳出循环 if new_height == last_height: break last_height = new_height driver.get("https://www.justwatch.com/uk/provider/bfi-player/movies") # 等待首屏影片列表加载完成后再启动滚动流程 WebDriverWait(driver, 15).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".title-list"))) scroll(driver) # 此处可衔接后续所有影片卡片的点击逻辑 driver.quit()
关键改动说明
- 调整滚动操作的作用目标,不再操作全局window和body,直接定位承载影片列表的滚动容器执行动作,从根源解决滚动不触发的问题
- 补全高度对比的判定逻辑,避免无意义死循环的同时,保证所有懒加载内容都被触发展示
- 增加首屏元素的显式等待,避免页面未加载完成就执行滚动操作导致的元素定位失败
内容的提问来源于stack exchange,提问作者Eddyhut
相关产品推荐
相关产品推荐

