selenium 提取无限加载页面需分段滚动并配合显式等待新元素出现,避免硬编码延时;优先复用站点api接口;playwright在稳定性、网络等待和请求拦截上更优,但selenium配合理策略已够用。

用 Selenium 模拟滚动到底部再提取数据
无限加载的页面通常靠 JavaScript 监听滚动事件,触发 AJAX 请求追加内容。直接用 requests 获取初始 HTML 是抓不到后续内容的,必须让浏览器执行 JS 并等待新 DOM 加载。Selenium 是最直接的选择,但关键不是“启动浏览器”,而是“滚动时机”和“等待条件”。
常见错误是调用 driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") 后立刻解析,此时新内容可能还没返回或渲染。必须配合显式等待,比如等某个新增的卡片元素出现,或等加载指示器消失。
- 用
WebDriverWait+presence_of_element_located等待新一批数据容器出现(例如 class="item" 的div) - 每次滚动后加
time.sleep(1)是下策——网络快时浪费,慢时仍失败;优先用expected_conditions - 滚动要“分段”:一次性滚到底可能跳过中间加载点,建议循环滚动并逐步增加
scrollTop值
滚动后如何判断是否到底或已加载完成?
没有通用的“到底”信号,得看目标网站实现逻辑。有些页面滚动到底会显示“没有更多了”,有些则静默停止请求,还有些会把加载中 spinner 变成文字提示。硬编码等固定秒数或固定滚动次数极易漏数据或死循环。
推荐组合判断:
- 记录滚动前的
len(driver.find_elements(By.CLASS_NAME, "item")),滚动后再查一次,无变化且无 loading 元素 → 可能结束 - 监听 Network 面板发现 XHR 返回空数组或 status=200 但 data=[] → 服务端明确无新数据
- 捕获
NoSuchElementException尝试找“暂无内容”文案元素,作为终止信号
注意:有些站点在滚动过程中会销毁旧节点重绘,导致之前存的 WebElement 失效,后续操作报 StaleElementReferenceException ——务必在每次滚动后重新 find 元素。
比 Selenium 更轻量的方案:直接复用网站的 API 接口
多数无限加载页面背后都有分页 API,只是被前端隐藏了。打开 Chrome DevTools → Network → 切到 XHR/Fetch,手动滚动几次,观察哪些请求返回了新数据。这类接口通常带 offset、limit、page 或时间戳参数,返回 JSON,比解析 HTML 快得多也稳定得多。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
实操要点:
- 复制请求的
curl命令,用curl2requests工具转成 Python 代码,注意保留Cookie和User-Agent - 检查请求头是否有
X-Requested-With: XMLHttpRequest,缺失可能导致 403 - 部分接口需计算签名(如 timestamp + salt + md5),这时退回到 Selenium 提取原始请求更省事
如果接口有反爬(如 token 过期、频率限制),反而比 Selenium 更难绕过——因为没浏览器环境,缺少 referer、js 执行痕迹等自然信号。
用 Playwright 替代 Selenium 的真实收益在哪?
Playwright 对动态加载场景的优势不是“更快”,而是“更稳”。它原生支持等待网络空闲(page.wait_for_load_state("networkidle"))、自动处理 iframe 切换、内置请求拦截(可捕获所有 fetch/XHR),且默认启用无头 Chromium 的真实 UA 和 WebGL 支持,绕过部分前端检测。
典型用法:
- 用
page.evaluate()执行滚动并返回当前滚动高度,比 Selenium 的execute_script更少出错 - 用
page.route()拦截并保存所有数据接口响应,避免重复解析 DOM - 遇到需要登录态的页面,Playwright 的
storage_state保存 cookies+localStorage,比 Selenium 的 pickle 更可靠
但 Playwright 学习成本略高,如果你只抓一两个站,Selenium + 正确的等待策略已经够用;如果长期维护多个动态站,值得切过去。
真正容易被忽略的是:无限加载页面往往对滚动行为做埋点监控,频繁自动化滚动可能触发风控(比如 5 秒内滚动 20 次),加随机延迟和模拟鼠标移动路径比单纯优化性能更重要。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










