ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用影刀RPA实现成绩批量查询:从流程拆解到稳定运行

用影刀RPA实现成绩批量查询:从流程拆解到稳定运行 2024年1月期末考试成绩出来的第二天我被年级组长拉进了一个新任务把12个班的500多名学生成绩从教务系统里整理出来按班级排序发给各班主任。教务系统只有一个在线查询页面不支持批量导出输入一个学号点查询拖动滚动条看成绩再复制到Excel。重复500次。那天晚上我干了两个小时才弄完两个班眼睛已经花了。后来我花了一个下午用影刀RPA搭了一个成绩批量查询系统把整个流程扔给电脑跑500条数据大约50分钟跑完中间只需要处理两次登录失效。这篇就聊聊我是怎么拆需求、选组件、踩坑、优化最终把它变成一个稳定能用的自动化流程的。1. 这个查询系统要解决的是期末周最烦人的一件事1.1 一场原本要花一晚上的成绩整理先还原一下当时的场景。我们学校的教务系统有一个“成绩查询”页面页面结构很简单一个学号输入框、一个查询按钮下面是一块表格区域显示这个学生各科成绩和排名。功能上没问题但没有“批量查询”按钮也没有“导出Excel”功能。想拿到全年级成绩唯一的路子就是一遍遍输入学号、点击查询、选中成绩区域、CtrlC、切到Excel、CtrlV。我粗略算过一笔时间账。一个学生从输入学号到完成复制粘贴顺利的话需要35到40秒如果网络稍微卡一下或者光标没切对位置超过一分钟很正常。500个学生就是5个多小时。这还只是查询的时间后面还要按班级排序、核对缺考名单、检查异常分数。更麻烦的是这种纯机械重复的活儿人做久了会疲劳注意力稍微一散成绩就可能粘错行而且这种错很难发现等发到班主任手上出了问题责任就大了。这件事给我的第一个判断是这活儿不是不能干而是不该用人干。它具备自动化的所有特征——流程固定、操作重复、规则明确、量大且时间集中。我需要一个工具模拟我在浏览器上的操作把“输入学号—点查询—拿结果—填Excel”这四个动作循环执行500遍同时把异常情况记录下来。1.2 为什么不用写爬虫而是用RPA模拟人工操作有人可能会问这种场景为什么不直接用Python写个爬虫我的回答是如果这个教务系统有开放的API或者页面是纯静态的爬虫确实更高效。但现实情况是这类成绩查询系统往往没有公开接口数据都是通过异步请求加载的页面里可能还嵌着加密参数、动态Token、登录Cookie校验甚至偶尔蹦出来一个验证码。真要写爬虫你得先逆向JavaScript把请求参数逐项分析清楚还得处理Cookie失效、并发限制整个开发周期从半天变成三天而且学校系统一改版爬虫就废了。RPA的思路完全不同。影刀RPA这类工具从诞生起就是建立在“模拟人工操作”这个基础上的。它不管页面背后的接口怎么加密、参数怎么生成它就像一个人一样打开浏览器、点击输入框、敲键盘、点按钮、读屏幕上显示出来的文字。只要人工能完成查询RPA就能按同样的路径去完成。这样绕开了反爬、JS加密等一堆复杂问题开发成本和维护成本都低得多。当时我选择影刀RPA主要看中几点一是组件覆盖确实全Excel读写、网页自动化、鼠标键盘、OCR、数据表格都有不需要我在不同工具之间来回拼二是影刀的“捕获元素”和“等待元素出现”这类组件用起来比较顺手调试时可以一步步看运行日志三是它有可视化界面流程搭完以后还能生成清晰的流程图后续同事要维护也看得懂。当然这里必须说明一点RPA模拟的是人工操作所以合规边界和人工操作完全一致。这套系统只适用于你有权限访问的教务系统或成绩查询平台不能拿来做越权查询、批量抓取他人数据这类事情。2. 搭建前先把人工操作拆成机器能执行的步骤2.1 人工查询流程的逐项拆解与组件对应RPA流程设计里最简单也最容易忽略的一步是把你脑子里的操作步骤写到纸面上。很多人一上来就打开影刀开始拖组件结果做到一半发现漏了一个分支又推倒重来。我自己的习惯是先在纸上把人工操作拆到最细再做组件映射。以成绩查询为例人工操作可以拆成这样几步人工操作对应RPA组件说明打开浏览器进入查询系统登录打开网页、输入、点击登录状态最好提前处理好不要塞进主循环打开学号清单Excel打开Excel、读取单元格先读取全部学号到数组减少循环内Excel访问在查询页输入学号设置文本/输入输入前先清空输入框默认值点击查询按钮点击网页元素注意是否在iframe内以及是否被遮罩层遮挡等待结果加载等待元素出现等待结果区域元素出现而不是固定Sleep抓取成绩文本获取网页元素文本抓整块文本再用正则或字符串处理拆分把成绩写入Excel写入单元格用“当前循环索引首行偏移量”计算行号处理下一个学号循环用循环组件包住以上步骤遍历学号数组拆到这一步思路已经很清楚了整个系统本质上是一个“循环体”循环体内部完成一次查询循环外部处理Excel读写和异常记录。后面要做的就是往这个骨架里填肉。2.2 输入输出数据的格式约定决定成败的一半这个系统跑起来之前最好先和给数据的人确定好Excel模板长什么样。我这边当时拿到的学号清单是从学校系统导出的第一行是表头“学号”下面每行一个学号没有其他列。这个格式很干净但有一个隐患下面踩坑环节会细说。先讲输入数据的几个原则。第一学号列尽量设置成“文本”格式而不是常规或数值格式。很多学号看起来是数字实际是字符串比如“00123”这种带前导零的如果Excel把它当数值存进去就变成了“123”RPA读取以后查询结果必然出错。第二表头不要有合并单元格也不要有多余的空行空列否则读取范围会乱。第三数据量不大的时候建议用影刀RPA的“读取区域”组件一次性把学号读进数组变量不要每次循环都打开Excel去读单元格那样又慢又容易出问题。再说输出格式。我在流程启动的时候先往Excel写入表头学号、姓名、班级、语文、数学、英语、总分、班排名、年级排名。后面的列根据教务系统实际返回的字段再调整。这个预先设计表头的习惯很重要因为如果等查询结果出来再动态建表头流程会变得复杂而且容易在写入时串列。输出文件最好单独新建一个不要直接在原始学号清单上改避免把源数据弄坏。2.3 异常情况预判成绩系统里常见的幺蛾子RPA最怕的不是正常路径跑不通而是异常出现时流程直接崩掉。成绩查询系统里的异常种类其实很有限我在写流程之前列了一个清单第一个是“学号不存在”。教务系统里可能录入重复或者学生已转走页面会显示“未查询到该学生”之类的话。这时候不能干等着应该判断结果区域的文本如果包含“未查询到”就往Excel对应行写“查无此人”然后继续下一个。第二个是“成绩未发布”。有的班级成绩还没录入查询页面会显示空表格。这种情况和“查询失败”要区分开我当时的处理是把它标记成“无成绩数据”方便人工后续核对。第三个是“登录状态过期”。系统登录后一般有一个有效期跑了几百条数据后可能突然跳出登录页。如果流程不识别就会一直在登录页上输学号、点查询看起来好像在工作实际什么也没查到。所以必须在循环里加一个判断当前页面是否出现了登录框特征元素如果出现了就跳出循环触发“人工登录”的提示。第四个是“验证码突然出现”。有些系统平时不弹验证码但查询频率高了会弹。我的策略是不硬刚检测到验证码控件出现后流程暂停并弹窗提醒人工输入验证码后继续跑。看似打断了自动化但比写一个不完善的识别逻辑靠谱得多。第五个是“网络超时”。页面加载慢导致等待元素超时这个问题通过“等待元素出现”组件加超时重试来解决后面详细说。这些异常预判都提前设计好流程才敢挂机跑。3. 影刀RPA工作流搭建从读取Excel到写回结果3.1 整体流程设计循环组件作为骨架在影刀RPA里整个成绩批量查询系统的骨架非常清晰我按下面这个顺序组织流程启动Excel打开学号清单文件读取学号数组获取总行数。打开浏览器进入成绩查询页完成登录并确认登录状态。使用“循环”组件遍历学号数组。循环体内读取当前学号输入到输入框点击查询等待结果容器出现获取文本解析成绩。将解析结果写入Excel当前对应的行。循环结束后保存并关闭Excel输出运行日志。这里有个设计细节为什么要把“打开Excel读取学号”放在循环外面而不是每查一个人读一次因为Excel文件的读写是比较重的操作频繁打开关闭会拖慢整体速度而且容易造成文件锁冲突。一次性把500个学号读进数组循环内只做内存数据操作效率高很多。影刀RPA的数组变量在循环组件中可以通过“循环索引”访问这个索引从0开始而Excel数据从第2行开始第1行是表头所以写入时行号要按“索引2”计算。另外一个容易忽略的点是浏览器页签管理。我一开始的做法是循环里每次都“重新打开查询页面”结果每跑一条数据浏览器就多一个页签最后内存吃满流程越来越慢。后来改成一开始打开固定页面循环内只负责在当前页面的输入框里填值、点按钮不重复打开网页链接。这个改动让整体耗时几乎降了一半。3.2 循环体内部输入、点击、等待、抓取四步联动循环体是整个系统的核心每一个动作都有一点讲究。第一步是输入学号。影刀RPA里“输入文本”或“设置元素文本”都可以我更习惯用“设置元素文本”它可以直接把变量值填进输入框不依赖键盘焦点。不过有个坑很多查询输入框默认有提示文字或上一次查询遗留的值必须先清空。我的做法是先选中输入框用“清空内容”动作再输入新的学号。第二步是点击查询按钮。这个看似简单实际坑很多后面专门讲。组件上我使用“点击网页元素”目标选择查询按钮。点击之后不要马上就去抓取结果因为页面是异步加载的成绩数据需要时间渲染出来。第三步是等待。我最开始写的是“延时1秒”结果时灵时不灵网络稍微一慢就抓了个空。后来改成“等待元素出现”等待目标是结果区域里的一个唯一元素比如成绩表格的容器节点。这样做的逻辑是等到目标元素真的出现在页面上说明结果已经渲染完成再往下执行才不会落空。超时时间我设置成10秒如果10秒还没出现就认为这次查询失败进入异常处理分支。第四步是抓取。这一步我用“获取网页元素文本”把结果区域整块文字取出来。比如页面返回的文本是“姓名张三 班级3班 语文120 数学135 英语128 总分383 班排名8 年级排名45”。拿到这段文本之后用影刀RPA的“字符串处理”组件或者Python表达式做正则提取把数值逐个抓出来。import re text result_text scores dict(re.findall(r([\u4e00-\u9fa5]):\s*(\d), text)) chinese scores.get(语文, ) math scores.get(数学, )这里用正则的好处是即使页面字段顺序变了只要“科目名分数”的格式不变代码就还能用。如果页面返回的是表格而不是文本那更简单直接用影刀RPA的“获取表格内容”组件按行列读取再逐格写入Excel。3.3 元素选择器调优避免“今天能跑明天就跑不了”影刀RPA的一个核心机制是“捕获元素”。当你把一个输入框或按钮捕获下来影刀会自动生成一个元素选择器相当于这个元素的身份证。问题在于这个自动生成的选择器往往包含绝对路径也就是“从页面最外层一路定位到这个元素”的完整路径。页面只要有稍微大一点的改版选择器就可能失效。我做了几件事来提升选择器的稳定性。首先优先选择带id的元素因为id在页面里一般唯一。其次如果没有id就优先使用文本属性定位比如查询按钮可以配置成“按钮文本等于查询”这种定位方式比一长串XPath直观得多。第三尽量避免选择器中出现动态的class名有些前端框架每次刷新页面都会生成新的class比如classbtn-3f8a2d这种数字后缀一旦变化选择器就断了。遇到这种情况我改用父级稳定元素再用相对选择器定位子元素。还有一个非常重要的点是iframe。成绩查询页面经常会把结果区域放在一个iframe里如果元素在iframe内而组件没有切换到对应的iframe那么无论怎么捕获运行时都找不到元素。影刀RPA里捕获元素后可以查看元素所属的iframe并在组件配置中指定“在哪个iframe中查找”。这一步看起来不起眼但我在实际跑批时被它折腾了很久下面专门讲。4. 跑真数据时踩过的坑附完整排查思路4.1 学号前面的零消失一个格式问题引发的连锁错误第一批测试数据跑了大概50条我随机抽查发现有6个学生查出来的成绩对不上号学号是“01102”的结果页面上显示的是“1102”这个人的成绩。我第一反应是流程中的变量传错了于是打开影刀的运行日志把读取到的学号变量一条条打出来结果发现日志里显示的就已经是“1102”了也就是说问题出在Excel读取环节而不是网页操作环节。接着我去看源文件。打开那个学号清单Excel点了一下学号列发现大部分单元格左上角都有一个绿色的小三角这是Excel的“错误检查”提示本质上是因为单元格存的是数值类型而内容看起来像文本。这个学号“01102”被Excel自动转成了数值“1102”因为数值类型不保留前导零。这个坑的排查链路很典型现象是成绩错位排查点从运行日志开始逐级往前推一直查到Excel源数据才定位到根因。解决方法是让提供数据的人在Excel里把学号列先设置成“文本”格式或者在RPA读取之前用影刀RPA“设置单元格格式”把整列改成文本。更稳妥的办法是在源文件里用Excel的“分列”功能把这一列强制转成文本再保存。从此以后凡是遇到这种“编号类”数据我都会多留个心眼先确认格式再跑流程。4.2 查询按钮捕获成功却点不动iframe和遮罩层的双重夹击还有一个印象很深的坑。流程在调试的时候点击查询按钮这一步一直正常元素也能高亮识别。但一跑真数据就发现日志显示“点击成功”可页面上的结果区域始终不出现然后就一直走到超时分支。我开始以为是等待时间不够把超时从10秒改成30秒还是不行。于是我把浏览器的运行过程录屏放慢速度看发现点击动作发生的时候页面上其实弹出过一个半透明的“加载遮罩层”鼠标物理上是点下去了但点击事件被遮罩层拦截查询按钮根本没收到。这个遮罩层很快又消失了所以在调试阶段人眼几乎察觉不到。排查思路是这样的先确认按钮是否真的被点击到了再看点击事件有没有被其他元素拦截。我在影刀里加了一步“检查遮罩层元素是否存在”如果存在就先点击遮罩层关闭按钮或者等待它消失再执行点击查询按钮。另一个关联问题是iframe。有的查询系统页面里查询按钮和结果区域不在同一个iframe或者在多层iframe嵌套里。如果影刀RPA捕获元素时没有正确绑定iframe上下文那么运行时日志可能显示“元素找到”但点击却没有实际效果。排查办法是在失败的节点上把“元素选择器”里的iframe信息截图出来对比页面实际结构。我在组件配置里显式指定了iframe问题就解决了。如果遇到一些点击事件特别顽固的元素还可以用“执行JavaScript”组件直接调用元素的click方法document.querySelector(#btnQuery).click();这个方法绕过了遮罩层和iframe的部分限制但要注意页面结构变化时这个JavaScript选择器也需要同步修改。4.3 结果串行错位循环变量和行号隔离的教训第三个大坑是结果串行。具体表现是跑前面的数据时一切正常跑了200条以后Excel里某几行的成绩内容和学号对不上。A学生的学号下面填的是B学生的成绩。我一开始还以为是正则提取有问题后来发现不是是循环内写入行号计算错了。我的流程里Excel数据从第2行开始而循环索引从0开始所以写入行号应该是“索引2”。最初确实这样写了但为了让流程更“灵活”我在循环前定义了一个变量“当前写入行”每次循环内部给它加1。问题就出在影刀RPA的变量如果某些动作在内外层循环间共享或者发生并发分支时这个“当前写入行”会被其他地方覆盖。日志里能看到某几条记录的“当前写入行”出现了跳变比如从102直接跳到104中间第103行就被覆盖了。这个问题的根因是行号状态被共享最好的解决方式是不要维护“可变状态”直接用“循环索引固定偏移量”来推导写入行号。修改之后不管外层变量怎么变每一行都锁定在它该在的位置。我也养成了一个习惯循环体内每次写入之前加一条日志输出“当前学号xxx写入行yyy”跑完之后从日志里随机抽几条和Excel对照能快速发现这类错位问题。4.4 登录失效和验证码给自动化留一道人工闸门跑批跑到一半最崩溃的事情就是登录失效。我第一版流程里没有做登录状态检查有一次跑了300多条教务系统把登录会话踢掉了页面跳转到登录框但我的流程还在机械地输入学号、点击查询。看起来流程还在跑实际所有查询结果都是“未登录”前面跑的数据也白干了。后来我加了登录检查逻辑在循环体开始时先判断页面上是否存在登录框的特征元素比如“用户名输入框”如果存在就立即跳出循环并通过影刀RPA的“消息窗口”弹窗提醒人工登录。人工登录完成后点继续流程从断点处接着跑。这样虽然还是要人介入但至少不会白跑几百条无用数据。验证码的处理逻辑类似。如果查询页面出现了验证码图片我检测到验证码元素后就暂停流程弹窗让用户手动输入验证码。我没有选择让RPA自动识别验证码因为准确性没保证而且涉及账号安全出了问题反而麻烦。人工兜底看似“不自动化”但在这种低频出现的情况下是最稳妥的方案。RPA的定位是把99%的重复工作干掉剩下那1%的临门一脚交给人工反而更高效。5. 上线跑批之后我又做了哪些稳定性优化5.1 日志、重试、断点续跑让500条数据可以无人值守第一版流程能跑通但稳定性还不够。我观察了几次全量跑批主要问题集中在某几个学号因为网络原因偶发超时导致整个流程中断。优化方向有三个。第一个是日志。我在循环体内每一关键步骤都加了“日志输出”包括当前处理到第几个学号、学号值、开始查询时间、结果文本前50个字符、写入是否成功。跑完之后日志文件就是一份完整的执行记录出了问题可以直接定位到具体某一行。第二个是重试。针对网络抖动导致的单次查询失败我在“等待结果出现”的超时分支里加了一个计数器如果本次查询失败重试3次每次间隔3秒。重试之前先强制刷新一下查询页面或者直接把结果区域重新加载一次。重试3次仍然失败才把这一行标记为“查询失败”写入Excel然后继续下一个学号。加了重试机制之后全量跑批的成功率从95%左右提升到了99.6%。第三个是断点续跑。我用一个临时TXT文件记录当前已经处理到的学号行号每处理完50条数据更新一次。如果流程意外崩溃下次启动时先读取这个进度文件从记录位置的下一个学号开始继续跑不用从头再来。这个功能在数据量达到几百上千条以后尤其重要能省下大量重新执行的时间。5.2 自动化耗时对比与人工抽检机制这套系统上线之后我专门做了一次耗时对比给我自己也给同事一个参考。方式单条平均耗时500条总耗时人工干预手动复制40秒左右约5.5小时全程盯屏容易出错RPA第一版12秒约100分钟偶发卡住需要干预RPA优化后6秒约50分钟仅2次登录验证这个对比很直观。第一版RPA跑得比手动快但还不够稳定优化日志、重试、断点续跑之后整体耗时进一步下降因为少了很多“卡住等人来救”的时间。但我想强调的是自动化不等于“跑完就不管了”。每次跑完批量查询我都会做一次人工抽检随机抽10个学号手动在教务系统里查一遍和Excel里的成绩比对。重点检查三类数据分数为0的、标记为“查无此人”的、带异常日志的。RPA负责效率人工负责质量两者配合才靠谱。实际使用中这种抽检机制帮我发现过两次问题一次是因为某个班级成绩还没录入导致大面积“无成绩数据”另一次是因为正则表达式没有覆盖“缺考”这种中文状态。5.3 同一套流程迁移到其他查询场景的思路做完这个成绩批量查询系统之后我发现这套“Excel驱动网页查询再回填”的架构非常通用换一个业务领域只需要改几个地方就能复用。迁移步骤大概是这样的第一步换掉输入Excel的文件路径和表头保持“每行一条查询主键”的结构第二步用影刀RPA重新捕获目标网站的输入框、查询按钮、结果区域这三个核心元素第三步调整结果解析的正则表达式匹配不同网站返回的字段格式第四步如果目标网站有登录或验证码机制把人工闸门的逻辑加进去。我后来用这套思路做过几个类似的需求批量查快递单号物流信息、批量核验证书真伪、批量确认订单状态。流程骨架基本没动只是换了数据源和界面元素。也就是说成绩批量查询系统不只是一个单一工具它更像一个“网页查询类RPA需求”的通用模板。最后再分享一个小技巧这套流程我在影刀RPA里保存成了模板下次再遇到类似的查询页面只需要把输入框、按钮和结果容器的选择器重新捕获一遍正则改一改基本半小时就能跑起来。如果让我重新做一次我会更早地考虑“异常分支”因为真正的生产效率瓶颈不是正常路径跑得快而是异常出现时它还能自己走完。
返回列表