影刀RPA 动态加载网页的稳定采集三策略

发布时间:2026/9/23 13:27:00

影刀RPA 动态加载网页的稳定采集三策略
影刀RPA 动态加载网页的稳定采集三策略作者林焱什么情况用这个打开一个网页数据是慢慢长出来的——先出骨架然后一条条数据刷出来有时候还要滚动才加载。你的【获取元素列表】在这一刻抓到了10条下一刻可能就是50条。到底什么时候才算加载完成什么时候开始采集最稳动态网页的采集难点不在抓数据在于判断时机。抓早了数据不全抓晚了浪费时间。这篇文章给你三种稳定采集策略覆盖Ajax、懒加载、虚拟滚动等所有动态加载场景。怎么做策略一等待数据稳定最常用核心思想连续两次检测到的数据量相同说明加载完毕。defwait_for_data_stable(driver,selector,stable_count2,max_wait30): 等待数据量稳定 stable_count: 连续N次数量不变才算稳定 last_count0stable_times0for_inrange(max_wait*2):elementsdriver.find_elements(By.CSS_SELECTOR,selector)current_countlen(elements)ifcurrent_countlast_countandcurrent_count0:stable_times1ifstable_timesstable_count:returnelementselse:stable_times0last_countcurrent_count time.sleep(0.5)returndriver.find_elements(By.CSS_SELECTOR,selector)# 超时了也返回策略二监听网络请求完成更精确的做法——等Ajax请求全部完成defwait_for_ajax_complete(driver,timeout15):等待所有Ajax请求完成jQuery/XMLHttpRequest# 注入Ajax监听driver.execute_script( window.__ajaxActive 0; var origXHR window.XMLHttpRequest.prototype; var origOpen origXHR.open; var origSend origXHR.send; origXHR.open function() { this._active true; return origOpen.apply(this, arguments); }; origXHR.send function() { window.__ajaxActive; this.addEventListener(loadend, function() { window.__ajaxActive--; }); return origSend.apply(this, arguments); }; )# 等待活跃请求数降到0for_inrange(timeout*10):activedriver.execute_script(return window.__ajaxActive || 0)ifactive0:time.sleep(0.3)# 确认一下activedriver.execute_script(return window.__ajaxActive || 0)ifactive0:returnTruetime.sleep(0.1)returnFalse策略三MutationObserver监听DOM变化最精确的方式——监听特定容器内的DOM变化defwait_for_dom_stable(driver,container_selector,idle_ms500,timeout15): 监听DOM变化连续idle_ms毫秒没有新变化才算稳定 driver.execute_script(f window.__domStable false; window.__domTimer null; var target document.querySelector({container_selector}); if (!target) return; var observer new MutationObserver(function() {{ window.__domStable false; clearTimeout(window.__domTimer); window.__domTimer setTimeout(function() {{ window.__domStable true; }},{idle_ms}); }}); observer.observe(target, {{ childList: true, subtree: true }}); // 初始设置定时器 window.__domTimer setTimeout(function() {{ window.__domStable true; }},{idle_ms}); )# 等待稳定标志for_inrange(timeout*10):stabledriver.execute_script(return window.__domStable)ifstable:returnTruetime.sleep(0.1)returnFalse有什么坑坑一数据一直在变永远不会稳定现象实时更新的数据看板数据一直在刷新永远等不到稳定。解决设定最大等待时间超时就按当前数据采集。或者用采集前N条策略不等全部加载。坑二虚拟滚动的数据看到才存在现象DOM里只有可见区域的20条数据上面的已经移除、下面的还没生成。解决边滚动边采集——滚一段、等加载、采集、记录位置、继续滚。坑三等待了Ajax但数据是WebSocket推的现象Ajax监听显示完成了但数据还在通过WebSocket进来。解决这种情况下只能用策略一等数据量稳定或策略三DOM变化监听。总结三种策略的适用场景——绝大多数情况用策略一等数据量稳定Ajax频繁的页面用策略二等网络请求完成实时更新的看板用策略三DOM监听。

相关新闻

如何利用etmem与cslide引擎实现内存垂直扩展?终极AEP高性能存储解决方案

如何利用etmem与cslide引擎实现内存垂直扩展?终极AEP高性能存储解决方案

2026/8/23 0:29:13

如何利用etmem与cslide引擎实现内存垂直扩展?终极AEP高性能存储解决方案 【免费下载链接】etmem the memory vertical expansion technology that can achieve the purpose of memory capacity expansion and memory cost reduction. 项目地址: https://gitcode.c…

影刀RPA 函数参数详解:位置参数、关键字参数、默认值

影刀RPA 函数参数详解:位置参数、关键字参数、默认值

2026/8/23 0:29:14

影刀RPA 函数参数详解:位置参数、关键字参数、默认值作者:林焱什么情况用 你在影刀RPA的Python代码块里写函数,发现参数传得越来越乱——有的按顺序传、有的按名字传、有的有默认值有的没有。调用的时候参数太多,记不住哪个是哪个…

Kimi    LeetCode 3544. 子树反转和 C语言实现

Kimi LeetCode 3544. 子树反转和 C语言实现

2026/9/8 13:35:03

以下是 LeetCode 3544. 子树反转和 的 C 语言实现。解题思路本题使用树形 DP 记忆化搜索。状态定义:dp(u, steps, inv) - u:当前节点 - steps:距离最近的一次祖先反转已经经过了多少步(上限为 k)。当 steps k 时&…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/21 18:38:46

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/21 18:41:09

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/21 18:36:40

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/21 18:37:26

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/21 18:40:29

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/21 18:36:17

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/22 0:19:28

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/21 23:38:13

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/22 0:48:53

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…