UiPath RPA自定义网页数据抓取:动态分页提取及缺页异常处理方案
UiPath 图书网站数据爬取(第5-7页动态提取+容错)实现方案
前置变量配置
先在流程的变量面板新建以下变量,避免流程硬编码:
totalPages:Int32类型,默认值0,存储当前搜索关键词对应的实际总结果页数scrapedResult:DataTable类型,存储最终提取到的图书数据currentPageNum:Int32类型,循环遍历页码时的计数变量listLoadSelector:String类型,存储图书列表区域的固定选择器,用来判断页面是否加载完成
步骤1:优先获取搜索结果总页数
不要上来就直接翻页爬取,先在搜索结果第一页完成总页数读取,从根源上避免越界:
- 先用
Element Exists活动检测分页栏是否存在,如果不存在直接抛出提示:当前搜索关键词无匹配结果,流程终止 - 读取总页数优先选稳定性高的方式,不要硬抓页面上显示的页码数字(很多网站分页会显示省略号,比如
1 2 ... 6 7 下一页,直接抓数字会拿错最大值):- 优先找分页容器的内置属性,绝大多数网站分页组件会带
data-total、total-pages这类自定义属性,直接存了真实总页数,用Get Attribute活动取值后转成Int32赋值给totalPages即可 - 如果网站没有这类属性,再抓"尾页"按钮的跳转链接,从链接参数里解析总页数
- 优先找分页容器的内置属性,绝大多数网站分页组件会带
步骤2:起始页跳转与前置校验
拿到总页数后先做边界判断,再跳转到提取起始页:
- 如果
totalPages < 5,直接触发业务提示:当前搜索结果共+totalPages.ToString()+页,不足5页,无法提取指定区间数据,流程终止 - 总页数≥5的情况下,点击第5页的页码按钮跳转,之后用
Wait Element Exists活动监听listLoadSelector对应的图书列表元素加载完成,不要用固定时长的Delay,效率低还不稳定
步骤3:循环提取5-7页数据
循环逻辑不要硬编码执行3次,必须同时绑定页码上限和实际总页数两个判断条件:
- 给
currentPageNum赋初始值5 - 循环条件设置为:
currentPageNum <=7 AndAlso currentPageNum <= totalPages - 循环体内执行以下操作:
- 调用之前通过Data Scraping向导生成的提取活动,抓取当前页的图书数据,通过
Merge Data Table活动合并到scrapedResult中 - 判断当前页是否已经到循环边界:如果
currentPageNum =7或者currentPageNum = totalPages,直接跳出循环 - 未到边界的话,点击"下一页"按钮,等待图书列表加载完成后,
currentPageNum加1,进入下一轮循环
- 调用之前通过Data Scraping向导生成的提取活动,抓取当前页的图书数据,通过
注意:不要用固定选择器点击第6、第7页的页码按钮,网站到尾页后未显示的页码按钮会直接消失,固定选择器会报找不到元素的错误,逐页点"下一页"的稳定性高很多。有条件的话可以加个校验:翻页后抓当前页高亮的页码数字,和
currentPageNum做比对,不一致就重试1-2次翻页,避免网站卡顿导致跳页、错页。
步骤4:不足7页的异常/提示处理
循环结束后加一层判断:
- 如果
totalPages >=7,直接输出提取完成的结果即可 - 如果
totalPages <7,根据业务需求选处理逻辑:- 允许保留已提取数据的场景:用Warning级别的
Log Message加弹窗提示:提示:当前搜索结果实际共+totalPages.ToString()+页,不足7页,已完成第5页至第+totalPages.ToString()+页的全部可用数据提取 - 要求必须凑满3页数据才算成功的场景:用
Throw活动抛出业务异常,异常信息同上,触发全局异常捕获分支即可
- 允许保留已提取数据的场景:用Warning级别的
内容的提问来源于stack exchange,提问作者Affy
相关产品推荐
相关产品推荐

