影刀RPA避坑指南:自动化项目从开发到稳定运行的10个关键交付标准
很多人觉得自动化流程写完能跑就完事了。
但过一周你会发现:
- 页面改版了,元素定位全失效
- 日志是空的,不知道流程跑到哪了
- 账号被限了,流程没有任何处理直接挂掉
- 采集了3天的数据,发现有一半是重复的
跑得起来和能长期稳定运行,是两件完全不同的事。

一、标准1:流程有完整的日志输出
每个关键节点都要有日志,不能靠猜。
必须有日志的位置:
- 流程启动(打印版本、执行时间、参数)
- 每个账号/任务开始和结束
- 关键操作成功(登录成功、采集完成、写入完成)
- 所有异常(包括被捕获的)
- 流程结束(汇总统计)
日志格式要统一:
# 推荐格式:[时间] [级别] 信息
import datetime
def log(level, msg):
ts = datetime.datetime.now().strftime('%H:%M:%S')
print(f"[{ts}] [{level}] {msg}")
log("INFO", "流程启动,账号数:20")
log("SUCCESS", "账号 acc_001 操作完成,结果:120 条")
log("WARNING", "账号 acc_003 登录态失效,已跳过")
log("ERROR", "账号 acc_007 采集失败:元素未找到")

二、标准2:有截图机制
纯文字日志不够,关键错误要有截图。
什么时候截图:
- 进入 Catch 块时
- 流程进入异常分支时
- 人工检查点(比如进入下一步前截图存档)
截图文件管理:
店群矩阵自动化突破运营极限!
import os, datetime
截图目录 = "D:\\\\自动化截图"
如果 not 目录存在(截图目录):
创建目录(截图目录)
def take_screenshot(label):

ts = datetime.datetime.now().strftime('%Y%m%d_%H%M%S')
文件名 = f"{截图目录}\\\\{label}_{ts}.png"
截图(文件名)
return 文件名
截图文件夹每周清理一次,否则会占满磁盘。
三、标准3:数据有去重处理
批量采集的数据,不同跑批次之间经常会产生重复数据。
最基本的去重:
import pandas as pd
df = pd.read_excel("D:\\采集结果.xlsx")
# 按商品ID去重
df = df.drop_duplicates(subset=['商品ID'], keep='last')
# 没有唯一ID时,按多个字段组合去重
df = df.drop_duplicates(subset=['商品名', '店铺', '平台'], keep='last')
df.to_excel("D:\\采集结果_去重.xlsx", index=False)
增量采集的去重(避免重复入库):
# 已有数据里的ID集合
已有ID集 = set(历史数据['商品ID'].tolist())
# 只写入新数据

新数据 = [row for row in 本次采集数据 if row['商品ID'] not in 已有ID集]
四、标准4:有失败记录和重跑机制
失败了不仅要记录,还要支持重跑。
失败记录格式:
失败时间 | 任务ID | 失败原因 | 是否已重跑 | 备注
2026-06-10 14:30 | T002 | 元素定位失败 | 否 | 需要人工确认页面结构
重跑流程设计:
# 读取失败记录
读取Excel("D:\\失败记录.xlsx") –> 失败表
遍历行(失败表):
如果 当前行['是否已重跑'] == '否':
任务ID = 当前行['任务ID']
# 重新执行该任务
调用子流程(执行单任务, 任务ID=任务ID) –> 重跑结果
如果 重跑结果 == '成功':
写入单元格(失败表, 当前行, '是否已重跑', '是')
否则:
写入单元格(失败表, 当前行, '备注', '重跑仍失败,需人工处理')
保存Excel(失败表)

五、标准5:元素定位要有备用方案
主 XPath 失效后,不要让整个流程停下来。
主备 XPath 模式:
# 先尝试主XPath
判断元素是否存在("//button[@id='submit-btn']", 超时=3秒) –> 主定位成功
如果 主定位成功:
点击元素("//button[@id='submit-btn']")
否则:
# 降级到备用XPath
判断元素是否存在("//button[text()='提交']", 超时=3秒) –> 备用定位成功
如果 备用定位成功:
点击元素("//button[text()='提交']")
输出日志("使用备用定位方案")
否则:
截图("两种定位都失败.png")
输出日志("元素定位全部失败,可能页面结构已更新")
返回 False
六、标准6:有操作频率控制
不加频率控制的流程,迟早会触发平台限制。

基本控制:
import random
def smart_wait(min_sec=1.0, max_sec=3.0):
"""随机等待,模拟人工操作节奏"""
wait_time = random.uniform(min_sec, max_sec)
固定等待(wait_time)
# 每次操作后
点击元素(按钮)
smart_wait(0.8, 2.0) # 操作间随机等待
# 每批完成后
如果 当前计数 % 30 == 0:
输出日志("已处理30条,休息5秒")
固定等待(5)
七、标准7:流程有启动自检
流程开始前,先检查运行环境是否就绪:
def pre_check():
"""启动前自检"""
错误列表 = []
# 检查配置文件是否存在
如果 not 文件存在("D:\\账号配置.xlsx"):
错误列表.append("账号配置文件不存在")
# 检查磁盘空间(不能少于500MB)
剩余空间 = 获取磁盘剩余空间("D:\\\\")
如果 剩余空间 < 500 * 1024 * 1024:
错误列表.append(f"磁盘空间不足,剩余 {剩余空间/1024/1024:.0f}MB")
# 检查网络连通性
[尝试]:
HTTP请求("https://www.baidu.com", 超时=5秒)
[异常]:
错误列表.append("网络连接失败")
如果 len(错误列表) > 0:
遍历列表(错误列表, 错误):
输出日志(f"❌ 自检失败:{错误}")
返回 False
输出日志("✅ 自检通过,开始执行")
返回 True
如果 not pre_check():
停止流程()

八、标准8:配置和代码分离
不要把任何参数写死在流程里。
必须外部化的配置:
- 目标 URL
- 登录账号密码
- Webhook 地址
- 运行参数(等待时间、重试次数、最大条数)
temu店群自动化报活动案例
- 文件路径
# 不好的做法
url = "https://mms.pinduoduo.com/" # 写死在流程里
# 好的做法

url = 参数字典['pdd_url'] # 从 Excel 配置表里读
九、标准9:发布前要在测试数据上跑一遍
不要直接在生产数据上首次运行新流程。
测试清单:
- 用测试账号跑完整流程一遍
- 模拟网络超时(断网2秒)看流程能否恢复
- 测试账号登录态失效的处理(手动清 Cookie)
- 确认日志输出完整
- 确认结果数据格式正确
- 确认写入文件没有乱码
- 确认飞书通知能收到
十、标准10:有流程版本管理
流程迭代后,要能回滚到上一个稳定版本。

最简单的版本管理:
在影刀里,流程名称带上版本号:
商品采集主流程_v1.0(稳定版,不要删)
商品采集主流程_v1.1(测试中)
更严格的做法是用影刀的"导出"功能,把稳定版本导出为 .yda 文件,存到网盘备份。
总结:10 条交付标准速查
| 1 | 完整日志 | 跑一遍,看日志文件 |
| 2 | 截图机制 | 手动触发异常,看截图是否生成 |
| 3 | 数据去重 | 跑两次,对比结果是否有重复 |
| 4 | 失败记录 | 制造一个失败,看是否记录 |
| 5 | 元素备用方案 | 修改XPath让主定位失败,看备用是否启用 |
![]() |
| 6 | 频率控制 | 观察操作间隔是否有随机等待 | | 7 | 启动自检 | 删除配置文件,看是否提前报错 | | 8 | 配置分离 | 检查流程里有无硬编码的URL或密码 | | 9 | 测试跑通 | 在测试账号上完整跑一遍 | | 10 | 版本备份 | 确认有稳定版本备份 |
#影刀RPA #RPA交付标准 #自动化质量 #RPA避坑指南 #影刀实战
作者:林焱
本文为影刀RPA系列文章之一,内容源于实操经验整理与分享。






