1. 项目概述一个面向办公场景的开源RPA工具最近在GitHub上闲逛发现了一个挺有意思的项目叫openclaw-office。光看名字可能有点摸不着头脑但点进去一看好家伙这玩意儿定位是“开源办公自动化机器人流程自动化RPA工具”。说白了就是帮你用代码模拟人手去操作电脑上的各种办公软件比如Excel、Word、浏览器网页、桌面应用等等把那些重复、枯燥的“搬砖”活儿给自动化掉。我干了这么多年开发也带过不少项目深知办公室里那些“表哥表姐”们的痛。每天花几个小时在Excel里复制粘贴、核对数据、生成报表或者在OA系统里点来点去走流程效率低不说还容易出错人也被搞得筋疲力尽。市面上的商业RPA软件比如UiPath、Blue Prism这些功能是强大但价格不菲对中小企业或者个人开发者来说门槛太高。而且商业软件往往是个“黑盒”你想深度定制或者集成到自己的系统里限制很多。openclaw-office的出现正好填补了这个空白。它开源、免费意味着你可以完全掌控代码根据自己的需求进行二次开发。它的目标很明确聚焦于办公场景提供一套简单、易用、可扩展的自动化组件库。对于有一定编程基础比如会点Python的办公人员、数据分析师或者想为团队提效的开发人员来说这无疑是个福音。你可以把它看作是一套“乐高积木”提供了各种基础的操作模块比如点击、输入、读取数据然后你可以用Python脚本把这些模块组合起来搭建出属于自己的自动化工作流。这个项目的核心价值我认为在于“降本增效”和“技术民主化”。它降低了自动化技术的使用门槛让非专业开发者也能享受到技术带来的便利。接下来我就结合自己多年的项目经验和自动化实践来深度拆解一下这个项目看看它到底是怎么玩的能解决哪些实际问题以及在实际使用中需要注意哪些坑。2. 核心架构与设计思路拆解2.1 为什么选择“图像识别”与“UI自动化”双引擎打开openclaw-office的文档或代码你会发现它的核心技术栈主要围绕两个核心图像识别和UI元素识别。这是RPA工具的两种主流交互方式openclaw-office选择两者兼备背后有很深的考量。图像识别简单说就是“让电脑看图做事”。它通过截图然后在一张图片里寻找另一张小图片模板的位置。这种方式最大的优点是通用性强。无论你要操作的是古老的桌面客户端、基于特定框架开发的软件还是游戏界面只要屏幕上能显示出来理论上都能被识别和操作。openclaw-office底层很可能集成了像OpenCV这样的开源计算机视觉库来实现模板匹配。但图像识别的缺点也很明显稳定性受环境影响大。屏幕分辨率变化、界面主题更换、窗口位置移动、甚至光线明暗导致的颜色细微差异都可能导致匹配失败。而且纯图像识别无法“理解”界面结构比如它不知道某个按钮旁边有个输入框。UI元素识别则更进一步。它通过访问操作系统或应用程序提供的可访问性接口如Windows的UI Automation macOS的Accessibility API直接获取界面控件的树状结构信息包括控件的类型按钮、文本框、名称、位置等。这种方式精准、稳定、速度快。因为它直接与控件交互不依赖视觉特征。例如它可以准确地点中一个名为“提交”的按钮无论这个按钮在屏幕的哪个角落。openclaw-office同时支持这两种模式形成了一个非常实用的“组合拳”策略首选UI元素识别对于标准化的、支持可访问性接口的现代软件如Windows原生程序、Java Swing/SWT、.NET WPF/WinForms、浏览器中的标准HTML元素优先使用UI自动化稳定可靠。图像识别作为兜底对于那些老旧、定制化、或者不支持标准接口的“顽固”软件如一些工业控制软件、特定行业的专有客户端则使用图像识别来突破。虽然稳定性稍差但至少提供了自动化的可能性。这种设计思路体现了一个成熟工具的务实性不追求理论上最完美的单一方案而是提供多种工具让使用者根据实际场景选择最合适的“钥匙”。2.2 模块化与插件化设计如何实现灵活扩展一个好的开源项目尤其是工具类项目其生命力很大程度上取决于它的可扩展性。openclaw-office采用了清晰的模块化与插件化设计。从项目结构看它通常会包含以下几个核心模块核心引擎负责调度、流程控制、异常处理、日志记录等基础框架功能。操作器封装了具体的自动化操作如ClickOperator点击、InputOperator输入、ScreenshotOperator截图、ReadTextOperator读取文本等。每个操作器可能同时支持图像和UI两种模式。识别器专门负责“找东西”。ImageRecognizer处理图像匹配UIRecognizer处理UI元素查找。它们为操作器提供目标位置信息。适配器这是插件化思想的核心。针对不同的应用或平台提供专门的适配器。比如ChromeAdapter用于控制Chrome浏览器ExcelAdapter用于操作Excel文件WindowsApplicationAdapter用于操作普通的Windows桌面程序。用户也可以自己编写适配器来支持新的软件。这种架构带来的好处是职责清晰每个模块只做一件事代码易于理解和维护。易于扩展当需要支持一款新软件比如一个内部开发的ERP系统时你不需要修改核心引擎只需要为这个ERP系统编写一个特定的适配器实现其控件的识别和操作逻辑即可。灵活组合你可以像搭积木一样在Python脚本中导入需要的操作器和适配器快速编排出一个自动化流程。实操心得在评估一个自动化工具时一定要看它的扩展机制是否友好。openclaw-office这种基于Python的插件化设计对于开发者来说非常友好。你可以直接继承基类重写关键方法就能接入几乎任何软件。相比之下一些闭源RPA工具虽然提供了录制功能但遇到录制不了的情况自定义开发往往非常困难。3. 核心功能与实操要点解析3.1 基础操作从“点击”和“输入”说起任何自动化流程都始于最基础的操作。openclaw-office提供的基础操作器是构建复杂流程的基石。我们以最常用的“点击”和“输入”为例看看里面有哪些门道。点击操作看似简单但要做到“稳、准、狠”并不容易。定位策略这是关键。你可以通过图像模板定位也可以通过UI元素的属性如name登录按钮,automation_idbtnSubmit来定位。UI定位的优先级更高。点击前等待自动化脚本运行速度很快但软件界面响应可能需要时间。直接定位后立即点击很可能因为元素尚未加载而失败。因此操作前必须加入显式等待。openclaw-office应该提供了类似wait_for_element的函数或者你在脚本中需要手动使用time.sleep()不推荐或更智能的轮询等待。点击方式是左键单击、双击还是右键是否需要配合Ctrl或Shift键这些都需要在操作器中有对应的参数可以配置。容错与重试一次点击失败就宣告流程崩溃那这个工具就太脆弱了。好的设计应该支持重试机制。比如点击失败后等待片刻重新尝试定位和点击最多重试3次。输入操作不仅仅是发送键盘按键。清空原有内容在往输入框里填内容之前一个好的实践是先全选CtrlA然后删除确保输入框是空的。特别是对于非标准的控件直接设置value属性可能不生效模拟键盘操作更可靠。处理特殊内容输入的内容可能包含换行符\n、制表符\t甚至是中文、emoji。需要确保操作器能正确编码和发送这些字符。粘贴大段文本对于大段文本模拟键盘逐字输入效率极低且容易出错。更优的方案是先将文本复制到系统剪贴板然后在目标输入框执行粘贴操作CtrlV。openclaw-office可能提供了input_text_by_paste这样的高级方法。注意事项在实际编写点击和输入脚本时绝对不要使用基于绝对坐标的点击比如click(100, 200)。只要窗口位置一变脚本就失效了。必须坚持使用基于元素或图像的相对定位。这是RPA脚本稳定性的第一原则。3.2 数据处理连接Excel与数据库的桥梁办公自动化的核心价值之一是处理数据。openclaw-office通常不会自己再造一个数据处理引擎而是充当“搬运工”和“触发器”与专业的数据处理工具如Pandas, OpenPyXL或数据库驱动如sqlite3,pymysql协同工作。一个典型的数据处理流程如下数据获取使用openclaw-office打开某个ERP系统或网页将需要的数据“抓取”下来。这可能通过读取网页表格、识别屏幕上的文本OCR技术或直接导出报表文件来完成。数据中转将抓取到的原始数据写入一个中间载体最常见的就是Excel文件或CSV文件。openclaw-office可以调用Python的pandas库将数据整理成DataFrame然后轻松写入Excel。import pandas as pd # 假设 data_list 是从网页抓取到的数据 df pd.DataFrame(data_list, columns[姓名, 部门, 销售额]) df.to_excel(raw_data.xlsx, indexFalse)数据加工在Python脚本中你可以利用pandas进行复杂的清洗、计算、分析。比如分组汇总、数据透视、异常值过滤等。这部分完全由Python强大的数据科学生态支撑。数据回填将处理好的结果再通过openclaw-office自动填写到目标系统中。例如将计算好的月度报表数据自动填入财务系统的申报页面。在这个过程中openclaw-office的核心作用是自动化交互而繁重的数据计算则交给pandas等专业库。这种分工使得整个方案既灵活又强大。3.3 流程控制与异常处理让脚本真正“无人值守”一个只能在你眼皮底下完美运行一出错就卡死的脚本是没有实用价值的。真正的生产级自动化脚本必须具备完善的流程控制和异常处理能力。流程控制主要包括条件分支根据上一步的结果决定下一步的走向。例如如果登录成功则执行数据抓取如果登录失败则发送警报邮件并停止。循环操作处理列表数据、翻页查询等场景。例如循环读取Excel中的每一行作为查询条件去系统中搜索。子流程封装将一些通用的操作序列如登录系统、打开某个菜单封装成函数或独立的流程文件便于复用和维护。异常处理则是脚本健壮性的生命线。你需要预判所有可能出错的地方元素查找失败这是最常见的异常。处理方式不是简单try...except然后跳过而应该记录详细的错误日志包括当时的屏幕截图并根据错误类型决定重试、跳过当前项还是终止整个流程。网络或应用超时操作网页或客户端时网络延迟或程序无响应会导致操作超时。必须设置合理的超时时间并在超时后执行恢复操作如刷新页面、重启应用。业务逻辑异常例如填表时提示“身份证号已存在”。这类错误需要从程序返回的信息或识别屏幕上的提示文本来捕获并转入相应的处理分支如跳过该条记录或记录冲突信息。一个健壮的脚本结构应该类似这样def main_workflow(): init_logger() # 初始化日志 try: login() # 登录 navigate_to_target_page() # 导航到目标页面 data_list fetch_data() # 获取数据 processed_data process_data_with_pandas(data_list) # 处理数据 write_back_to_system(processed_data) # 回写系统 log.info(流程执行成功) except ElementNotFoundError as e: log.error(f元素查找失败{e} 已截图。) send_alert_email(自动化脚本异常-元素丢失, str(e)) raise # 或执行其他恢复逻辑 except TimeoutError as e: log.error(f操作超时{e}) # 尝试恢复如重启应用 restart_application() # 可以选择重试主流程或退出 except BusinessRuleError as e: log.warning(f业务规则冲突{e} 已记录。) # 继续执行下一条记录 except Exception as e: log.critical(f发生未预料的异常{e}, exc_infoTrue) send_alert_email(自动化脚本严重异常, traceback.format_exc()) raise finally: cleanup() # 清理临时文件、关闭连接等4. 实战构建一个网页数据抓取与Excel报表生成机器人光说不练假把式。我们用一个完整的实战案例串联起openclaw-office的核心功能。假设场景是每天需要从公司内部的一个Web版销售数据看板上抓取各区域的当日销售额自动整理后生成一份格式规范的Excel日报并邮件发送给相关负责人。4.1 环境准备与依赖安装首先你需要一个Python环境建议3.8以上。然后安装openclaw-office及其依赖。由于是开源项目通常可以通过pip从GitHub直接安装或者克隆源码安装。# 假设项目已发布到PyPI pip install openclaw-office # 或者从GitHub安装最新开发版 pip install githttps://github.com/openclaw-office/openclaw-office.git此外我们还需要数据处理和邮件相关的库pip install pandas openpyxl # 用于处理Excel pip install pillow # 图像处理如果用到高级截图 # 邮件发送库根据需求选择 pip install yagmail # 一个非常简单的发邮件库 # 或 pip install zmail4.2 脚本编写分步拆解与代码实现我们的脚本sales_daily_report.py将分为以下几个步骤步骤1导入与初始化import time import pandas as pd from datetime import datetime import yagmail from openclaw import Browser, ImageRecognizer, UIRecognizer # 假设 openclaw 提供了这些核心类 # 初始化浏览器控制器这里以Chrome为例实际使用需查看openclaw的API browser Browser(browser_typechrome, headlessFalse) # 初期调试建议非无头模式 # 初始化识别器 img_recog ImageRecognizer() ui_recog UIRecognizer() # 配置信息 LOGIN_URL https://internal.company.com/sales_dashboard USERNAME your_username PASSWORD your_password # 强烈建议从环境变量或配置文件中读取不要硬编码 EXPORT_PATH f./sales_report_{datetime.now().strftime(%Y%m%d)}.xlsx重要提示密码等敏感信息切勿直接写在代码里应使用环境变量os.getenv或专门的配置文件如.env文件配合python-dotenv库。步骤2登录与导航def login_and_navigate(): 登录到数据看板并导航到目标标签页 browser.open(LOGIN_URL) time.sleep(2) # 等待页面加载更好的做法是使用 browser.wait_for_element # 方式一使用UI元素识别定位更稳定 try: username_input ui_recog.find_element(browser, nameusername, typeedit) username_input.set_text(USERNAME) password_input ui_recog.find_element(browser, namepassword, typeedit) password_input.set_text(PASSWORD) login_button ui_recog.find_element(browser, name登录, typebutton) login_button.click() except Exception as e: # 方式二如果UI识别失败尝试图像识别作为备选 print(fUI识别登录元素失败尝试图像识别: {e}) username_img_pos img_recog.find_template(template_username.png) browser.click(username_img_pos) browser.type(USERNAME) # ... 类似地处理密码和登录按钮 # 等待登录成功例如等待某个代表登录成功的元素出现 browser.wait_for_element(ui_recog, namedashboard_title, timeout10) print(登录成功。) # 点击切换到“区域日报”标签页 daily_tab ui_recog.find_element(browser, name区域日报, typetab) daily_tab.click() time.sleep(1) # 等待数据加载步骤3数据抓取与解析这是核心步骤。假设数据在一个HTML表格里。def fetch_sales_data(): 从页面表格中抓取销售数据 # 首先找到数据表格。可能需要滚动到特定位置。 # 假设表格有一个固定的ID或名称 data_table ui_recog.find_element(browser, automation_idsalesDataTable) # 方案A如果openclaw支持直接获取表格HTML或数据 # table_html data_table.get_property(innerHTML) # 然后用pandas的read_html解析简单但依赖页面结构稳定 # dfs pd.read_html(table_html) # sales_df dfs[0] # 方案B更稳健的方案模拟人工逐行读取 # 1. 获取表格行数 rows data_table.find_elements(ui_recog, typedataitem) # 假设行元素类型 data_list [] for row in rows: # 2. 在每一行中查找单元格 cells row.find_elements(ui_recog, typecell) if len(cells) 4: # 假设有4列区域、销售额、订单数、完成率 region cells[0].get_text() sales cells[1].get_text().replace(,, ).replace(¥, ) # 清洗数据 orders cells[2].get_text() rate cells[3].get_text().replace(%, ) data_list.append([region, float(sales), int(orders), float(rate)/100]) sales_df pd.DataFrame(data_list, columns[区域, 销售额, 订单数, 完成率]) print(f抓取到 {len(sales_df)} 条数据。) return sales_df实操心得网页数据抓取是最容易出问题的环节。页面结构一变脚本就失效。因此定位元素时要尽量选择那些稳定、唯一的属性如id、>def generate_excel_report(df): 对数据进行汇总并生成格式化的Excel报表 # 1. 数据计算例如增加一列“平均单额” df[平均单额] df[销售额] / df[订单数] df[平均单额] df[平均单额].round(2) # 2. 按销售额排序 df_sorted df.sort_values(by销售额, ascendingFalse).reset_index(dropTrue) # 3. 使用Pandas的ExcelWriter配合openpyxl进行高级格式化 with pd.ExcelWriter(EXPORT_PATH, engineopenpyxl) as writer: df_sorted.to_excel(writer, sheet_name区域明细, indexFalse) worksheet writer.sheets[区域明细] # 设置列宽openpyxl操作 from openpyxl.utils import get_column_letter for i, column in enumerate(df_sorted.columns, 1): column_letter get_column_letter(i) # 根据列名粗略设置宽度 if column in [区域]: worksheet.column_dimensions[column_letter].width 15 else: worksheet.column_dimensions[column_letter].width 12 # 增加一个汇总行 total_row [总计, df_sorted[销售额].sum(), df_sorted[订单数].sum(), df_sorted[完成率].mean(), df_sorted[平均单额].mean()] summary_df pd.DataFrame([total_row], columnsdf_sorted.columns) summary_df.to_excel(writer, sheet_name汇总, indexFalse) print(fExcel报表已生成{EXPORT_PATH}) return EXPORT_PATH步骤5邮件发送与收尾def send_email_report(file_path): 将生成的Excel报表通过邮件发送 # 配置发件人以yagmail为例需要提前配置授权码 # 更安全的方式是从环境变量读取邮箱和授权码 sender_email os.getenv(REPORT_EMAIL) sender_password os.getenv(EMAIL_PASSWORD) # 注意是授权码非登录密码 receiver_emails [manager1company.com, manager2company.com] subject f销售日报 - {datetime.now().strftime(%Y-%m-%d)} contents [ 各位负责人您好, 附件是今日的销售区域日报请查收。, 本邮件由自动化机器人发送请勿直接回复。 ] try: yag yagmail.SMTP(usersender_email, passwordsender_password, hostsmtp.163.com) # 以163为例 yag.send(toreceiver_emails, subjectsubject, contentscontents, attachmentsfile_path) print(日报邮件发送成功) except Exception as e: print(f邮件发送失败{e}) # 这里应该记录日志甚至触发其他报警机制 def main(): 主流程 try: login_and_navigate() sales_df fetch_sales_data() if sales_df.empty: print(未抓取到数据流程终止。) return report_path generate_excel_report(sales_df) send_email_report(report_path) print(自动化日报任务执行完毕。) except Exception as e: print(f流程执行出现严重错误{e}) # 可以在这里加入错误截图和更详细的日志 browser.save_screenshot(error_screenshot.png) # 发送错误报警邮件... finally: browser.close() # 确保关闭浏览器释放资源 if __name__ __main__: main()4.3 部署与定时执行脚本写好了总不能每天手动去运行。我们需要让它定时自动执行。方案一Windows任务计划程序适合Windows服务器/PC创建一个批处理文件run_report.bat:echo off D:\path\to\your\python.exe D:\path\to\your\sales_daily_report.py pause打开“任务计划程序”创建基本任务。设置触发器为“每天”上午9点。操作为“启动程序”选择上面的.bat文件。在“条件”选项卡可以取消“只有在计算机使用交流电源时才启动此任务”如果是在服务器上。方案二Linux/Mac的Cron Job在终端执行crontab -e添加一行0 9 * * * /usr/bin/python3 /home/user/projects/sales_daily_report.py /home/user/logs/report.log 21这表示每天9点执行并将所有输出包括错误重定向到日志文件。方案三使用更专业的任务调度平台对于更复杂、要求更高的生产环境可以考虑使用Apache Airflow功能强大的工作流调度平台可以可视化地管理、监控你的自动化任务。Celery with Beat如果你的应用本身就是基于Python的可以使用Celery的定时任务功能。Jenkins经典的CI/CD工具其定时构建功能也可以用来调度Python脚本。注意事项部署自动化脚本的机器需要保持稳定运行并且屏幕不能锁屏如果使用非无头模式的浏览器。对于Windows可以设置“永不睡眠”和“永不关闭显示器”。更好的做法是在脚本中使用浏览器的无头模式这样无需图形界面更适合服务器环境。将之前初始化浏览器的代码改为Browser(browser_typechrome, headlessTrue)。但要注意有些复杂的网页在无头模式下可能行为异常需要充分测试。5. 常见问题排查与性能优化技巧5.1 元素定位失败问题根源与排查流程这是使用openclaw-office或任何UI自动化工具时最常遇到的问题没有之一。当你的脚本报错“找不到元素”时不要慌张按照以下步骤系统排查确认页面是否加载完成这是最常见的原因。脚本执行速度远快于网络和浏览器渲染。在操作元素前必须加入等待。强制等待time.sleep(5)。简单粗暴但效率低下且时间难以把握。不推荐作为主要手段。隐式等待设置一个全局的等待时间让查找元素的操作在指定时间内轮询查找。browser.set_implicit_wait(10)。比强制等待好但不够灵活。显式等待推荐针对某个特定条件进行等待条件满足后才继续。这是最可靠的方式。虽然openclaw-office可能封装了相关方法但原理是等待某个元素出现、可点击或可见。# 伪代码展示思想 def wait_for_element(recognizer, locator, timeout30): start_time time.time() while time.time() - start_time timeout: try: element recognizer.find_element(locator) if element.is_displayed() and element.is_enabled(): return element except: pass time.sleep(0.5) raise TimeoutError(f等待元素超时: {locator})检查定位器是否准确定位器如namesubmitBtn写错了或者页面元素属性动态变化了。使用开发者工具复查打开浏览器的开发者工具F12使用元素选择器箭头图标点击目标元素查看其HTML属性。确认你使用的id、name、class是否唯一且稳定。避免使用绝对路径和索引如//div[3]/table[2]/tbody/tr[5]/td[1]这种XPath极其脆弱页面结构微调就会失效。尽量使用相对路径和属性组合如//button[idsubmit and text()确认]。应对动态ID如果元素的id或class每次刷新都变如idbutton-12345尝试寻找其他不变属性如># 伪代码 iframe browser.find_element(ui_recog, tagiframe, idcontentFrame) browser.switch_to_frame(iframe) # 现在可以查找iframe内的元素了 inner_element ui_recog.find_element(browser, nameinnerButton) # 操作完成后切回主文档 browser.switch_to_default_content()页面结构是否已更新这是“脚本昨天还能用今天就不行了”的罪魁祸首。前端发布新版本UI改了。解决办法是更新你的定位器。为了降低维护成本建议将所有的定位器集中管理在一个配置文件中如locators.yaml或locators.py而不是散落在代码各处。这样UI一变你只需要更新这个配置文件。5.2 脚本运行不稳定如何提升健壮性除了定位问题脚本还可能因为各种原因网络波动、弹窗、资源加载慢而随机失败。提升健壮性需要多管齐下增加重试机制对于关键但非幂等的操作如点击提交按钮重试要谨慎。但对于查找元素、获取数据等操作可以加入重试逻辑。def retry_operation(operation, max_retries3, delay2): for attempt in range(max_retries): try: return operation() except Exception as e: if attempt max_retries - 1: raise print(f操作失败第{attempt1}次重试。错误{e}) time.sleep(delay) # 使用 element retry_operation(lambda: ui_recog.find_element(browser, nametarget), max_retries5)异常捕获与恢复如前面流程控制部分所述对不同层级的异常进行精细化捕获和处理并设计恢复路径如刷新页面、重新登录。关键节点截图在流程开始、结束、以及每个重要步骤之后特别是失败时保存屏幕截图。这是事后排查问题的“黑匣子”。详尽的日志记录不要只用print。使用Python的logging模块记录不同级别INFO, DEBUG, WARNING, ERROR的日志包括时间戳、执行步骤、关键数据。这能帮你快速定位问题发生的时间点和上下文。5.3 性能瓶颈分析与优化建议当自动化流程处理大量数据时性能可能成为问题。主要瓶颈和优化方向如下瓶颈环节表现优化策略图像识别匹配速度慢CPU占用高1.缩小搜索区域不要在全屏搜索先定位大致区域。2.使用灰度图匹配颜色不关键时用灰度图模板和截图速度更快。3.调整匹配精度适当降低匹配阈值如从0.95降到0.9但需平衡准确率。4.缓存模板图片避免每次从磁盘重复加载。UI元素遍历查找深层嵌套元素慢1.使用更高效的定位器优先用id其次是name最后才是复杂的XPath。2.减少查找范围从已找到的父元素开始查找子元素而不是每次都从根节点开始。网络与响应等待页面加载时间长1.设置合理超时避免在无响应处空等。2.检查并优化目标网站性能如果可控。3.考虑在非高峰时段运行脚本。数据读写读写大型Excel/数据库慢1.批量操作对于数据库使用executemany对于Excel尽量减少openpyxl的重复读写操作。2.使用更高效的数据结构Pandas的向量化操作比循环快得多。3.考虑使用更快的存储格式如Parquet、Feather处理速度远快于CSV/Excel。流程设计整体运行时间长1.并行处理如果任务间无依赖可使用多线程threading或多进程multiprocessing并行执行。例如同时处理多个独立区域的数据。2.异步操作对于I/O密集型任务如下载文件、等待网络使用异步库如asyncio,aiohttp可以大幅提升吞吐量。一个重要的取舍稳定性 vs. 速度。为了稳定性而加入的等待、重试、截图必然会降低速度。在开发初期应以稳定性为第一目标。当流程稳定后再分析日志找出最耗时的步骤有针对性地进行优化比如减少不必要的等待时间、合并操作步骤等。我个人在长期维护这类自动化脚本中最大的体会是“慢就是快”。与其追求极致的执行速度不如花更多心思在脚本的鲁棒性和可维护性上。一个能稳定运行365天不出错的“慢”脚本其价值远大于一个速度飞快但每周都需要人工干预的“快”脚本。把定位器管理好把异常处理周全把日志打详细这些前期投入会在后期的维护中带来十倍百倍的回报。