一个流程写到底,刚开始很爽,改起来想哭。
翻页、采集、保存、异常处理全挤在一个流程图里,找指令找到眼花。
把流程拆成子流程,就像把衣柜分区——上层放被子,中层挂衣服,下层放鞋子。
我也是从一锅粥过来的,后来学会了ABCD编号法,维护效率翻倍。
一、为什么要拆分子流程——三个信号告诉你该拆了
场景:流程图超过一屏(鼠标滚轮要滚两下才能看完)。
信号1:同一个操作(比如“写入日志”)复制粘贴了3次以上。
信号2:你想禁用某段逻辑调试,要拖动一大片指令。
信号3:别人接手你的流程,看了5分钟不知道从哪开始看。
核心原则:一个子流程只做一件事,并且这件事能在10个指令内完成。
二、ABCD编号法——让子流程顺序清晰
方法:给子流程名字加上前缀字母,按执行顺序编号。
| 前缀 | 含义 | 示例 |
|---|---|---|
| A_ | 初始化(设置变量、打开浏览器、登录) | A_登录拼多多 |
| B_ | 主逻辑循环(翻页、采集数据) | B_翻页循环、B_采集商品列表 |
| C_ | 数据处理(清洗、写入Excel、发送飞书) |
C_清洗价格数据、C_写入表格 |
| D_ | 收尾(关闭浏览器、发送报告、清理缓存) | D_关闭浏览器、D_发送运行报告 |
实操步骤:
- 在左侧流程树中,右键 → 新建子流程。
- 命名为
A_初始化。 - 继续新建
B_主循环、C_保存数据、D_清理。 - 在主流程里按顺序调用:
A_初始化→B_主循环→C_保存数据→D_清理。
容易踩的坑:
- 不要用中文拼音缩写(如
CS_),自己和别人都看不懂。 - 编号不要跳号,A1、A2... 或者直接用A_、B_足够。
- 子流程名字超过20个字会显示不全,控制在15字以内。
三、模块化拆分实战——以“小红书批量采集”为例
原流程(一团乱麻)
打开小红书 → 输入搜索词 → 点击搜索 → 等待加载 →
获取笔记列表 → 循环每条笔记 → 点击进入详情 →
获取标题 → 获取点赞数 → 获取评论数 →
返回列表页 → 循环结束 → 翻页 → 重复上面一堆 →
最后保存到Excel
拆分成子流程
| 子流程名 | 职责 | 输入参数 | 输出参数 |
|---|---|---|---|
A_登录小红书 | 打开首页,扫码登录(如果未登录) | 无 | 是否登录成功 |
B_搜索关键词 | 输入关键词,点击搜索,等待结果 | 关键词 | 搜索结果URL |
C_采集单页笔记 | 采集当前页所有笔记的基本信息 | 页码 | 笔记列表(数组) |
|
D_翻页 | 点击下一页,等待加载 | 当前页码 | 下一页页码 |
| E_保存到表格 | 把采集到的笔记列表写入Excel | 笔记列表 | 写入行数 |
| F_发送报告 | 运行结束后发飞书通知 | 总采集数 | 无 |
主流程现在只有6个调用指令,阅读起来一目了然。
四、子流程的参数传递——进和出
场景:子流程需要接收外部数据(比如关键词),也要把结果返回主流程。
核心:使用“流程输入”和“流程输出”参数。
操作步骤
- 打开子流程,点击顶部工具栏的“流程参数”。
- 添加“输入参数”:定义参数名(如
关键词)、类型(字符串)。 - 添加“输出参数”:定义参数名(如
采集结果列表)、类型(列表)。 - 在子流程内部,可以直接使用
关键词变量(不用再定义)。 - 子流程结束时,把结果赋值给
采集结果列表(用“设置变量”指令)。 - 在主流程调用子流程时,填写输入参数的具体值,并接收输出参数。
实战示例
子流程B_搜索关键词:
- 输入参数:
关键词(字符串) - 输出参数:
结果URL(字符串)
子流程内部代码(影刀指令):
# 伪代码
打开网页("https://xiaohongshu.com")

输入文本(搜索框, 关键词)
点击元素(搜索按钮)
等待元素出现(笔记列表容器)
结果URL = 获取当前URL()
主流程调用:
- 调用
B_搜索关键词,输入参数关键词填"口红",输出参数存到当前页URL。
容易踩的坑:
- 输入参数的名字不要和全局变量重名,会覆盖。
- 输出参数必须在子流程所有分支里都有赋值(包括异常分支)。
- 参数类型要匹配:传数字不能给字符串变量。
五、子流程的复用——一次编写,到处调用
场景:多个主流程都需要“登录拼多多”、“提取价格数字”。
方法:把通用逻辑做成独立子流程,存到“公共流程库”。
影刀实操
- 在左侧流程树中,右键 → 新建子流程 → 命名
公共_提取数字。 - 设计输入参数
原始文本,输出参数纯数字。 - 内部用Python代码或正则指令清洗。
- 在其他流程中,直接拖入“调用子流程”,选择
公共_提取数字。
我的公共子流程库示例:
公共_等待并点击(封装了等待元素出现+点击+重试)公共_提取手机号(正则提取)公共_写入Excel带表头(自动判断是否已存在表头)公共_发送飞书消息(封装webhook)
这些子流程在不同项目间复制粘贴,不用每次重写。
六、子流程的异常处理——不让一个崩掉整个流程
场景:子流程里的某一步出错了,希望整个主流程不中断。
核心:在子流程内部用Try-Catch-Finally,把错误消化掉,返回一个错误标志。
设计模式
# 子流程内部结构
Try:
# 核心操作
采集数据()
输出参数_是否成功 = True
Catch:
输出日志("子流程失败:" + 获取错误信息())
截图保存("error")
输出参数_是否成功 = False
Finally:
# 清理(关闭弹窗等)
关闭异常弹窗()
主流程调用后判断是否成功,决定是重试还是跳过。
容易踩的坑:
- 子流程抛出的异常如果不捕获,会一直向上冒泡到主流程,导致整个应用停止。
- 每个子流程都应该有一个“是否成功”的输出参数,让调用方知道结果。
七、常见拆分错误与修正
| 错误 | 现象 | 正确做法 |
|---|---|---|
| 子流程太大(超过30个指令) | 修改时要翻很久 | 继续拆,一个子流程10-15个指令 |
| 子流程太细(只有2个指令) | 调用比干活还费劲 | 合并相关操作 |
| 子流程之间循环调用 | A调B,B调A,死循环 | 检查依赖关系,改成单向调用 |
| 参数传递过多(超过5个) | 维护困难 | 把相关参数打包成一个字典或列表 |
| 子流程名没有编号 | 执行顺序靠猜 | 用A_B_C_前缀 |
八、影刀专属:子流程的调试技巧
- 单独运行子流程:右键子流程 → 运行此流程(不用跑整个主流程)。
- 设置断点:子流程内部也可以打断点,调试时进入子流程会停。
- 查看参数值:在子流程的第一行加“输出日志”,打印输入参数,确认传对了。
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 子流程找不到变量 | 变量作用域不对 | 用流程参数传递,不要直接读主流程变量 |
| 修改了子流程,主流程没更新 | 缓存问题 | 保存所有流程,重新打开主流程 |
| 调用子流程时报“类型错误” | 参数类型不匹配 | 检查输入参数是字符串还是数字,用类型转换 |
| 子流程里的元素捕获失效 | 子流程和主流程共用一个浏览器 | 无影响,应该能正常用。如果报错检查是否切换了页面 |
| 公共子流程改了,多个项目要同步 | 复制粘贴的弊端 | 把公共子流程存成独立文件,用“导入”功能 |
推荐资源
- 影刀官方文档:《子流程与模块化开发》(帮助中心搜索“子流程”)。
- 我的习惯:新建任何一个流程,先建好A_B_C_D四个空子流程,再往里面填指令。强迫自己模块化。
- 扩展阅读:系列第14篇《流程参数实战》——参数传递的完整教程(下一篇可写)。
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
