影刀RPA子流程与模块化:让复杂流程变得井井有条
·
影刀RPA子流程与模块化:让复杂流程变得井井有条
作者:林焱 | 阅读时间:约10分钟 | 难度:⭐⭐ 进阶
当你的流程从 10 条指令增长到 100 条、500 条时,如果没有良好的组织方式,很快就会变成一团乱麻。本文教你用「子流程」把复杂问题拆解成简单模块。
一、为什么要使用子流程?
1.1 一个真实的痛点场景
假设你要做一个电商数据采集系统,主流程有这些步骤:
打开网站 → 登录 → 搜索商品 → 翻页采集 → 清洗数据
→ 写入Excel → 发送邮件通知 → 备份数据 → 写日志
如果全部写在一个流程里,会变成这样:
[打开网页] [登录-输入账号] [登录-输入密码] [登录-点击按钮]
[等待登录成功] [搜索-点击搜索框] [搜索-输入关键词]
[搜索-点击搜索] [翻页-判断是否有下一页] [翻页-点击下一页]

[采集-获取标题] [采集-获取价格] [采集-获取评分] ... (共200+条指令)
问题显而易见:
- 找一个功能要翻半天
- 改一处可能影响别处
- 无法复用到其他项目
- 别人看不懂你的流程
1.2 子流程能解决什么?
| 问题 | 用子流程后的效果 |
|---|---|
| 流程太长看不懂 | 拆成多个小模块,每个只做一件事 |
| 相同逻辑重复写 | 封装成子流程,多处调用 |
| 改一个地方牵连一片 | 只改子流程内部,调用方不受影响 |
| 团队协作困难 | 各人负责各自的子流程 |
二、子流程的基本概念
2.1 什么是子流程?
子流程 = 一个独立的、可被调用的、完成特定功能的流程单元
类比理解:
- 主流程 = 一本书
- 子流程 = 书中的每一章
- 指令 = 章里的每一个段落
2.2 子流程的三大特性
在这里插入图片描述
| 特性 | 说明 | 类比 |
|---|---|---|
| 封装性 | 内部实现细节对外隐藏 | 你不需要知道手机内部电路,只需要知道怎么按按钮 |
| 复用性 | 可以在多处反复调用 | 一个工具可以被很多人重复使用 |
| 参数化 | 通过参数传入不同数据执行不同行为 | 同一台洗衣机,放不同衣服洗出不同结果 |
三、创建和调用子流程
3.1 创建子流程
方法一:从零新建
拼多多店群自动化报活动上架!
步骤:
1. 在左侧面板右键 → 新建子流程
2. 输入名称(如:login_flow)
3. 在子流程画布中编辑指令
4. 保存
方法二:从已有流程中提取
步骤:
1. 在主流程中选中一组相关指令(如登录相关的5条)
2. 右键 → 提取为子流程
3. 输入子流程名称
4. 影刀自动将选中的指令移到新子流程中
5. 原位置自动变成「调用子流程」指令
💡 推荐:新项目先用方法一设计好结构;老项目重构用方法二快速提取。
3.2 调用子流程
在主流程中:
- 找到 「流程控制」 分类
- 拖入 「调用子流程」 指令
- 选择要调用的子流程
- 如需传参,配置输入输出参数
# 主流程示例
- 打开浏览器
- 调用子流程: login_flow(用户名, 密码) → 返回: 登录状态
- 判断: 如果登录成功
- 调用子流程: collect_data(关键词, 页数) → 返回: 数据列表
- 调用子流程: save_to_excel(数据列表)
- 调用子流程: send_email(收件人, 附件路径)
- 否则:
- 调用子流程: send_alert("登录失败")
3.3 参数传递机制
输入参数(传进去)
| 参数类型 | 说明 | 示例 |
|---|---|---|
| 字符串 | 文本信息 | "北京", "admin" |
| 数字 | 数值 | 100, 3.14 |
| 布尔值 | 是/否 | true, false |
| 列表 | 多个值的集合 | [item1, item2, item3] |
| 对象 | 结构化数据 | {name:"张三", age:25} |
输出参数(拿出来)
子流程处理完之后,可以把结果返回给调用方:
子流程: calculate_tax(金额, 税率)
↓
内部计算: 税额 = 金额 × 税率
↓
输出参数: 返回税额
↓
主流程拿到税额继续后续操作

四、实战案例:电商数据采集系统的模块化拆分
4.1 需求描述
搭建一个完整的电商数据采集系统,功能包括:
- 自动登录网站
- 按关键词搜索商品
- 翻页采集商品信息
- 数据清洗去重
- 存入Excel并发邮件通知
4.2 模块化设计方案
┌─────────────────────────────────────────────┐
│ 主流程 main │
│ │
│ ┌─────────┐ │
│ │ login │ ← 子流程1:登录 │
│ └────┬────┘ │
│ ↓ │
│ ┌─────────┐ │
│ │ search │ ← 子流程2:搜索 │
│ └────┬────┘ │
│ ↓ │
│ ┌─────────┐ ┌──────────┐ │
│ │ collect │ → │ cleanup │ ← 子流程3、4 │
│ └────┬────┘ └────┬─────┘ │
│ ↓ ↓ │
│ ┌─────────┐ ┌──────────┐ │
│ │ excel │ │ email │ ← 子流程5、6 │
│ └─────────┘ └──────────┘ │
└─────────────────────────────────────────────┘
4.3 各子流程详细设计
子流程1:login(登录)
输入参数:username, password
输出参数:is_success (布尔值)
指令序列:
1. 打开登录页面
2. 等待用户名输入框出现
3. 输入 username
4. 输入 password
5. 点击登录按钮
6. 等待页面跳转(最多30秒)
7. 检测是否出现用户头像/欢迎文字
8. is_success = 出现了欢迎文字 ? true : false
9. 返回 is_success
子流程2:search(搜索)

输入参数:keyword, category
输出参数:result_count (数字)
指令序列:
1. 点击搜索框
2. 清空现有内容
3. 输入 keyword
4. 如果 category 不为空,选择分类下拉框
5. 点击搜索按钮
6. 等待结果加载
7. 获取结果数量文字 "共 XXX 件商品"
8. 提取数字部分作为 result_count
9. 返回 result_count
子流程3:collect_data(数据采集)
输入参数:max_pages
输出参数:data_list (列表)
指令序列:
1. 创建空列表 data_list
2. current_page = 1
3. 循环 (current_page <= max_pages):
a. 等待列表加载完毕
b. 获取当前页所有商品元素
c. 遍历每个商品:
- 获取标题
- 获取价格
- 获取销量
- 获取链接
- 组装成字典加入 data_list
d. 判断是否有下一页
e. 如果有:点击下一页,current_page + 1
f. 如果没有:跳出循环
4. 返回 data_list
子流程4:cleanup_data(数据清洗)
输入参数:raw_data (列表)
输出参数:clean_data (列表)
指令序列:
1. 创建空列表 clean_data
2. 遍历 raw_data 中每条数据:
a. 去除标题首尾空格
b. 价格字符串转数字(去掉"¥"符号)
c. 销量格式统一("1万+" → "10000+")
d. 去除完全重复的记录
e. 过滤掉价格=0或标题为空的无效数据
f. 将清洗后的记录加入 clean_data
3. 返回 clean_data
子流程5:save_to_excel(保存Excel)
输入参数:data_list, file_path
指令序列:
1. 打开/创建 Excel 文件
2. 写入表头:序号 | 标题 | 价格 | 销量 | 链接 | 采集时间
3. 遍历 data_list,逐行写入数据
4. 设置表头样式(加粗、背景色)
5. 设置列宽自适应
6. 冻结首行
7. 保存文件
8. 关闭 Excel
子流程6:send_notification(发送通知)
输入参数:data_count, file_path, recipient
指令序列:
1. 拼接邮件正文:
"您好!\n\n本次采集已完成,共获取 {data_count} 条数据。
详细数据请见附件。\n\n——影刀RPA机器人"
2. 启动邮件客户端或调用SMTP
3. 填写收件人:recipient
4. 填写主题:"电商数据采集报告 - {今天日期}"
5. 填写正文
6. 添加附件:file_path
7. 发送邮件
8. 记录发送结果到日志
4.4 主流程组装

主流程:ecommerce_collector
步骤:
1. username = 从配置文件读取用户名
2. password = 从配置文件读取密码
3. 调用 login(username, password) → success
4. 如果 success == false:
→ 调用 send_alert("登录失败!")
→ 结束流程
5. 调用 search("iPhone 16", "手机") → count
6. 调用 collect_data(count // 20 + 1) → raw_data
7. 调用 cleanup_data(raw_data) → clean_data
8. 调用 save_to_excel(clean_data, "D:/report.xlsx")
9. 调用 send_notification(len(clean_data), "D:/report.xlsx", "boss@company.com")
10. 日志记录:"任务完成,共采集 N 条有效数据"
11. 结束
五、子流程设计的最佳原则
5.1 单一职责原则
每个子流程只做一件事,且做好一件事。
❌ 错误示例:do_everything 子流程
(登录 + 采集 + 清洗 + 存储 + 发邮件 全写在一起)
✅ 正确示例:每个子流程职责明确
login → 只负责登录
collect → 只负责采集数据
clean_data → 只负责清洗数据
save_excel → 只负责保存Excel
send_email → 只负责发邮件
5.2 合理的粒度
| 子流程规模 | 适用情况 | 示例 |
|---|---|---|
| 3~15条指令 | ✅ 最理想 | 登录、单次数据写入 |
| 15~30条指令 | ⚠️ 可接受 | 完整的数据采集循环 |
| 超过50条 | ❌ 应该再拆 | 考虑进一步拆分子模块 |
5.3 命名规范
✅ 推荐命名:
- login_user (动词_对象)
- collect_product_data (动词_对象_补充)
- format_price_string (动词_对象_目的)
- check_network_status (检查_对象_状态)

❌ 避免:
- flow1, flow2, flow3 (无意义)
- do_something (太模糊)
- LoginAndCollectDataSaveSendEmail (太长,做了多件事)
5.4 降低耦合度
好的子流程之间应该是低耦合的:
高耦合(❌ 不推荐):
A子流程直接修改B子流程内部的变量
A子流程依赖C子流程的执行顺序
低耦合(✅ 推荐):
A子流程通过参数接收输入,通过返回值输出结果
A不关心B和C怎么实现的,只知道它们的接口
TEMU店群矩阵自动化运营核价报活动
六、高级技巧:子流程的组合模式
6.1 顺序模式
最常用的模式,按顺序依次执行:
A → B → C → D
适用:大部分线性业务流程。
6.2 条件模式

根据条件选择执行不同的子流程:
判断条件?
├── 是 → 执行 A
└── 否 → 执行 B
适用:登录成功/失败走不同分支、不同类型数据处理。
6.3 循环模式
对一组数据重复执行同一子流程:
遍历数据列表:
→ 调用 process_item(当前项)
适用:批量处理订单、批量采集商品。
6.4 重试模式
遇到失败时自动重试:
尝试调用 risky_operation()
├── 成功 → 继续
└── 失败 → 重试(最多3次)
├── 重试成功 → 继续

└── 重试也失败 → 记录错误,跳过
适用:网络请求、提交表单等不稳定操作。
6.5 并行模式(高级)
多个互不依赖的子流程同时执行:
并行执行:
├─ 任务A:采集淘宝数据
├─ 任务B:采集京东数据
└─ 任务C:采集拼多多数据
↓
全部完成后汇总
适用:多平台数据采集、独立任务的批处理。
七、常见错误与排查
| 错误现象 | 原因 | 解决方案 |
|---|---|---|
| 调用子流程后变量丢失 | 子流程内的变量作用域是局部的 | 使用输入/输出参数传递数据 |
| 子流程修改了外部变量 | 变量引用而非值传递 | 在子流程内部创建局部副本 |
| 子流程找不到 | 名称拼写错误或未保存 | 检查名称是否一致,确认已保存 |
| 参数类型不匹配 | 传入了字符串但期望数字 | 添加类型转换指令 |
| 死循环 | 子流程内部循环条件永远为真 | 确保循环有退出条件,加最大次数限制 |
八、总结
┌────────────────────────────────────────────┐
│ 子流程核心要点速记 │
├────────────────────────────────────────────┤
│ 1. 一个子流程只做一件事(单一职责) │
│ 2. 通过参数传递数据,不要直接访问外部变量 │
│ 3. 好的名字比注释更重要 │

│ 4. 3~15条指令是最理想的粒度 │
│ 5. 先设计再编码,画出模块关系图 │
│ 6. 低耦合高内聚是最高准则 │
└────────────────────────────────────────────┘
🎯 下篇文章预告:《影刀RPA异常处理全攻略:Try-Catch让流程更健壮》— 流程跑着跑着挂了怎么办?学会异常处理让你的 RPA 机器人 24 小时不停机。
更多推荐




所有评论(0)