影刀RPA200篇纪念版:最实用的20个自动化场景大盘点
作者:林焱 | 发布平台:CSDN / 公众号 / 掘金
前言:写在200篇之际
从第一篇《影刀RPA入门指南》到现在,我们共同探索了200个自动化场景,涵盖数据采集、Excel处理、API集成、桌面自动化等各个维度。 
这一篇,我们做一次大盘点------精选出最实用、最高频被读者用到的20个场景,每个场景附上核心代码片段,希望能成为你的自动化工具速查手册。
TOP 1:网页数据自动采集
🏆 使用频率最高,几乎所有业务都有数据采集需求
python
import shadowbot as sb
def scrape_product_data(url, max_pages=10):
"""通用商品数据采集"""
page = sb.browser.get_page(url)
all_data = []
for page_num in range(1, max_pages + 1):
items = page.get_all_elements(".product-item")
for item in items:
all_data.append({
"名称": item.get_text(".product-name"),
"价格": item.get_text(".product-price"),
"评分": item.get_text(".rating"),
"URL": item.get_attr("a", "href"),
})
# 翻页
next_btn = page.find_element(".pagination-next")
if not next_btn or not next_btn.is_enabled():
break
page.click(".pagination-next")
page.wait_for_load()
sb.excel.write_rows("采集结果.xlsx", all_data)
return all_data
TOP 2:Excel数据自动处理
在这里插入图片描述
💹 财务、运营、HR人员的必备技能
python
import pandas as pd
def process_sales_excel(input_file, output_file):
"""销售数据自动处理"""
df = pd.read_excel(input_file)
# 数据清洗
df = df.dropna(subset=["订单号", "销售额"])
df["销售额"] = pd.to_numeric(df["销售额"], errors="coerce").fillna(0)
df["利润"] = df["销售额"] * 0.3 # 假设30%利润率
# 分组汇总
summary = df.groupby("产品类别").agg({
"销售额": ["sum", "mean", "count"],
"利润": "sum"
}).round(2)
# 输出
with pd.ExcelWriter(output_file, engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="详细数据", index=False)
summary.to_excel(writer, sheet_name="汇总分析")
sb.log.info(f"处理完成:{len(df)} 行数据")
return output_file
video(video-crnicyhY-1782424991356)(type-csdn)(url-[live.csdn.net/v/embed/525...](https://link.juejin.cn?target=https%3A%2F%2Flive.csdn.net%2Fv%2Fembed%2F525010)(image-https%3A%2F%2Fi-blog.csdnimg.cn%2Fimg_convert%2Ffbc90f4b1fc63e7fc3ccf655a82d74d4.jpeg)(title-%25E5%25BA%2597%25E7%25BE%25A4%25E7%259F%25A9%25E9%2598%25B5%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596%25E7%25AA%2581%25E7%25A0%25B4%25E8%25BF%2590%25E8%2590%25A5%25E6%259E%2581%25E9%2599%2590%25EF%25BC%2581 "https://live.csdn.net/v/embed/525010)(image-https://i-blog.csdnimg.cn/img_convert/fbc90f4b1fc63e7fc3ccf655a82d74d4.jpeg)(title-%E5%BA%97%E7%BE%A4%E7%9F%A9%E9%98%B5%E8%87%AA%E5%8A%A8%E5%8C%96%E7%AA%81%E7%A0%B4%E8%BF%90%E8%90%A5%E6%9E%81%E9%99%90%EF%BC%81"))
TOP 3:定时邮件自动发送
📧 日报、周报、预警通知的标配方案
python
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
def send_report_email(to_list, subject, body, attachments=None):
"""发送报告邮件"""
config = {
"smtp_host": "smtp.qq.com",
"smtp_port": 465,
"from_email": sb.config.get("email_user"),
"password": sb.config.get("email_password"),
}
msg = MIMEMultipart()
msg["From"] = config["from_email"]
msg["To"] = "; ".join(to_list)
msg["Subject"] = subject
msg.attach(MIMEText(body, "html", "utf-8"))
# 附件
for attachment in (attachments or []):
with open(attachment, "rb") as f:
part = MIMEBase("application", "octet-stream")
part.set_payload(f.read())
encoders.encode_base64(part)
import os
part.add_header("Content-Disposition", f'attachment; filename="{os.path.basename(attachment)}"')
msg.attach(part)
with smtplib.SMTP_SSL(config["smtp_host"], config["smtp_port"]) as server:
server.login(config["from_email"], config["password"])
server.sendmail(config["from_email"], to_list, msg.as_string())
sb.log.info(f"邮件已发送至 {len(to_list)} 人")
TOP 4:HTTP API自动调用
🔌 打通系统间的数据互通
python
import requests
class APIClient:
"""通用HTTP API客户端"""
def __init__(self, base_url, token=None):
self.base_url = base_url.rstrip("/")
self.session = requests.Session()
if token:
self.session.headers.update({"Authorization": f"Bearer {token}"})
def get(self, path, params=None):
resp = self.session.get(f"{self.base_url}/{path}", params=params, timeout=30)
resp.raise_for_status()
return resp.json()
def post(self, path, data=None):
resp = self.session.post(f"{self.base_url}/{path}", json=data, timeout=30)
resp.raise_for_status()
return resp.json()
def paginate(self, path, page_param="page", page_size=100):
"""自动翻页获取全部数据"""
all_data = []
page = 1
while True:
data = self.get(path, {page_param: page, "per_page": page_size})
items = data.get("data", data.get("items", data if isinstance(data, list) else []))
if not items:
break
all_data.extend(items)
if len(items) < page_size:
break
page += 1
return all_data
# 使用
api = APIClient("https://api.example.com", token=sb.config.get("api_token"))
all_orders = api.paginate("orders")
TOP 5:企业微信/钉钉消息推送

💬 运营监控和团队协作的消息中枢
python
import requests
def send_wecom_message(webhook_url, title, content, color="green"):
"""发送企业微信卡片消息"""
color_map = {"green": "info", "red": "warning", "orange": "comment"}
md_content = f"## {title}\n\n{content}"
resp = requests.post(webhook_url, json={
"msgtype": "markdown",
"markdown": {"content": md_content}
})
return resp.json().get("errcode") == 0
def send_alert_if_needed(metric_name, current_value, threshold, webhook_url):
"""条件触发告警"""
if current_value > threshold:
content = f"""
> **监控指标**:{metric_name}
> **当前值**:{current_value}
> **告警阈值**:{threshold}
> **超出比例**:{(current_value/threshold - 1)*100:.1f}%
> **时间**:{datetime.now().strftime('%Y-%m-%d %H:%M')}
⚠️ 请及时处理!
""".strip()
send_wecom_message(webhook_url, f"🚨 {metric_name} 告警", content, "red")
return True
return False
TOP 6:PDF文件自动处理
📄 合同、发票、报告的批量处理
python
import fitz # PyMuPDF
def extract_pdf_data(pdf_path):
"""提取PDF文本内容"""
doc = fitz.open(pdf_path)
text_content = []
for page_num, page in enumerate(doc, 1):
text = page.get_text("text")
text_content.append({"页码": page_num, "内容": text.strip()})
doc.close()
return text_content

def merge_pdfs(pdf_files, output_path):
"""合并多个PDF"""
merged = fitz.open()
for pdf_file in pdf_files:
doc = fitz.open(pdf_file)
merged.insert_pdf(doc)
doc.close()
merged.save(output_path)
merged.close()
sb.log.info(f"合并 {len(pdf_files)} 个PDF → {output_path}")
TOP 7:OCR图片文字识别
🔍 发票、证件、扫描件的数字化提取
python
def batch_ocr_recognition(image_folder, output_excel):
"""批量OCR识别"""
import os
results = []
images = [f for f in os.listdir(image_folder) if f.lower().endswith(('.jpg', '.png', '.pdf'))]
for image_file in images:
image_path = os.path.join(image_folder, image_file)
# 使用影刀内置OCR
text = sb.ocr.recognize(image_path)
results.append({
"文件名": image_file,
"识别内容": text,
"字数": len(text),
})
sb.log.info(f"OCR完成:{image_file}({len(text)}字)")
sb.excel.write_rows(output_excel, results)
return results
batch_ocr_recognition("C:/发票/", "发票识别结果.xlsx")
TOP 8:数据库自动操作
🗄️ SQLite/MySQL的数据读写与维护

python
import sqlite3
from contextlib import contextmanager
@contextmanager
def get_db_connection(db_path):
conn = sqlite3.connect(db_path)
conn.row_factory = sqlite3.Row
try:
yield conn
conn.commit()
except Exception:
conn.rollback()
raise
finally:
conn.close()
def batch_upsert(db_path, table, records, key_fields):
"""批量更新或插入数据"""
if not records:
return 0
fields = list(records[0].keys())
placeholders = ", ".join(["?" for _ in fields])
field_names = ", ".join(fields)
update_clause = ", ".join([
f"{f} = excluded.{f}"
for f in fields if f not in key_fields
])
sql = f"""
INSERT INTO {table} ({field_names})
VALUES ({placeholders})
ON CONFLICT({", ".join(key_fields)})
DO UPDATE SET {update_clause}
"""
with get_db_connection(db_path) as conn:
conn.executemany(sql, [list(r.values()) for r in records])
sb.log.info(f"批量Upsert完成:{len(records)} 条")
return len(records)
TOP 9:文件自动整理归档
📁 桌面/下载文件夹的智能整理
python
import os, shutil
from datetime import datetime
def smart_file_organizer(source_dir, archive_base):
"""智能文件归档"""
extension_map = {
'.pdf': '文档/PDF',
'.docx': '文档/Word',
'.xlsx': '文档/Excel',
'.pptx': '文档/PPT',
'.jpg': '图片',
'.png': '图片',
'.mp4': '视频',
'.mp3': '音频',
'.zip': '压缩包',
}
moved = []
for filename in os.listdir(source_dir):
filepath = os.path.join(source_dir, filename)
if not os.path.isfile(filepath):
continue
ext = os.path.splitext(filename)[1].lower()
category = extension_map.get(ext, '其他')
# 按年月子目录
month_str = datetime.now().strftime("%Y%m")
dest_dir = os.path.join(archive_base, category, month_str)
os.makedirs(dest_dir, exist_ok=True)
dest_path = os.path.join(dest_dir, filename)
# 处理重名
if os.path.exists(dest_path):
name, ext2 = os.path.splitext(filename)
dest_path = os.path.join(dest_dir, f"{name}_{datetime.now().strftime('%H%M%S')}{ext2}")
shutil.move(filepath, dest_path)
moved.append({"原路径": filepath, "新路径": dest_path})
sb.log.info(f"文件整理完成:移动 {len(moved)} 个文件")
return moved
在这里插入图片描述
TOP 10:异常监控与自动恢复
video(video-CHYevVDn-1782424997969)(type-csdn)(url-[live.csdn.net/v/embed/524...](https://link.juejin.cn?target=https%3A%2F%2Flive.csdn.net%2Fv%2Fembed%2F524992)(image-https%3A%2F%2Fi-blog.csdnimg.cn%2Fimg_convert%2Ffe264a0ef04b2df03c8adfcf0e76df6c.jpeg)(title-temu%25E5%25BA%2597%25E7%25BE%25A4%25E8%2587%25AA%25E5%258A%25A8%25E5%258C%2596%25E6%258A%25A5%25E6%25B4%25BB%25E5%258A%25A8%25E6%25A1%2588%25E4%25BE%258B "https://live.csdn.net/v/embed/524992)(image-https://i-blog.csdnimg.cn/img_convert/fe264a0ef04b2df03c8adfcf0e76df6c.jpeg)(title-temu%E5%BA%97%E7%BE%A4%E8%87%AA%E5%8A%A8%E5%8C%96%E6%8A%A5%E6%B4%BB%E5%8A%A8%E6%A1%88%E4%BE%8B"))
🔧 让流程更健壮的容错机制
python
import functools
import time
def retry_on_exception(max_retries=3, delay=2, exceptions=(Exception,)):
"""重试装饰器"""
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
last_exception = None
for attempt in range(max_retries + 1):
try:
return func(*args, **kwargs)
except exceptions as e:
last_exception = e
if attempt < max_retries:
sb.log.warning(f"第{attempt+1}次失败,{delay}秒后重试:{e}")
time.sleep(delay * (2 ** attempt)) # 指数退避
else:
sb.log.error(f"已重试{max_retries}次,最终失败:{e}")
raise last_exception
return wrapper
return decorator
@retry_on_exception(max_retries=3, delay=5)
def fetch_data_with_retry(url):
page = sb.browser.get_page(url)
return page.get_table_data(".data-table")
TOP 11-20:速查清单
| # | 场景 | 核心技术 | 适用行业 |
|---|---|---|---|
| 11 | 自动登录管理 | Cookie持久化 + 二次验证 | 全行业 |
| 12 | 定时任务调度 | schedule/APScheduler | 全行业 |
| 13 | 多浏览器标签操作 | 多Tab切换 + iframe穿透 | 电商/金融 |
| 14 | 键鼠精准控制 | pyautogui + win32api | 桌面应用 |
| 15 | 图片批处理 | Pillow 压缩/水印/格式转换 | 电商/媒体 |
| 16 | 反爬虫应对 | 随机UA/IP/等待时间 | 数据采集 |
| 17 | 子流程模块化 | 函数封装 + 参数化 | 全行业 |
| 18 | 日志监控告警 | 结构化JSON日志 + 实时告警 | 企业运维 |
| 19 | 多账号轮换 | Cookie池 + 状态机管理 | 电商/运营 |
| 20 | 版本控制部署 | Git + 环境配置分离 | 全行业 |
自动化成熟度模型
markdown
Level 0:手工操作(0%自动化)
↓
Level 1:工具辅助(Excel宏、批处理脚本)
↓
Level 2:单点自动化(解决特定重复任务)
↓ ← 大多数读者入门后的位置
Level 3:流程自动化(端到端流程串联)
↓
Level 4:智能自动化(加入AI判断和异常处理)
↓
Level 5:自适应自动化(系统能自我优化和扩展)
从Level 2到Level 3是最关键的跨越,需要:
- 系统思维:把点连成线
- 异常处理:考虑所有边界情况
- 监控能力:知道流程是否正常运行

写给读者的话
200篇文章,是一段持续的探索旅程。
RPA自动化的本质,不是用技术替代人,而是用技术释放人的创造力------把重复的、规则明确的工作交给机器,让人专注于需要判断力和创意的事情。
影刀RPA提供了一个门槛很低的入口:不需要深厚的编程背景,只要愿意花时间了解自己的业务流程,就能用它创造价值。
感谢每一位读者的陪伴,接下来会有更多精彩内容等着大家。

作者:林焱 | 转载请注明出处