news 2026/7/13 0:45:10

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
影刀RPA 动态加载网页的稳定采集三策略

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

作者:林焱

什么情况用这个

打开一个网页,数据是慢慢"长"出来的——先出骨架,然后一条条数据刷出来,有时候还要滚动才加载。你的【获取元素列表】在这一刻抓到了10条,下一刻可能就是50条。到底什么时候才算"加载完成"?什么时候开始采集最稳?

动态网页的采集,难点不在抓数据,在于判断时机。抓早了数据不全,抓晚了浪费时间。这篇文章给你三种稳定采集策略,覆盖Ajax、懒加载、虚拟滚动等所有动态加载场景。

怎么做

策略一:等待数据稳定(最常用)

核心思想:连续两次检测到的数据量相同,说明加载完毕。

defwait_for_data_stable(driver,selector,stable_count=2,max_wait=30):""" 等待数据量稳定 stable_count: 连续N次数量不变才算稳定 """last_count=0stable_times=0for_inrange(max_wait*2):elements=driver.find_elements(By.CSS_SELECTOR,selector)current_count=len(elements)ifcurrent_count==last_countandcurrent_count>0:stable_times+=1ifstable_times>=stable_count:returnelementselse:stable_times=0last_count=current_count time.sleep(0.5)returndriver.find_elements(By.CSS_SELECTOR,selector)# 超时了也返回

策略二:监听网络请求完成

更精确的做法——等Ajax请求全部完成:

defwait_for_ajax_complete(driver,timeout=15):"""等待所有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):active=driver.execute_script("return window.__ajaxActive || 0")ifactive==0:time.sleep(0.3)# 确认一下active=driver.execute_script("return window.__ajaxActive || 0")ifactive==0:returnTruetime.sleep(0.1)returnFalse

策略三:MutationObserver监听DOM变化

最精确的方式——监听特定容器内的DOM变化:

defwait_for_dom_stable(driver,container_selector,idle_ms=500,timeout=15):""" 监听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):stable=driver.execute_script("return window.__domStable")ifstable:returnTruetime.sleep(0.1)returnFalse

有什么坑

坑一:数据一直在变永远不会稳定

现象:实时更新的数据看板,数据一直在刷新,永远等不到"稳定"。

解决:设定最大等待时间,超时就按当前数据采集。或者用"采集前N条"策略,不等全部加载。

坑二:虚拟滚动的数据"看到才存在"

现象:DOM里只有可见区域的20条数据,上面的已经移除、下面的还没生成。

解决:边滚动边采集——滚一段、等加载、采集、记录位置、继续滚。

坑三:等待了Ajax但数据是WebSocket推的

现象:Ajax监听显示完成了,但数据还在通过WebSocket进来。

解决:这种情况下只能用策略一(等数据量稳定)或策略三(DOM变化监听)。


总结:三种策略的适用场景——绝大多数情况用策略一(等数据量稳定),Ajax频繁的页面用策略二(等网络请求完成),实时更新的看板用策略三(DOM监听)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/13 0:08:53

61-LangChain-vs-LlamaIndex-选型对比-功能矩阵-混用实践

文章目录【61.PythonAI】LangChain vs LlamaIndex:两大LLM框架功能矩阵与混用最佳实践导入语1 ~> 一张图看懂两个框架的定位1.1 核心差异:全栈编排 vs 数据专家1.2 功能覆盖矩阵1.3 选型速查2 ~> 数据处理管道:IngestionPipeline vs Do…

作者头像 李华
网站建设 2026/7/13 0:08:32

Windows系统文件BitsProxy.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/7/13 0:08:27

Windows系统文件biwinrt.dll丢失找不到问题解决

在使用电脑系统时经常会出现丢失找不到某些文件的情况,由于很多常用软件都是采用 Microsoft Visual Studio 编写的,所以这类软件的运行需要依赖微软Visual C运行库,比如像 QQ、迅雷、Adobe 软件等等,如果没有安装VC运行库或者安装…

作者头像 李华
网站建设 2026/7/13 0:00:55

Multi-Token Prediction (MTP) 多 Token 预测技术深度解析:从训练信号增强到推理加速的全链路剖析

Multi-Token Prediction (MTP) 多 Token 预测技术深度解析:从训练信号增强到推理加速的全链路剖析 核心痛点:大语言模型自回归解码逐 Token 生成导致推理延迟高,单 Token 预测训练信号稀疏致使模型规划能力不足 适配人群:大模型训练与推理工程师、AI 基础设施开发者、推理框…

作者头像 李华
网站建设 2026/7/12 23:59:35

2026商城小程序开发公司排名:适合深圳地区3C数码企业的服务商哪家好?含零代码SAAS、AI编程、源码定制交付

一、汇总表工具更适合谁价格开发方式核心特点餐宝盈适合所有行业的商家,尤其是拥有自己实体门店的商家,如餐饮、茶饮、烘焙、便利店、生鲜、社区零售门店、教培门店,尤其适合先把点单、预约、会员、发券和复购做起来的老板。99/年模板SAAS先下…

作者头像 李华