一、Python RPA 的三大实现方式
方式 1:使用通用 Python 库组合(最灵活)
这是最基础的方式,通过组合不同功能的库来构建机器人。
# 常用库矩阵
# ├── 控制鼠标键盘:pyautogui, pynput, keyboard
# ├── 浏览器自动化:selenium, playwright
# ├── 桌面应用自动化:pywinauto, uiautomation
# ├── 文件操作:os, shutil, pandas, openpyxl
Python RPA 主要通过通用库组合、专用框架及控制专业工具三种方式实现。文章提供了 Web 自动化、桌面 GUI 自动化及综合办公自动化的实战示例,涵盖 Selenium、pyautogui 等库的使用。同时介绍了完整的项目架构设计、依赖管理、错误处理及图像识别最佳实践,并对比了 Python RPA 与专业 RPA 工具的优劣,为技术人员提供从入门到落地的参考路径。
这是最基础的方式,通过组合不同功能的库来构建机器人。
# 常用库矩阵
# ├── 控制鼠标键盘:pyautogui, pynput, keyboard
# ├── 浏览器自动化:selenium, playwright
# ├── 桌面应用自动化:pywinauto, uiautomation
# ├── 文件操作:os, shutil, pandas, openpyxl
这些框架封装了常见操作,开发效率更高:
许多商业 RPA 工具(如 UiPath)提供 Python SDK 或 API,可以用 Python 脚本扩展其功能。
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import pandas as pd
import time
def web_automation_example():
"""自动登录网站,下载数据,处理并保存"""
# 1. 启动浏览器
driver = webdriver.Chrome()
driver.get("https://example.com/login")
# 2. 自动登录
driver.find_element(By.ID, "username").send_keys("your_username")
driver.find_element(By.ID, "password").send_keys("your_password")
driver.find_element(By.ID, "login-btn").click()
time.sleep(2)
# 3. 导航到数据页面并下载
driver.get("https://example.com/reports")
# 模拟点击下载按钮
driver.find_element(By.XPATH, "//button[contains(text(),'导出')]").click()
time.sleep(3)
# 等待下载完成
# 4. 处理下载的 Excel 文件
df = pd.read_excel("下载的报告.xlsx")
# 数据清洗和分析
processed_data = df.groupby("部门").sum()
processed_data.to_excel("处理后的报告.xlsx")
# 5. 关闭浏览器
driver.quit()
print("任务完成!")
if __name__ == "__main__":
web_automation_example()
import pyautogui
import pywinauto
from pywinauto.application import Application
import time
def desktop_automation_example():
"""自动化 Windows 应用程序操作"""
# 1. 打开记事本(通过 pyautogui 模拟键盘)
pyautogui.hotkey('win', 'r') # Win+R
pyautogui.write('notepad')
pyautogui.press('enter')
time.sleep(1)
# 2. 在记事本中写入内容
pyautogui.write('这是由 Python 机器人自动生成的内容\n')
pyautogui.write(f'当前时间:{time.ctime()}\n')
# 3. 使用 pywinauto 控制应用程序窗口
app = Application(backend="uia").connect(title="无标题 - 记事本")
dlg = app.window(title="无标题 - 记事本")
# 保存文件
dlg.menu_select("文件 (F)->另存为 (A)...")
time.sleep(1)
# 输入文件名
pyautogui.write('auto_generated.txt')
pyautogui.press('enter')
# 4. 关闭应用程序
dlg.close()
# 如果提示保存,选择不保存
try:
app2 = Application(backend="uia").connect(title="记事本")
app2.window(title="记事本").button("不保存 (N)").click()
except:
pass
print("桌面自动化完成!")
if __name__ == "__main__":
desktop_automation_example()
import pandas as pd
import openpyxl
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import os
from datetime import datetime
def office_automation_example():
"""每日数据报告自动化流程"""
# 1. 从多个 Excel 文件合并数据
data_frames = []
for file in os.listdir('销售数据'):
if file.endswith('.xlsx'):
df = pd.read_excel(f'销售数据/{file}')
data_frames.append(df)
# 合并数据
combined_data = pd.concat(data_frames, ignore_index=True)
# 2. 数据分析
daily_summary = {
'日期': datetime.now().strftime('%Y-%m-%d'),
'总销售额': combined_data['销售额'].sum(),
'平均订单额': combined_data['销售额'].mean(),
'订单数量': len(combined_data),
'热门产品': combined_data['产品名称'].mode().iloc[0] if not combined_data.empty else '无数据'
}
# 3. 生成报告
report_df = pd.DataFrame([daily_summary])
report_path = f"日报/销售日报_{datetime.now().strftime('%Y%m%d')}.xlsx"
report_df.to_excel(report_path, index=False)
# 4. 发送邮件报告
send_email_report(report_path, daily_summary)
print(f"日报生成完成:{report_path}")
def send_email_report(report_path, summary):
"""发送邮件"""
# 邮件配置
sender = "[email protected]"
password = "your_password" # 建议使用应用专用密码
receivers = ["[email protected]", "[email protected]"]
# 创建邮件内容
msg = MIMEMultipart()
msg['From'] = sender
msg['To'] = ", ".join(receivers)
msg['Subject'] = f"销售日报 - {summary['日期']}"
# 正文
body = f""" <h2>销售日报摘要</h2>
<p>日期:{summary['日期']}</p>
<p>总销售额:¥{summary['总销售额']:,.2f}</p>
<p>平均订单额:¥{summary['平均订单额']:,.2f}</p>
<p>订单数量:{summary['订单数量']}</p>
<p>热门产品:{summary['热门产品']}</p>
<p>详细报告请查看附件。</p> """
msg.attach(MIMEText(body, 'html'))
# 添加附件
with open(report_path, 'rb') as f:
attachment = MIMEText(f.read(), 'base64', 'utf-8')
attachment["Content-Type"] = 'application/octet-stream'
attachment["Content-Disposition"] = f'attachment; filename="{os.path.basename(report_path)}"'
msg.attach(attachment)
# 发送邮件
try:
server = smtplib.SMTP_SSL('smtp.example.com', 465)
server.login(sender, password)
server.sendmail(sender, receivers, msg.as_string())
server.quit()
print("邮件发送成功!")
except Exception as e:
print(f"邮件发送失败:{e}")
if __name__ == "__main__":
office_automation_example()
rpa_robot/
├── main.py # 主程序入口
├── config/
│ ├── config.yaml # 配置文件
│ └── credentials.py # 敏感信息(如密码)
├── modules/
│ ├── web_automation.py # Web 自动化模块
│ ├── desktop_automation.py # 桌面自动化模块
│ ├── data_processor.py # 数据处理模块
│ └── email_sender.py # 邮件发送模块
├── utils/
│ ├── logger.py # 日志工具
│ ├── scheduler.py # 定时调度器
│ └── error_handler.py # 错误处理
├── data/ # 数据目录
├── logs/ # 日志目录
└── requirements.txt # 依赖包列表
main.py 示例:
import schedule
import time
from modules.web_automation import fetch_data
from modules.data_processor import process_data
from modules.email_sender import send_report
from utils.logger import setup_logger
logger = setup_logger()
def daily_rpa_task():
"""每日自动执行的 RPA 任务"""
try:
logger.info("开始执行每日 RPA 任务")
# 1. 从网站获取数据
raw_data = fetch_data()
# 2. 处理数据
report = process_data(raw_data)
# 3. 发送报告
send_report(report)
logger.info("每日任务执行完成")
except Exception as e:
logger.error(f"任务执行失败:{e}")
# 设置定时任务
schedule.every().day.at("09:00").do(daily_rpa_task)
schedule.every().hour.do(lambda: logger.info("机器人运行中..."))
if __name__ == "__main__":
logger.info("RPA 机器人启动")
# 立即执行一次
daily_rpa_task()
# 保持运行,等待定时任务
while True:
schedule.run_pending()
time.sleep(60) # 每分钟检查一次
# requirements.txt
selenium>=4.0.0
pandas>=1.3.0
openpyxl>=3.0.0
pyautogui>=0.9.0
pywinauto>=0.6.0
schedule>=1.0.0
opencv-python>=4.5.0
requests>=2.25.0
python-dotenv>=0.19.0 # 环境变量管理
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=4, max=10))
def unreliable_operation():
"""带重试机制的操作"""
# 可能会失败的操作
pass
import cv2
import pyautogui
import numpy as np
def find_and_click(image_path, confidence=0.8):
"""在屏幕上查找图像并点击"""
# 截屏
screenshot = pyautogui.screenshot()
screenshot = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)
# 读取模板图像
template = cv2.imread(image_path)
# 模板匹配
result = cv2.matchTemplate(screenshot, template, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
if max_val >= confidence:
# 计算中心点并点击
h, w = template.shape[:2]
center_x = max_loc[0] + w // 2
center_y = max_loc[1] + h // 2
pyautogui.click(center_x, center_y)
return True
return False
# config.yaml
web:
login_url: "https://example.com/login"
username: "robot_user"
timeout: 30
database:
host: "localhost"
port: 3306
name: "rpa_data"
schedule:
daily_report: "09:00"
data_backup: "23:00"
email:
smtp_server: "smtp.gmail.com"
smtp_port: 587
| 方面 | Python RPA | 专业 RPA 工具(如 UiPath) |
|---|---|---|
| 灵活性 | ⭐⭐⭐⭐⭐(无限扩展) | ⭐⭐⭐(受平台限制) |
| 学习曲线 | ⭐⭐⭐(需要编程基础) | ⭐⭐(图形化,较易上手) |
| 开发速度 | ⭐⭐⭐(代码编写) | ⭐⭐⭐⭐⭐(拖拽式) |
| 维护成本 | ⭐⭐(需要程序员) | ⭐⭐⭐(业务人员可维护) |
| 企业级功能 | ⭐⭐(需自行开发) | ⭐⭐⭐⭐⭐(内置) |
| 成本 | ⭐⭐⭐⭐⭐(免费开源) | ⭐⭐(商业授权昂贵) |
对于技术人员,建议从 Python 开始,因为它能让你深入理解 RPA 原理,未来无论是使用专业工具还是自研,都有坚实基础。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online