RPA与Python爬虫协同:电商数据下载的方案设计
背景:一个被低估的效率黑洞
电商团队的日常工作里,有一类任务长期处于"不痛不痒"的灰色地带——它不算紧急,但每个月都要耗费人力;说起来是重复劳动,却又因为流程琐碎、容易出差错,不敢完全放手让新人去做。月账单下载就是典型代表。
以京东商家后台(京麦)为例:财务人员需要按月下载账单明细,用于对账、报税、利润核算。单个账号一次操作不过几分钟,但一旦涉及多账号、多月份的批量处理,时间就会以乘法放大。更麻烦的是,这件事通常卡在月初或月末的节点,偏偏也是财务最忙的时候。
这类任务的特征非常清晰:规则固定、重复率高、出错代价低但频率高。这正是自动化最应该介入的场景。
然而,电商平台的自动化并不像想象中那么简单——平台有自己的商业利益考量,并不鼓励数据被批量抓取,因此设置了层层风控。如何在合规使用自己账号数据的前提下,提升操作效率,是这套方案需要回答的核心问题。
一、为什么不直接用 RPA,也不直接用爬虫
面对这类自动化需求,工程师通常会在两种路线之间做选择,但两条路各有明显的天花板。
纯 RPA 的问题在于"脆"。RPA 依赖界面元素的定位(按钮坐标、DOM 结构、文字识别),一旦平台改版,哪怕只是调整了一个按钮的位置或文案,流程就可能整体失效。更深层的问题是,RPA 的执行速度受限于页面渲染:它需要等待页面加载、等待弹窗出现、等待文件下载完成,每一步都在消耗时间。如果要批量处理 12 个月 × 5 个账号的数据,累积的等待时间相当可观。
纯爬虫的问题在于"进不去"。爬虫的优势是直接调用接口,不依赖界面,速度快、稳定。但前提是必须持有有效的登录态 Cookie。现代电商平台的登录风控已经相当成熟:行为指纹(鼠标轨迹、点击间隔)、设备指纹(浏览器环境、Canvas 指纹)、IP 信誉评分……纯代码模拟登录的成本越来越高,且随着平台风控升级,需要持续对抗维护,是一场没有终点的军备竞赛。
两种方案的缺点,恰好互补。RPA 擅长"过门"——它操控真实浏览器,行为特征接近真人,验证码也可以通过图色识别或第三方打码服务处理,登录这件事对 RPA 来说不是难题。爬虫擅长"干活"——一旦拿到 Cookie,接口调用就是纯粹的网络请求,没有界面依赖,不受渲染速度限制,代码逻辑清晰,出错率低。
这就是这套方案的核心思路:让 RPA 负责最难的那一步(登录),让爬虫负责最频繁的那一步(数据获取),两者通过 Cookie 做交接,各自在自己擅长的领域发挥作用。
二、分析目标接口:先看懂再动手
自动化的第一步不是写代码,而是搞清楚目标系统在做什么。很多工程师习惯上来就开始抓包、写脚本,结果在一些本可以提前规避的坑上浪费了大量时间。
打开京麦月账单页面,按 F12 调出浏览器开发者工具,切换到Network → Fetch/XHR选项卡,这样可以过滤掉图片、CSS 等静态资源,只保留真正的数据请求。
此时点击某个月份的"下载明细"按钮,触发实际的下载动作。开发者工具里随即出现了几条新的网络请求,浏览器也完成了 zip 文件的下载。
点开其中的关键请求,切换到Payload标签页,可以看到请求体的结构:
{ "monthbillMo": { "monthView": "2026-04", "secAccountNo": "173669760001", "beginDate": 1743436800000, "endDate": 1746028799999 } }这里有一个细节值得关注:时间范围是用毫秒级 Unix 时间戳传递的,而不是直接传月份字符串。这意味着在构造请求时,需要先将YYYY-MM格式的月份换算成对应的起止时间戳。这个处理如果依赖手动计算或硬编码,在跨月、跨年时就容易出错;用代码自动计算则严谨得多。
再切换到Response标签页,接口返回了标准 JSON:code: 200表示成功,data字段是一个临时的 zip 文件下载链接。
值得注意的是,这个链接是临时生成的,有一定的有效期。这说明整个下载流程是分两步走的:先"申请"一个下载链接,再"取"文件。这种设计在大文件异步生成场景中很常见,自动化脚本需要按这个节奏来,不能直接跳过第一步去猜链接。
至此,接口行为已经完全清晰。能提前把这些细节搞明白,后面写代码的时候就不会走弯路。
三、RPA 负责登录与 Cookie 采集
清楚了接口逻辑,下一步是解决"如何拿到有效 Cookie"的问题。
从业务角度来说,Cookie 本质上是平台对"你是谁、你有没有登录"这个问题的答案。只要是合法账号正常登录,拿到的 Cookie 就是有效的,后续用这个 Cookie 调用接口,和在浏览器里手动操作没有本质区别。问题在于,"正常登录"这件事,对爬虫来说并不容易模拟。
影刀 RPA 在这个环节有天然优势:它直接驱动真实的 Chrome 浏览器,浏览器的 User-Agent、Canvas 指纹、WebGL 特征都是原生的,平台的设备指纹检测几乎无从区分。同时,影刀支持对接主流验证码识别服务,碰到滑块或图形验证码,可以在 RPA 流程内直接处理,不需要人工介入。
登录成功后,影刀提供了"获取筛选所有 Cookie"命令,可以一次性取出当前浏览器会话中指定域名下的全部 Cookie,以结构化数据的形式返回。
拿到 Cookie 字典后,将其按照 HTTP 请求头的格式拼接为key=value; key=value; ...字符串,作为变量传入后续的 Python 脚本。这个"交棒"的动作,是整套方案中 RPA 和爬虫协作的关键接点。
四、Python 爬虫负责接口调用与文件下载
有了 Cookie,接下来完全是爬虫的主场。影刀内置了 Python 运行环境,支持 pip 包管理,可以直接安装requests等库,将脚本作为流程节点嵌入 RPA 中执行。
整个脚本逻辑分三步:
第一步:月份转毫秒时间戳
from datetime import datetime, timezone def month_to_timestamps(month_str): year, mon = int(month_str[:4]), int(month_str[5:7]) begin = datetime(year, mon, 1, tzinfo=timezone.utc) if mon == 12: end = datetime(year + 1, 1, 1, tzinfo=timezone.utc) else: end = datetime(year, mon + 1, 1, tzinfo=timezone.utc) begin_ms = int(begin.timestamp() * 1000) end_ms = int(end.timestamp() * 1000) - 1 return begin_ms, end_ms用timezone.utc而不是本地时区,是因为平台服务端通常以 UTC 为基准处理时间,避免因时区差异导致起止时间偏移一天。这种细节在测试阶段看起来没问题,但在月初月末边界场景下会稳定地出错。
第二步:POST 接口获取下载链接
payload = { "monthbillMo": { "monthView": MONTH, "secAccountNo": SEC_ACCOUNT_NO, "beginDate": begin_ms, "endDate": end_ms, "isGlobalSale": False, } } resp = requests.post(API_URL, headers=HEADERS, json=payload, timeout=30) download_url = resp.json()["data"]第三步:下载并解压
file_resp = requests.get(download_url, timeout=60) outer_zip = zipfile.ZipFile(io.BytesIO(file_resp.content)) inner_zip_name = next((n for n in outer_zip.namelist() if n.endswith(".zip")), None) with open(f"jd_bill_{MONTH}.zip", "wb") as f: f.write(outer_zip.read(inner_zip_name))下载的文件是"外层 zip 套内层 zip"的双层压缩结构,这在大文件异步打包场景中比较常见。脚本需要先解开外层,再取出内层 zip 保存,不能直接把外层文件当成最终结果。
相比纯 RPA 方案——等页面加载、点按钮、等弹框、等浏览器下载、管理下载目录——爬虫这条路径减少了所有界面交互,执行时间从分钟级压缩到秒级,且不会因页面布局变化而失效。
五、容错设计:极端场景的兜底策略
任何自动化方案都不可能 100% 无故障运行。把容错设计想清楚,比把主流程做到极致更重要,因为出了问题时往往是业务压力最大的时候。
这套方案的容错逻辑有两层:
第一层:Cookie 失效时自动重新登录。如果 Python 脚本发现接口返回了登录态异常(如code不为 200、返回体提示未授权),将错误状态回传给 RPA,由 RPA 触发重新登录流程,更新 Cookie 后重试。Cookie 的有效期通常是小时到天级别,正常情况下一次登录可以支撑一整批次的下载任务,但重试机制不可省略。
第二层:接口失败时回退到界面操作。如果接口本身出现异常(平台接口升级、临时封禁特定请求、网络问题),Python 脚本返回失败,RPA 可以切换到"界面操作模式",直接模拟点击页面上的下载按钮,完成兜底。这条路慢一些、稳定性差一些,但它的存在意味着整个流程不会因为接口变化而完全瘫痪。
[正常路径] 登录 → 获取 Cookie → Python 调接口 → 下载文件 [兜底路径] 接口失败 → 切换界面操作模式 → RPA 模拟点击下载 [重试路径] Cookie 失效 → 重新登录 → 更新 Cookie → 重试这种"接口优先、界面兜底"的架构,本质上是在效率和稳定性之间做了有意识的分层。大多数情况下走快路;接口出问题时不崩溃,走慢路;登录态问题自愈,不需要人工介入。
六、可扩展的思考
这套方案的边界不止于账单下载,它代表了一种更通用的思路:用 RPA 解决"身份认证"问题,用爬虫解决"数据获取"问题。
往横向延伸,同样的架构可以用于:运营报表的定时采集、多平台(京东、淘宝、拼多多)数据的统一归档、订单明细的自动同步入库。只需要针对不同平台重复"抓包分析接口 → 编写对应的 Python 脚本"这个过程,RPA 的登录和 Cookie 采集模块可以复用。
往纵向延伸,下载到本地只是第一步。拿到 zip 文件后,可以继续用 Python 解析 Excel、入库到数据仓库、触发下游的对账脚本或报表生成,把整个财务数据流打通,而不只是把手工操作搬到了自动化工具里。
真正有价值的自动化,不是"代替人点按钮",而是让数据在系统之间流动起来,消灭中间的人工传递环节。账单下载只是这条链路上的第一个节点。
七、方案对比总结
| 维度 | 纯 RPA | 纯爬虫 | RPA + 爬虫结合 |
|---|---|---|---|
| 登录风控应对 | ✅ 强,真实浏览器行为 | ❌ 弱,易被识别拦截 | ✅ 强 |
| 执行速度 | 慢,依赖页面渲染 | 快,纯接口调用 | ✅ 快 |
| 页面变更稳定性 | ❌ 弱,界面改版即失效 | ✅ 强,接口相对稳定 | ✅ 强 |
| 验证码处理 | ✅ 方便,可对接打码服务 | 需额外开发 | ✅ 方便 |
| 极端场景兜底 | 仅界面操作 | 无法登录则完全失效 | ✅ 双路径保障 |
| 扩展性 | 低,强依赖界面结构 | 高,逻辑清晰易复用 | ✅ 高 |
结语
这套方案的底层逻辑,是把一个看似完整的任务拆解成两个子问题,再用最适合的工具分别解决。认证问题交给 RPA,数据问题交给爬虫,两者通过 Cookie 完成协作。
对于运营和财务团队而言,最终感知到的是"账单每天自动出现在指定文件夹";对于开发团队而言,维护成本也相对可控:接口变了改脚本,界面变了不影响主路径。
更重要的是,这套思路具备迁移性。把它理解为一种分层架构——用 RPA 管"进门",用代码管"干活"——它适用于相当多类似的电商数据场景,值得作为一个可复用的模式沉淀下来。
