核心是模拟真实用户滚动并精准判断加载完成:先执行滚动脚本,再结合显式等待、滚动高度变化、元素数量对比及最大重试次数等多信号验证,避免死循环和漏数据。

用 selenium 滚动到页面底部触发懒加载
网页自动滚动加载的核心是模拟真实用户行为,让 JavaScript 懒加载逻辑执行。直接用 requests 获取初始 HTML 是没用的,因为后续内容由 JS 动态插入。必须用浏览器自动化工具,selenium 是最稳妥的选择。
关键不是“滚动”本身,而是滚动后等待新内容出现——否则脚本会误判加载完成。
- 用
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")滚到底部 - 滚动后必须加显式等待:
WebDriverWait(driver, 5).until(EC.presence_of_element_located((By.CSS_SELECTOR, "新的列表项选择器"))),不能只靠time.sleep() - 如果页面用无限滚动(无分页),需循环滚动 + 判断是否到底:比较滚动前后的
document.body.scrollHeight值是否变化
避免重复滚动和死循环的判断逻辑
很多网站滚动到底后不新增内容,但脚本若不识别这点就会无限重试。常见错误是只检查“有没有新元素”,却忽略“是否真的加载了”。
- 每次滚动前记录当前
len(driver.find_elements(By.CSS_SELECTOR, ".item")),滚动后再查一次,差值为 0 就说明到底了 - 设置最大重试次数(比如 10 次),防止网络卡顿或页面异常导致无限等待
- 有些页面懒加载依赖可视区域,可改用
element.location_once_scrolled_into_view滚动到最后一个已知元素,比滚到底更可靠
ChromeOptions 启动参数影响滚动稳定性
无头模式(--headless=new)下部分网站会禁用懒加载或返回空数据,这不是代码问题,而是网站检测到非交互式环境。
- 开发阶段务必先去掉
--headless,肉眼确认滚动和加载是否正常 - 必须加
--disable-blink-features=AutomationControlled和driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {...})隐藏 selenium 特征,否则某些网站会拦截滚动行为 - 滚动操作在低分辨率窗口下可能失效,建议设置窗口大小:
options.add_argument("--window-size=1920,1080")
替代方案:playwright 更轻量但兼容性略弱
如果项目允许引入新依赖,playwright 的滚动 API 更简洁,且对现代前端框架(如 React/Vue 的虚拟滚动)支持更好。
-
page.evaluate("window.scrollTo(0, document.body.scrollHeight)")后,用page.wait_for_selector(".item:last-child", state="attached")等待新节点挂载 - 它默认绕过大部分反自动化检测,无需手动 patch navigator 属性
- 但老系统(如 IE 兼容模式页面)或重度依赖 jQuery 的站点,
selenium仍更稳
滚动加载真正难的不是“怎么滚”,而是“怎么确认滚完了”——DOM 节点数量、网络请求完成状态、滚动高度变化,这三个信号要组合判断,单靠一个很容易漏数据或卡住。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











