scrolldown仅控制滚动次数,不保证内容加载;必须配合sleep(≥2.5)和wait(≥1.0),并结合Network面板分析加载机制,或用script主动触发IntersectionObserver。

render() 方法能做这件事,但默认参数几乎总是不够用,容易拿到空数据或卡死。
render() 的 scrolldown 参数为什么经常失效
很多人设了 scrolldown=5 就以为能滚 5 次,结果返回的 HTML 还是初始那几条。根本原因是:滚动次数 ≠ 内容加载次数。有些页面每滚一次只加载 1 条,有些要滚到特定元素才触发,还有些靠 IntersectionObserver,滚动本身不触发加载。
实操建议:
立即学习“前端免费学习笔记(深入)”;
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
-
scrolldown只控制 Pyppeteer 执行window.scrollBy(0, document.body.scrollHeight)的次数,不保证每次都有新内容 - 必须配合
sleep(建议 ≥ 2.5)和wait(建议 ≥ 1.0),否则 JS 还没执行完就取 DOM - 优先观察浏览器开发者工具 Network 面板,看实际加载的是 XHR 还是动态插入的
div,再决定是否需要额外script注入 - 若页面用
IntersectionObserver,单纯滚动可能无效,得用script主动触发监听器刷新
如何判断滚动后内容是否真的加载完成
不能只看 len(r.html.find('div.item')) 是否变多——很多页面会先渲染占位符(比如带 loading class 的 div),或者把旧内容和新内容混在一起。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 用
r.html.search('共{}条')或r.html.xpath('//span[contains(text(), "共")]', first=True)抓总数,比数 DOM 更可靠 - 检查关键内容节点是否存在真实文本,例如
r.html.find('h3.title', first=True) and r.html.find('h3.title', first=True).text.strip() - 加超时保护:用
try/except TimeoutError包裹render(),避免 Pyppeteer 卡死 - 对分页型无限滚动,记录上一次最后一条的
data-id,下次滚动后检查是否出现新data-id
requests-html 在无头 Chrome 环境下的常见崩溃点
Pyppeteer 启动失败、内存爆满、渲染空白页——这些问题在 CI 环境或低配服务器上高频出现,不是代码写错了,而是环境没对齐。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 启动时显式传参:
session = HTMLSession(browser_args=['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage']) - Linux 服务器务必安装字体库:
apt-get install -y fonts-liberation,否则某些 CSS 渲染异常会导致 JS 报错退出 - 避免复用 session:每次抓取新建
HTMLSession(),用完调session.close(),否则 Pyppeteer 实例堆积 - 不用
arender()做批量任务——异步并发会抢同一个浏览器实例,直接挂掉;改用concurrent.futures.ThreadPoolExecutor控制并发数 ≤ 2
替代方案:什么情况下该放弃 requests-html
当页面依赖 Service Worker 缓存、WebAssembly 初始化、或登录态强绑定 localStorage 时,render() 往往拿不到真实数据。这不是参数问题,是架构限制。
实操建议:
立即学习“前端免费学习笔记(深入)”;
- 先用
curl -s URL | grep -o 'window\.'看是否有关键 JS 全局变量,如果有,用script参数直接读取:r.render(script='return window.__INITIAL_DATA__') - 登录态类页面(如微博、小红书),优先考虑
playwright+storage_state复用 cookie,requests-html 不支持持久化上下文 - 对性能敏感场景(如每秒抓 10+ 页面),WebView2(C#)或 Puppeteer(Node.js)更稳,requests-html 的 Python-GIL 和 Pyppeteer 启动开销太大
- 如果目标站明确反爬滚动行为(比如检测
scrollY变化速率),requests-html 无法模拟人类滚动节奏,得换 Puppeteer 的page.mouse.wheel()手动操作


















