ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Python RPA快速上手指南:Excel与网页自动化实战

Python RPA快速上手指南:Excel与网页自动化实战 你是不是也遇到过这种情况每天打开电脑先登录好几个后台系统把A系统导出的Excel整理成B系统要的格式再逐个点开网页填数据一套操作下来半小时就没了还总担心哪一步填错。我就是被这种重复劳动折磨多了才决定认真玩一玩Python RPA。当时立下的目标很朴素凡是我每天都要手动重复做的事就想办法用脚本替我干。这篇文章就是一份完整的Python RPA快速上手记录核心围绕两条线展开一是怎么用干净的手段把“桌面操作网页操作Excel处理”串成一条自动化流水线二是从零搭建环境到跑通一个完整案例的全过程包括我踩过的坑和排查问题的思路。如果你是办公族、测试工程师、运维或者刚学Python不久的新手想缓解重复点击、手动整理数据的痛苦这篇文章很适合你。1. 动手之前先想清楚Python RPA到底适合做什么1.1 哪些场景最值得做成自动化RPA全称是Robotic Process Automation中文叫机器人流程自动化说穿了就是让程序模拟人在电脑上的鼠标键盘操作去点按钮、输入文字、复制粘贴、读取表格。但也不是什么活儿都适合交给RPA硬套反而会给自己添堵。我个人总结下来适合用Python RPA做的场景有三个明显特征重复频率高每天、每周都要跑一遍一次流程超过5分钟。规则清晰每一步做什么都是明确的比如“把A列小于0的数值改成0”“点开页面上id为submit的按钮”不需要像人一样做复杂判断。跨系统数据搬运数据在Excel、网页后台、邮件、数据库之间来回复制粘贴没有现成接口只能靠人工当“搬运工”。举个例子我最早做的一个自动化脚本就是每天从公司ERP系统导出一张订单表然后根据地区拆分到不同Sheet最后把汇总数据填到一个网页后台的报表页面里。这个流程我手动做大概要20分钟而且容易在复制粘贴的时候弄错单元格。写成脚本以后每天双击运行全程不到1分钟。反过来有些场景我不建议一上来就做RPA比如界面完全不稳定、每次打开位置都变的古老软件或者操作频率低到一个月才做一次的事情。这类需求往往调试成本比手工操作还高得不偿失。1.2 为什么选择纯Python方案而不是商业RPA工具现在市面上有不少成熟的商业RPA软件比如影刀RPA、金智维RPA、UiPath它们有可视化的界面拖拽组件就能搭流程确实对非程序员很友好。我在做选择的时候也认真对比过这里把我的权衡过程列出来供你参考对比维度商业RPA工具影刀、金智维等纯Python方案上手门槛低拖拽组件即可中等需要会Python基础语法灵活性受限于软件内置组件极高Python库生态几乎覆盖所有场景网页自动化能力强自带浏览器操作组件强Selenium、Playwright很成熟Excel/数据处理一般复杂公式支持有限极强openpyxl、pandas随意处理成本多数按年收费免费全部使用开源库部署与维护依赖客户端软件轻量py文件随处可跑我最后选中了纯Python原因很简单我的需求里Excel数据处理占了很大比重商业RPA工具的表格操作组件处理复杂公式和样式很吃力而用Python写Excel处理逻辑几乎是降维打击。另外Python方案写出来的脚本可以自己掌控每一个细节出了问题直接看代码就能排查不用去猜某个组件为什么不好使。当然如果你完全不会代码也没兴趣学商业RPA工具会是更快的路。但如果愿意在Python上投入一点时间你会获得更强的掌控感和更大的发挥空间这也是RPA工程师招聘时普遍要求Python能力的原因。2. 环境搭建半小时从零跑通第一个脚本2.1 Python安装与版本选择的关键细节工欲善其事必先利其器。Python环境没搭好后面全是坑。这里我把最关键的几个细节说明白。首先是版本选择。目前很多第三方库的最新版已经停止支持Python 3.8以下的版本但太新的版本偶尔也会遇到个别库还没适配的情况。我实测下来Python 3.10或3.11是现阶段生态兼容性最好的稳定版本可以作为首选。安装过程中最容易被忽略的一步是勾选“Add Python to PATH”选项。如果这一步漏了打开命令提示符输入python会提示“python was not found; run without arguments to install from the Microsoft Store”或者“不是内部或外部命令”很多人就是卡在这里。这个选项的作用是把Python的可执行文件路径加入系统环境变量让系统在任意位置都能直接识别python命令。装完以后按WinR输入cmd打开命令提示符依次验证python --version pip --version能正常输出版本号就说明核心环境没问题。如果pip版本太老顺手升级一下python -m pip install --upgrade pip2.2 编辑器选型VSCode配置手记编辑器这块主流的两个选择是VSCode和PyCharm。PyCharm功能全适合写大型项目但启动慢、吃内存。VSCode轻量启动快配合插件以后写Python也很顺手而且社区版完全免费。我日常主力是VSCode配置步骤如下安装VSCode后在扩展商店搜索“Python”安装微软官方发布的Python扩展。按CtrlShiftP打开命令面板输入“Python: Select Interpreter”选择刚才安装的Python 3.10/3.11解释器。建议再装一个“Pylance”扩展提供代码补全和类型提示写起来会顺手很多。一个容易踩的坑是代码在VSCode里运行时提示找不到某个库但在命令行里运行同样的代码却正常。这种问题九成是解释器没选对编辑器还在用默认的全局Python而不是你装依赖的那个环境。每次新开项目第一件事就是检查解释器。2.3 用虚拟环境隔离项目依赖说到Python环境虚拟环境是必须养成的习惯。它的作用很简单每个项目独立一套库互不干扰。如果不隔离容易出现“这个项目需要OpenCV的旧版那个项目需要新版”这种冲突升级一个库把另一个项目搞崩。创建虚拟环境的命令python -m venv rpa_envWindows激活rpa_env\Scripts\activateMac或Linux激活source rpa_env/bin/activate激活以后命令行会出现(rpa_env)前缀之后用pip装的库都会进到这个环境里。后面所有依赖库的安装建议都在这个虚拟环境内进行。这样做还有个额外好处换电脑时用pip freeze导出依赖清单新机器上一句话就能还原整个环境。pip freeze requirements.txt pip install -r requirements.txt3. 核心库选型与实战案例实现3.1 三套核心库的技术分工Python做RPA不需要把市场上所有自动化库都学一遍抓住三套核心库就能覆盖绝大多数场景库名职责定位适用场景openpyxlExcel读写与样式处理批量处理xlsx格式表格、数据清洗、报表生成Selenium浏览器自动化网页登录、填写表单、点击按钮、抓取数据pyautogui桌面级鼠标键盘控制操作没有接口的旧软件、跨程序拖拽复制这三套库各有专攻组合使用就是一套完整的RPA工具链。下面我用两个完整的实战案例展示它们分别是如何工作的以及核心代码长什么样。3.2 实战案例一Excel批量数据处理先看一个我实际写过很多次的需求销售部门每天会发来一份Excel表里面的客户名单有重复金额列有的单元格是文本格式有的又是数字还有空值需要填充。手动清洗费时费力用openpyxl写个脚本几秒钟搞定。假设输入文件是sales_data.xlsx需要做三件事去掉“客户名称”列完全重复的行、把“订单金额”列的文本类型转成数字、把空值填0。import openpyxl from openpyxl.utils import get_column_letter wb openpyxl.load_workbook(sales_data.xlsx) ws wb.active # 先读全部数据到列表方便处理 headers [cell.value for cell in ws[1]] data_rows [] for row in ws.iter_rows(min_row2, values_onlyTrue): data_rows.append(list(row)) # 找到想要的列索引 name_col headers.index(客户名称) amount_col headers.index(订单金额) # 按客户名称去重 seen set() unique_rows [] for row in data_rows: name row[name_col] if name in seen: continue seen.add(name) # 金额转成数字非数字就按0处理 amount row[amount_col] try: row[amount_col] float(amount) except (TypeError, ValueError): row[amount_col] 0.0 unique_rows.append(row) # 写入新的工作簿 new_wb openpyxl.Workbook() new_ws new_wb.active new_ws.append(headers) for row in unique_rows: new_ws.append(row) new_wb.save(sales_data_cleaned.xlsx) print(f处理完成原始数据 {len(data_rows)} 行去重后 {len(unique_rows)} 行)这段代码的核心逻辑很直白先把整个表读到内存然后在内存里去重和清洗最后写新文件。为什么不在原文件上直接改我的经验是尽量保留原始数据清洗逻辑出错了还能重跑改坏了原文件找都找不回来。有几个细节值得注意。iter_rows取出来的行数据是元组没法直接改所以要先转成列表。float(amount)失败说明单元格里可能是“1,200元”这种带格式的文本这时候按0处理或者进一步做清洗取决于业务规则。还有一点如果文件是.xls的老格式openpyxl不支持需要先用Excel另存为.xlsx或者换用xlrd库。3.3 实战案例二网页自动填报处理完表格下一个常见需求是网页自动化。比如把清洗好的订单数据填到一个后台系统的表单里逐个录入。用Selenium实现这个操作的完整思路如下。先安装Selenium库然后根据浏览器下载对应的驱动。Chrome浏览器的话要下载ChromeDriver且版本要和浏览器版本匹配这是新手最容易踩的坑。pip install selenium核心代码片段from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time # 初始化浏览器chrome_options可以加一些运行参数 options webdriver.ChromeOptions() options.add_experimental_option(detach, True) # 让浏览器执行完后不自动关闭 driver webdriver.Chrome(optionsoptions) try: # 打开后台登录页 driver.get(https://example.com/login) # 等待页面元素出现显式等待比sleep靠谱 username_input WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, username)) ) password_input driver.find_element(By.ID, password) login_button driver.find_element(By.ID, login-btn) username_input.send_keys(my_account) password_input.send_keys(my_password) login_button.click() # 等待登录跳转完成 time.sleep(2) # 进入表单页 driver.get(https://example.com/order/create) # 填表单这里data可以从Excel读取 data {order_no: SO20231201, amount: 1500.00, customer: 某公司} for field_id, value in data.items(): element WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, field_id)) ) element.clear() element.send_keys(value) # 提交 driver.find_element(By.ID, submit).click() print(提交成功) finally: # 等3秒看看结果再关闭 time.sleep(3) driver.quit()这里面最值得说的一点是等待方式。很多初学者的代码喜欢到处写time.sleep(5)页面加载慢一点就报错快一点又白等。Selenium的WebDriverWait显式等待是更好的方案指定一个条件比如“id为username的元素出现”最多等10秒如果提前出现就提前往下走。这样既稳又高效。定位元素的方式从优先级看推荐顺序是ID、name、CSS选择器、XPath。ID是最稳定的页面里一般唯一CSS选择器简洁XPath虽然灵活但容易写复杂建议能不用就不用。如果你的目标是更现代、速度更快的方案Playwright也是个好选择它的自动等待机制比Selenium更完善如果你是新项目且没有历史包袱可以直接从Playwright入手。3.4 实操心得脚本设计要提前考虑异常情况写自动化脚本和写普通脚本最大的区别就是你必须假设每一步都可能失败。网页可能临时改版、网络可能超时、Excel可能多了一列这些意外情况如果不在代码里兜底脚本就会在深夜定时任务里静默崩溃第二天早上你才会发现什么都没干。我现在的习惯是给每一步关键操作加上Try/Except至少打印出错误日志和时间点。比如上面的表单填充提交按钮没找到就说明页面结构可能有变化这时候把当前页面截图保存下来人工看一眼就知道发生了什么。Selenium提供截图能力driver.save_screenshot(error_ time.strftime(%Y%m%d_%H%M%S) .png)在异常时保存现场排查问题的效率会翻好几倍。4. 常见问题排查与稳定运行经验4.1 环境与依赖安装报错做Python RPA半年多我把高频报错整理成一个速查表基本覆盖了新手到进阶最常遇到的问题报错信息原因解决办法python was not found; run without arguments to install from the Microsoft Store安装时没勾选Add to PATH或PATH被覆盖重新安装并勾选PATH手动把Python路径加入系统环境变量ModuleNotFoundError: No module named selenium当前环境没安装库或编辑器用的解释器和命令行不一致pip install selenium检查VSCode/PyCharm解释器选择SessionNotCreatedException: This version of ChromeDriver only supports Chrome version xxxChromeDriver版本和浏览器版本不匹配删除旧驱动下载与浏览器大版本一致的ChromeDriverAttributeError: NoneType object has no attribute text元素没找到find_element返回了None检查定位表达式增加等待时间确认页面是否加载完成ElementClickInterceptedException: element click intercepted元素被其他元素遮挡无法点击用JS点击driver.execute_script(arguments[0].click();, element)no such element: Unable to locate element元素定位不到检查是否有iframe有的话先driver.switch_to.frame切换进去4.2 脚本运行时的稳定性问题比环境报错更麻烦的是脚本能跑但偶尔失败。这种问题集中在几个地方iframe问题很多后台系统的页面用了iframe嵌套直接定位元素会失败因为那个元素其实在另一个文档里。处理的办法是先切换进去driver.switch_to.frame(iframe_name_or_id) # 操作完成后再切回默认内容 driver.switch_to.default_content()输入中文乱码或丢字偶尔遇到输入框丢字符尤其是输入中文的时候建议先clear再send_keys如果还不行可以用模拟按键的方式逐字输入。窗口最小化导致点击失效某些浏览器在最小化状态下桌面自动化或者页面交互会出问题。自动化执行期间建议保持远程桌面窗口始终打开或者使用无头模式headless跑纯网页流程。弹窗干扰Chrome偶尔弹出“保存密码”或“翻译此页面”的提示框会遮挡页面元素。可以通过ChromeOptions禁用弹窗options.add_argument(--disable-notifications) options.add_argument(--disable-translate)Excel文件被占用用openpyxl保存文件时如果目标文件正被Excel打开会报PermissionError。脚本里可以先判断文件是否存在并且尝试打开如果失败就提示用户关闭占用文件的程序。这个坑我至少踩过五次后来写了个通用的文件解锁检查函数才消停。4.3 让RPA脚本稳定跑起来的四个建议结合我自己的实际经验最后分享四个让脚本长期稳定运行的建议建议一固定使用物理隔离环境不要频繁升级依赖库版本。RPA脚本跑得好好的千万别手痒痒升级Selenium或者浏览器。浏览器自动更新这个大坑最容易忽略Chrome有时会在你睡大觉时自动更新第二天脚本就突然报驱动版本不匹配。解决思路是关掉浏览器的自动更新或者在启动脚本前加一个驱动版本自检我目前是用后者省心很多。建议二日志一定要写。每一轮关键操作都打印一行带时间戳的日志脚本出了问题才能快速定位。最好写日志文件控制台输出一旦关掉窗口就什么都没了import logging logging.basicConfig( filenamerpa.log, levellogging.INFO, format%(asctime)s %(levelname)s %(message)s, filemodea )建议三失败重试别无限重试。重试机制要有但要设置上限。我一般每步操作重试2次超过就放弃本轮并发送告警通知。重试是指数退避的第一次等1秒第二次等3秒避免在页面卡死时反复轰炸服务器。建议四分步独立一处失败不拖累整体。如果一条流程里要处理多个单据建议把单个单据的操作封装成独立函数某一个失败了不影响其他的继续跑。跑完以后把所有失败的单据统计输出到结果文件里人工只需要处理那几条异常的。5. 进阶拓展从“能用”到“好用”的RPA项目5.1 用配置文件代替硬编码我早期的脚本账号、密码、网址、文件路径全是写在代码里的。自己用还行但一旦要换电脑、换账号或者把脚本分享给同事就得去代码里找半天。“好用”的第一步是把这些变量提取到配置文件里。import configparser config configparser.ConfigParser() config.read(config.ini) website config[default][website] username config[account][username] password config[account][password]对应的config.ini格式[default] website https://example.com/login [account] username my_account password my_password这样一来改配置不用动代码即使交给不懂代码的人也能自己改。对于RPA工程师来说这是一个基本的职业习惯。5.2 让脚本支持定时任务执行写好的脚本如果只能手动双击那还算不上真正的自动化。Windows系统自带“任务计划程序”可以让你的Python脚本在指定时间自动运行。我的做法是新建一个批处理文件比如run_rpa.batcd /d D:\work\rpa_project call rpa_env\Scripts\activate.bat python main.py pause然后在任务计划程序里新增任务触发器选“每天”时间按需设置操作选择运行这个bat文件。这里有个容易忽略的坑默认情况下任务计划程序启动的Python进程工作目录可能不对所以批处理里先cd到脚本目录避免找不到相对路径的文件。如果要更精细的分时、多任务编排也可以考虑用Python的schedule库写定时逻辑但对大多数办公场景来说系统自带的计划任务已经够用稳定性也足够好。5.3 与Web API结合处理复杂流程有些时候RPA不是唯一的解法比RPA更稳的方案是直接调用系统后端的API。接口调用比界面点击稳定得多速度也快。我现在的习惯是优先看这个系统有没有开放API如果有优先用API只能操作界面的时候才上RPA。我做过一个项目数据同步业务原本RPA要从A系统的网页上逐条抓取记录再填到B系统。后面发现A系统有个内部接口登录后直接用requests模拟请求就能拿到JSON数据比Selenium解析网页快且稳得多。这个思路也说明做RPA不能只盯着界面自动化掌握点HTTP请求和数据解析能力往往能达到事半功倍的效果。6. 写在最后的一点个人经验做了这么久Python RPA我的最大体会是自动化不是把一堆技术名词堆在一起而是耐心观察你每天的工作找出那些重复到让人麻木的环节然后一项项消灭掉。不要一上来就想做一个“全自动无人值守平台”可以先从单个小脚本开始写一个能帮你合并Excel的再写一个能自动登录网页的。每解决一个小痛点你对这套技术栈的理解就会深一层后面做复杂项目时心里也更有底。另外RPA脚本本质上是一个“银弹陷阱”——它解决你眼前的重复劳动但它本身也需要不断维护。网页改版了、系统位置变了、Excel格式换了一版脚本都可能跟着调整。所以设计的时候尽量把参数外置、把异常兜住、把日志写好这些功夫花在前面后面会省下无数个被电话叫起来修脚本的清晨。如果你正在被重复的办公流程折磨不妨照着这篇文章开始折腾先做一个属于你自己的“小机器人”。我第一次看到脚本自己打开网页、填好表单、点击提交的时候那种成就感确实很上头。下一个要自动化的流程我建议就从你最不想做的那件事开始。
返回列表