
影刀RPA高级认证考试到了第二题难度明显上了一个台阶。这道使用影刀RPA内置包和XPath获取数据获取数据写入目标MySQL的题目其实把RPA从业者日常最常用的三样能力全串起来了网页元素定位、数据处理、数据库持久化。很多人在基础阶段习惯了拖拽点击元素获取文本这些现成指令一碰到要自己写Python、自己连数据库就开始发怵。这篇文章就以我的实际操作过程为线索把这道题拆开揉碎了讲清楚从XPath定位到内置包执行Python脚本再到pymysql写入MySQL每一步都会展开说原理、给完整代码、列避坑点。适合准备影刀高级操作验证的开发者、想用RPA做数据采集和报表自动化的朋友参考。1. 先从题目拆解说起为什么这道题算高级1.1 高级题和普通题的分水岭在哪里影刀RPA的入门操作基本都是靠指令块拖拽完成的比如打开网页点击元素获取文本这些指令把底层细节都封装好了使用者不太需要关心浏览器DOM结构、不需要写代码。但高级操作题突然变了风格它要求你“使用内置包”去实现功能。这里的内置包本质上就是影刀RPA内置的Python执行环境说白了就是允许你在流程里插入真正的Python代码。这一下就把门槛抬起来了你得懂一点Python语法得知道怎么用第三方库还得明白数据在RPA流程里是怎么传递的。普通指令是傻瓜式操作高级题则要求你理解自动化流程的本质是数据处理管道这件事——从网页上抓到的原始文本只是原料经过清洗、转换、结构化成表格数据最后落到数据库里给下游系统用这才叫完整的自动化。1.2 题目背后真正的三个考点表面上看这道题只是“拿数据写库”但仔细拆解会发现它同时考察了三个独立能力第一个考点是XPath定位。RPA操作网页最怕什么最怕选择器失效。页面一改版、class一变流程就崩了。XPath因为是按XML文档路径来定位元素支持文本匹配、模糊匹配、层级关系定位抗页面结构变化的能力明显优于固定CSS选择器。这道题用XPath就是想考察你会不会用路径表达式精确锁定目标元素。第二个考点是内置包的使用。影刀里的执行Python代码指令就是内置包的入口。真正实用的RPA流程几乎都离不开Python代码做数据清洗、逻辑判断、调用第三方库。这道题要求你把网页抓到的数据用Python接住说明它考察的不只是抓还有处理。第三个考点是MySQL写入。数据落到数据库不能只靠Print日志验证结果。这道题要求下载的MySQL写入考察的其实是你会不会建库建表、会不会用Python连数据库、会不会处理编码和数据类型问题。很多人在这一步栽跟头不是XPath抓不到数据而是pymysql连不上、中文乱码、字段类型不匹配一连串问题等着你。1.3 前置条件本地MySQL环境要先备好做这道题之前电脑上必须已经装好了MySQL服务端。我推荐用MySQL 8.x版本命令行能执行mysql -u root -p进入就算装好了。如果还没装可以到MySQL官网下载对应系统的安装包装的时候选Server only就行开发用途不需要装那么多附加组件。另外强烈建议顺带装个Navicat或MySQL Workbench这类图形工具调试数据时能省不少时间。2. 环境和准备先把地基铺好2.1 影刀侧的运行环境确认我用的影刀版本是当前最新版做高级操作题建议先把影刀升级到最新避免旧版本内置包指令位置不一样。打开影刀客户端在流程指令列表里找到执行Python代码确认能拖出来使用另外也要确认左下角的扩展中心里Python相关扩展已启用。第一次用内置包执行Python时有个容易忽略的点影刀内置的Python解释器和你本机命令行里的python不一定是同一个环境。也就是说你在cmd里pip install pymysql装好了影刀里可能还是ImportError。我建议在影刀的执行Python代码指令里先跑一下import sys print(sys.executable)把返回的路径复制出来再用这个路径对应的python.exe去装依赖/path/to/your/python.exe -m pip install pymysql这一步能省掉后面很多为什么装不上的折腾。如果影刀版本支持也可以直接在指令层面调用数据库相关的扩展指令不过我个人更推荐用pymysql因为可控性更强SQL和异常处理都在Python代码里逻辑更透明。2.2 MySQL侧的环境准备数据库侧要做的事有三件建库、建表、确认用户权限。我用命令行演示一下CREATE DATABASE IF NOT EXISTS rpa_data DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE rpa_data; CREATE TABLE IF NOT EXISTS product_info ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NOT NULL, price DECIMAL(10,2), publish_date DATE, create_time DATETIME DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY uk_title (title) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4;这里有两个设计细节值得说一下。为什么字符集一定要用utf8mb4而不是utf8因为utf8mb4是完整的UTF-8编码能存emoji、生僻字而MySQL的utf8是阉割版最多只能存3字节的字符遇到特殊符号就报Incorrect string value错误。RPA抓网页数据内容千奇百怪直接上utf8mb4最省心。为什么给title字段加唯一索引因为RPA流程往往是要定时跑的今天跑一遍、明天跑一遍如果每次都不做去重表里的重复数据会越来越多。加了UNIQUE KEY uk_title (title)之后配合INSERT IGNORE语法重复的数据会被静默丢弃流程就变成幂等的了——跑一万次和跑一次结果一致。这是自动化任务里一个很重要的设计思路。权限方面建议给RPA流程单独创建一个专用账号而不是直接用root。这样做的好处是即使账号密码泄露影响范围也只在指定的库CREATE USER rpa_userlocalhost IDENTIFIED BY YourStrongPassword; GRANT ALL PRIVILEGES ON rpa_data.* TO rpa_userlocalhost; FLUSH PRIVILEGES;如果MySQL和影刀跑在不同机器上localhost要改成%或者指定IP同时注意MySQL默认绑定127.0.0.1需要去my.cnf里把bind-address改一下才能远程连接。不过做这道题本地跑就够了没必要折腾远程访问。2.3 辅助定位工具浏览器开发者工具和XPath Helper写XPath有一句话我特别认同永远不要在脑子里拼XPath而是要用工具验证。我常用的两个辅助工具都是浏览器自带的开发者工具外加一个XPath Helper扩展。先按F12打开开发者工具在Elements面板里找到目标元素右键菜单里有Copy - Copy XPath和Copy - Copy full XPath。但这两个选项生成的XPath经常带tbody这类容易失效的中间节点而且充满了div[1]这种位置索引页面稍微加一行就崩。所以我一般只把它当起点拿到之后要自己改写。XPath Helper是一个浏览器扩展装上之后按住Shift键再移动鼠标它能实时显示你鼠标所指元素的XPath和匹配数量。这个工具特别适合调试比如你想验证//div[classitem]到底匹配了几个元素鼠标一滑心里就有数了。需要注意的是扩展给的XPath同样只是参考最后还是要在影刀里实测。3. XPath定位RPA里最稳定的元素定位方案3.1 XPath为什么比CSS选择器更适合RPA用过CSS选择器的人都知道.class-name和#id在页面结构稳定时很好用。但RPA的场景恰恰是页面结构常常不稳定。你做一个爬虫脚本几分钟就写完了你做RPA流程要应对的是业务天天有人改页面还有各种弹窗、懒加载、动态渲染。XPath的优势主要体现在这几个方面支持按文本内容定位。比如页面上有个按钮确认支付这个按钮的class是动态生成的随机字符串用CSS就很难定位但XPath可以直接写//button[contains(text(),确认支付)]文本不变就能找到。支持模糊匹配。HTML元素的class往往是一长串比如el-button el-button--primary el-button--mediumCSS选择器要写class*btn这种属性选择器XPath则有contains(class, btn)直观多了。支持从某个元素出发做相对定位。这是RPA里非常实用的能力。比如我先定位到一个商品卡片//div[classproduct-item]接下来在影刀流程里可以在这个元素的子层级里去继续找标题、价格、链接而不是从头再写一长串独立XPath。父节点找子节点容易反过来从兄弟节点倒推父节点也容易CSS做这种层级游走就比较吃力。3.2 常用XPath写法速查表我把自己平时用得最多的几种XPath写法整理了一下都是处理RPA网页数据时的高频场景场景XPath写法说明按精确文本//div[text()现货]文本必须完全一致按模糊文本//span[contains(text(),现货)]文本包含即匹配按class//div[contains(class,price)]处理多重class最稳组合条件//div[classitem and .//span[contains(text(),热卖)]]同时满足多个条件当前节点下的子元素.//a[classtitle]注意开头有点第N个兄弟元素//ul[classlist]/li[2]/a索引从1开始和Python不同根据子元素反找父级//span[text()目标]/ancestor::div[classcard]从内向外定位有几个容易踩的细节要专门提醒。//div[classprice]用的是完全匹配如果元素的class是price red这个XPath就匹配不到了必须用contains(class, price)。另外XPath的索引从1开始而Python列表从0开始第一次从XPath转Python处理时很容易犯迷糊。还有一个需要注意的地方是text()只能匹配当前节点的直接文本如果元素内部还有嵌套的span、emtext()取到的可能是一部分这时候用string()函数更保险。3.3 一个真实的定位案例这次实操我选了一个公开的商品信息展示页面来做演示仅作学习用途数据采集请遵守目标网站的服务条款和法律法规。页面的结构大概是这样的div classproducts div classproduct-item h3 classtitle无线鼠标/h3 span classprice¥128.00/span span classdate2025-01-15/span /div div classproduct-item h3 classtitle机械键盘/h3 span classprice¥399.00/span span classdate2025-01-16/span /div /div我要抓取每一条商品卡片的标题、价格和发布日期。方案是分两步走第一步用一条XPath先匹配到所有商品卡片容器//div[classproduct-item]。在影刀的获取元素信息(文本)指令里填入这个XPath它能返回一个列表列表里每个元素是一个商品卡片的HTML文本。第二步在Python代码里对每个卡片文本做二次解析或者更稳的做法是用三条XPath分别获取标题//div[classproduct-item]//h3[classtitle]价格//div[classproduct-item]//span[classprice]日期//div[classproduct-item]//span[classdate]这样取得三个列表它们的索引是一一对应的第0个标题对应第0个价格和第0个日期。后续在Python里用zip把它们捏在一起就好了。如果页面上的商品数量不是固定的可以在影刀里用获取元素数量指令把product-item的个数拿到然后循环处理。但注意一旦进入循环每次都重新用完整XPath定位会降低效率更好的做法是先拿数量再用[i]动态拼XPath或者干脆把整个区域HTML一次性拿下来交给Python的lxml去解析。后面一种方案在大批量抓取时性能优势很明显。4. 用内置包获取数据从取元素到结构化数据4.1 影刀内置包到底怎么用影刀RPA的内置包并不是一个需要单独import的库它指的是影刀内置的Python执行能力。在流程设计器里你可以从指令列表拖出一个执行Python代码指令块在这个块里写标准的Python代码而且还能和流程变量互相交换数据。比如前面获取元素信息得到的数据存到变量page_data里在Python指令块里可以通过影刀提供的API读取它反过来Python代码计算的结果也能赋值给流程变量供后面的指令使用。这个设计的意义在于它把RPA的指令世界和Python的生态世界打通了。指令负责和浏览器、桌面应用打交道Python负责做复杂的数据处理和业务逻辑。比如你要对抓回来的文本做正则清洗或者要调用pandas做透视表又或者要连接pymysql写数据库这些用纯指令很难实现的事情在Python指令块里几行就搞定了。4.2 获取网页数据的两种路线结合这道题获取网页数据有两条路可以走我分别说一下适用场景。路线A影刀网页指令 XPath 内置包处理。先拖一个打开网页指令把目标页面加载出来然后用获取元素信息(文本)指令按XPath提取数据到变量最后在执行Python代码指令里做清洗和转换。这种路线最贴合RPA的设计初衷适合需要登录态、需要点击翻页、页面是JavaScript动态渲染的场景。路线B纯Python requests lxml。直接在执行Python代码指令里用requests请求页面URL再用lxml解析。这种路线的优点是快、不受RPA浏览器影响逻辑全部收敛在一个Python代码块里。但缺点也很明显requests拿不到登录后的会话遇到需要登录的页面就得先模拟登录、处理Cookie遇到网站加了反爬措施就更头疼。我的建议是优先走路线A。因为这道题考察的正是影刀RPA内置包和XPath而不是考察你怎么写爬虫。用影刀打开真实浏览器去加载页面既避开了反爬问题又能验证你的XPath是否真实有效这样才能把精力聚焦到用内置包处理数据这个核心考点上。4.3 用影刀指令抓取页面数据实际操作时我的流程是这样的先拖出一个打开网页指令URL列填目标页面地址。页面加载完成后为了确保数据都渲染出来了我一般会先加一个等待元素出现指令XPath指向第一个商品卡片的标题超时设10秒。这是RPA流程里非常关键的一步——不加等待直接抓取很容易拿到空列表因为页面是异步渲染的数据还没回来。然后添加获取元素信息(文本)指令目标类型选XPath填入//div[classproduct-item]//h3[classtitle]属性选文本内容把结果存到流程变量title_list。同理再添加两条指令获取价格列表price_list和日期列表date_list。这里有一个小技巧不一定非要分三次去抓。如果页面结构规整可以在获取元素信息里直接选择HTML内容一次性把整个商品列表区域抓下来存储为一个大的字符串然后在Python里用lxml来解析。这种方式更高效而且对页面结构的依赖更小。不过它要求你对lxml的选择器语法比较熟初学者可以先从三次抓取开始跑通了再优化。4.4 在Python代码块里把数据整理干净这三个列表拿到手之后工作还没完因为网页文本往往是带格式的。价格可能是¥128.00日期可能是2025年1月15日这些都不能直接写进MySQL。我在执行Python代码指令块里做了清洗和转换import re from datetime import datetime title_list [] # 从影刀变量传入 price_list [] # 从影刀变量传入 date_list [] # 从影刀变量传入 def clean_price(text): # 去掉货币符号、千分位逗号变成浮点数 text text.replace(¥, ).replace(,, ).strip() return round(float(text), 2) def clean_date(text): # 统一转成YYYY-MM-DD格式 text text.replace(年, -).replace(月, -).replace(日, ).strip() try: dt datetime.strptime(text, %Y-%m-%d) return dt.strftime(%Y-%m-%d) except ValueError: # 解析失败返回None入库时会被跳过 return None data_list [] for title, price, date in zip(title_list, price_list, date_list): title title.strip() if not title: continue clean_price_value clean_price(price) clean_date_value clean_date(date) if clean_price_value is None: continue data_list.append((title, clean_price_value, clean_date_value)) # 把结果赋给影刀流程变量供后续步骤使用 data_list_result data_list这段代码看着简单但有几个点我特别强调一下。zip函数是把三个列表按索引并行打包的第一选择前提是三个列表长度一致。如果长度不一致zip会静默截断到最短的那个这可能掩盖数据漏抓的问题。实际项目中我会先print一下三个列表的长度确认一致再往下走。另外清洗函数里的.strip()非常重要。HTML里的文本经常潜藏看不见的空白字符、换行符直接拿去匹配或者入库会带来各种莫名其妙的问题。我见过很多XPath能抓到但写入MySQL报错的案例最后都是因为文本里有空格或者特殊符号。还有一点如果出现无法解析的日期和价格代码里选择continue跳过这条数据而不是写入NULL。因为价格解析不出来说明这条数据本身可能有问题宁可少一条也不要脏数据。4.5 处理完数据之后的调试技巧控制台的print输出是在影刀的运行日志里看的。写Python代码块时建议在关键节点加print比如打印数据条数、打印前三条数据内容。我调试的时候习惯这样print(抓取到标题数量:, len(title_list)) print(清洗后数据示例:, data_list[:3])运行之后打开影刀的运行日志面板直接看到输出。这一步能帮你快速判断是整个流程在抓取阶段出了问题还是只是Python处理阶段出了bug。不要一上来就闷头写一大段代码跑挂了再满天找原因那样效率太低了。5. 写入MySQL从建表到批量入库的完整实现5.1 数据入库前的表结构校验数据拿到手之后第一件事是确认数据库表结构跟你清洗后的数据能对得上。我在第2节已经给了建表SQL这里再说一下字段设计背后的一些考虑。title VARCHAR(255) NOT NULL标题不固定长度255够用NOT NULL防止空标题混进来。price DECIMAL(10,2)货币用DECIMAL而不用FLOAT是因为FLOAT是浮点数存储货币时会有精度丢失0.10.2不等于0.3的问题在数据库里同样存在。DECIMAL是按字符串存储精度可控。publish_date DATE日期类型避免用字符串存日期因为DATE类型可以用MySQL的日期函数做筛选统计。create_time DATETIME DEFAULT CURRENT_TIMESTAMP这个字段是自动维护的记录当前行是什么时候写入的。跑定时任务的时候可以通过它来判断今天是否已经执行过了。UNIQUE KEY uk_title (title)这是去重的关键配合INSERT IGNORE使用。如果表已经建好了但字段对不上不要直接改表结构先检查你的清洗逻辑。比如价格字段如果存的是128.00字符串放进DECIMAL(10,2)是能自动转的但如果存的是¥128.00这种带符号的MySQL会报错或者存成0.00所以数据清洗永远走在入库前面。5.2 pymysql连接与批量插入完整代码在影刀的执行Python代码指令块里我写了这段入库代码import pymysql conn pymysql.connect( host127.0.0.1, port3306, userrpa_user, passwordYourStrongPassword, databaserpa_data, charsetutf8mb4 ) try: with conn.cursor() as cursor: sql INSERT IGNORE INTO product_info (title, price, publish_date) VALUES (%s, %s, %s) cursor.executemany(sql, data_list_result) conn.commit() print(写入成功共写入 {} 条数据.format(len(data_list_result))) except Exception as e: conn.rollback() print(写入失败已回滚:, e) finally: conn.close()如果你还没装pymysql在影刀内置Python环境里执行python.exe -m pip install pymysql前面那条import sys打印出来的路径就是这里要用的python.exe路径。这段代码有几个关键点逐个说charsetutf8mb4必须显式指定不指定的话pymysql默认字符集可能是latin1中文一定会乱码。参数化SQL语句VALUES (%s, %s, %s)是必须养成的习惯绝对不要用字符串拼接SQL。不管是写RPA还是写普通PythonSQL注入都是一种非常危险的安全漏洞参数化是默认做法。executemany的批量插入比循环里逐条execute快很多。它的原理是把多条数据和一条SQL模板一起发给MySQL减少了客户端和数据库之间的网络往返。我实测过1000条数据的插入executemany比for循环逐条插入快几十倍。conn.commit()用来提交事务如果不调这一行with conn.cursor()块结束后数据不会真正入库。如果异常发生conn.rollback()会把已经执行但未提交的操作回滚掉避免插入了一半数据留下脏数据。5.3 在影刀流程中如何衔接这些代码段整个流程在影刀里是这样的顺序打开网页指令加载目标页面。等待元素出现指令XPath指向某个商品标题确保页面渲染完成。获取元素信息(文本)指令分别获取标题列表、价格列表、日期列表。执行Python代码指令做数据清洗和转换输出data_list_result。执行Python代码指令连接MySQL并批量写入。也可以用同一个代码块完成清洗和入库但拆开写的好处是调试时能定位到具体是哪一步出的问题。弹出提示或日志指令打印写入结果。关闭网页指令收尾。需要留意的是两个执行Python代码指令之间的变量传递。影刀里变量有作用域默认情况下同一个流程内的变量可以共享但如果你在两个独立的Python代码块里都要用同一个变量最好在流程最前面先创建一个变量并赋初值然后在第一个Python块末尾赋值第二个Python块里读取。具体操作是用影刀右上角的变量管理面板新建变量然后在Python代码里通过影刀提供的API来存取不同版本API不一样一般是在左侧的元素操作面板里能看到变量接口函数的说明。5.4 写入后的验证方法写入完成后别急着关页面先验证一下数据对不对。我习惯在影刀流程末尾加一段Python代码conn pymysql.connect(host127.0.0.1, port3306, userrpa_user, passwordYourStrongPassword, databaserpa_data, charsetutf8mb4) try: with conn.cursor() as cursor: cursor.execute(SELECT COUNT(*), MAX(create_time) FROM product_info) count, max_time cursor.fetchone() print(当前总数据量:, count, 最新写入时间:, max_time) finally: conn.close()这样一跑就能看到数据有没有真正落库。如果只是看OK提示心里还是不踏实数据量、时间都打出来一切尽在掌握。6. 实测中踩过的坑从抓不到数据到写入失败6.1 XPath在影刀里失效的常见原因我做这道题时遇到的第一问题就是XPath明明在浏览器开发者工具里能定位到元素但影刀就是取不到数据。排查下来无非是这几种原因按出现频率从高到低元素在iframe内部。如果页面里的商品列表是嵌在iframe里的影刀默认的网页操作是针对主文档的直接定位是定位不到的必须在影刀网页元素操作里先切换工作目标到对应的iframe或者用进入iframe指令再去执行获取元素信息。这也是RPA初学者最容易踩的坑之一因为浏览器开发者工具里你看到的DOM结构是包含iframe内部内容的但在程序里iframe是独立的文档。页面懒加载导致元素尚未渲染。现在很多页面是滚动到某个区域才加载数据的。解决方法是在抓取之前加滚动鼠标滚轮或者执行JavaScript让页面滚动到底部再回到顶部然后加等待元素出现指令等待数据渲染完成。XPath写法过于绝对。我刚才已经反复强调了contains(class, price)和classprice的区别。如果用完全匹配class值带个空格都匹配不到缓存一刷新页面流程就挂了。影刀获取元素信息指令的选择器格式问题。不同版本的影刀对XPath传入格式要求不一样有的版本要求首尾不需要加//有的则要求必须写完整。遇到取不到元素时先在指令里确认选择器类型下拉框确实选的是XPath再把XPath升级成从外层相对定位的方式试试比如不从根节点写而是从某个稳定元素往下找。6.2 中文乱码和字符集问题乱码问题几乎每个写MySQL的RPA新手都会遇到表现是数据库里的中文变成了一串???。这个问题的根因本质上就三层一层一层查第一层客户端连接编码。pymysql连接参数里没写charsetutf8mb4默认可能就用了latin1。这个最常见加上就解决。第二层表结构和数据库字符集不对。建表的时候如果没指定DEFAULT CHARSETutf8mb4MySQL会继承默认字符集很多MySQL安装默认是latin1中文存进去必然乱码。用下面的SQL检查SHOW CREATE TABLE product_info;看到DEFAULT CHARSETutf8mb4就对了。如果是latin1用ALTER TABLE改一下。第三层影刀Python代码块里的字符串编码。影刀内置的Python环境在Windows上运行时如果系统区域设置是GBK某些字符串操作可能会出现编码异常。这时候在Python代码开头加一行# -*- coding: utf-8 -*-同时注意控制台print内容如果出现UnicodeEncodeError是控制台编码问题不一定是数据本身乱码可以在print里对字符串做encode(utf-8, errorsignore)或者干脆少打印中文打印数据条数就够了。6.3 连接MySQL报错的完整排查链路连接MySQL是另一个高频翻车点。我把常见报错和排查顺序整理成了表格报错信息可能原因排查动作2003 Cant connect to MySQL server on 127.0.0.1MySQL服务没启动或端口不对命令行执行netstat -ano | findstr 3306看端口是否监听服务管理里确认MySQL服务是运行中1045 Access denied for user rpa_userlocalhost用户名或密码错误命令行用同一账号测试mysql -u rpa_user -p检查密码是否含特殊字符被转义1049 Unknown database rpa_data库名拼写错误或库不存在在MySQL命令行执行SHOW DATABASES;确认库名2059 Authentication plugin caching_sha2_password cannot be loadedMySQL 8默认认证插件与旧版pymysql不兼容升级pymysql到最新版或建用户时指定IDENTIFIED WITH mysql_native_password BY ...NotImplementedError: caching_sha2_password同上多见于Python连接首选升级pymysql排查时我坚持一条原则先命令行验证MySQL本身没问题再让Python独立连一次最后才接入影刀流程。三步定位法能省很多时间。如果在影刀里连不上但命令行里能连上那问题基本出在影刀内置Python环境的pymysql版本上重新用内置的pip装一次就好。6.4 数据类型不匹配的坑网页文本全是字符串MySQL表格里的字段却有明确的类型要求。价格存成¥128.00肯定不行日期存成2025年1月15日也不行。我在清洗代码里已经处理了这两个字段这里再补充一个容易被忽略的坑如果网页价格是1,280.00这种带千分位的格式只去掉¥符号还不够还要把,去掉否则float()转换会报错。清洗函数里我用了一行text.replace(,, )就是干这个的。日期格式也五花八门有的页面是2025-01-15有的是2025/01/15有的是01/15/2025。如果你的目标页面日期格式不确定最好先把原格式print出来看清楚再写对应的解析逻辑。偷懒的办法是入库字段直接用VARCHAR存原始字符串但这样后续做时间范围查询就得做字符串截取很痛苦。我建议还是花点力气转成DATE类型一劳永逸。还有空值的处理。如果某些商品没有价格清洗函数返回None入库SQL里%s可以接收None变成SQL的NULL。但是注意如果字段是NOT NULL插入NULL就会报错。所以设计表结构的时候要明确哪些字段允许为空哪些不允许。在我的表里title是NOT NULLprice允许NULL这样价格缺失的数据还能保存标题只是价格是空的下游统计时需要用COALESCE处理空值。6.5 数据量大时的性能问题如果一次抓取的条目不多几十条一百条前面那套代码稳稳当当。但如果页面有几千条数据或者你要翻几十页就需要考虑性能了。第一executemany虽然快但一次性传几千条数据也可能超出MySQL的max_allowed_packet限制报错Packet too large。解决办法是分批执行比如每500条提交一次BATCH_SIZE 500 for i in range(0, len(data_list_result), BATCH_SIZE): batch data_list_result[i : i BATCH_SIZE] cursor.executemany(sql, batch) conn.commit()第二翻页抓取时如果是用影刀打开网页指令做翻页每翻一页就抓一次流程会变得很慢。高效的做法是在Python代码块里直接用requests循环请求多个页面URL前提是页面不涉及登录态和复杂JS渲染一次性抓完再清洗入库。这算是路线B的优势场景。第三如果你用获取元素信息拿到的是整个列表区域的HTML而不是分开的三组列表那么在Python里可以用lxml来解析from lxml import html tree html.fromstring(page_html) titles tree.xpath(//h3[classtitle]/text()) prices tree.xpath(//span[classprice]/text()) dates tree.xpath(//span[classdate]/text())这种方式比在影刀里拖三个指令去获取元素要快得多程序看起来也更紧凑。lxml的XPath语法和浏览器里的XPath基本一致学习成本几乎为零。如果影刀内置环境没装lxml同样用pip装一下就行。6.6 流程稳定性的两个小优化RPA流程的稳定性是高级操作题里没有明说但默认考察的点。我做完基本功能后还加了两个小优化第一个优化是失败重试。影刀的指令支持设置重试次数我通常把等待元素出现和获取元素信息指令的失败重试设为3次每次间隔2秒。网页是网络环境偶尔卡顿很正常重试机制能把偶发故障自动消化掉不用每次都在半夜被手机报警吵醒。第二个优化是结果通知。数据写入完成后用影刀的发送邮件或者企业微信/钉钉机器人指令把执行结果推送给相关人员。比如写一条消息本次RPA任务共抓取128条数据清洗后入库126条2条因价格解析失败跳过。这样不仅自己心里有数也给同事和管理层一个明确的结果反馈。做自动化不是把流程跑完就结束而是让整个执行链路可监控、可追溯。7. 这套能力组合还能用在哪里做完了这道高级操作题其实你手里已经有了一套很实用的能力组合XPath定位网页元素、影刀内置包执行Python、pymysql操作MySQL。这套组合的复用场景非常多。最常见的场景是各种数据采集与汇总比如每个工作日定时从内部系统抓取业务报表数据清洗后写入数据库再基于数据库做可视化看板还有电商平台的价格监控定时抓取目标商品的价格变动并写入MySQL用SQL就能做价格趋势分析以及把多个外部系统的数据定时同步到中间库为下游的数据仓库和BI系统提供稳定数据源。在实际跑这些定时任务时我的经验是做好幂等和可重试。幂等靠唯一索引和INSERT IGNORE实现可重试靠影刀指令级别的失败重试和流程日志实现。这两点做好了RPA流程才能真正脱离人工值守变成一个可靠的自动化助理。另外跑定时任务时记得关注MySQL的时区设置和影刀运行环境的时区是否一致特别是涉及日期入库时时区不一致会导致日期偏移一天排查起来很隐蔽。如果要继续深挖我建议下一步学习把抓取到的数据做二次加工比如用pandas替代纯Python列表操作做更复杂的数据透视和分组统计再写入MySQL的汇总表中这样就能从数据搬运工升级到数据加工者。整个方向的学习路径是XPath和lxml解决网页数据读取pandas解决数据处理pymysql和SQL解决数据存储再加一个定时调度和通知机制就是一套完整的数据管道了。