影刀RPA进阶教程:多店铺价格对比表自动生成方案

本文详解基于影刀RPA实现多店铺商品价格自动采集、清洗、汇总与可视化标色的端到端方案。核心采用配置表驱动架构,通过ForEach循环、网页监听/相似元素采集双路径、Python协同数据清洗(含哨兵值处理)、Excel条件格式化及健壮异常处理(Try-Catch+随机延迟+登录态校验),支持6至11家店铺灵活扩展,并集成定时任务与飞书通知,实现无人值守运营。

影刀RPA进阶教程:多店铺价格对比表自动生成方案

做店群或者多渠道铺货的运营都懂那个痛:每天早上要打开五六个店铺后台,一个一个搜同款商品,把价格抄进对比表,抄完还要肉眼比出谁家最低。一小时起步,还经常抄错小数点。

我实操影刀RPA两年多,这套多店铺价格对比表自动生成方案跑了快一年,从六家店扩展到十一家店,流程没大改过。每天早上八点半自动跑,九点前飞书群里就能收到对比结果,人工只负责看数字做决策。

这篇把完整方案从流程设计、指令选型到踩过的坑全部展开讲。方案的核心思路就一句话:一张店铺清单表驱动一切,循环每个店铺采集价格,清洗后汇总写进同一张对比表。

流程总体设计:一张清单表驱动的架构

动流程之前先设计数据结构,这决定了整个方案的扩展性。我建了一张Excel配置表,命名为"店铺清单.xlsx",结构如下:

在这里插入图片描述

店铺名称平台搜索URL需比价的商品关键词币种
A店-天猫淘宝https://xxx无线蓝牙耳机元
B店-京东京东https://xxx无线蓝牙耳机元

流程主体就五个子流程,按顺序串起来,每个职责单一:

  1. 读取店铺清单,拿到今天要跑的店铺列表
  2. 循环店铺:打开网页、搜索商品关键词
  3. 采集搜索结果页的价格数据
  4. 数据清洗:把"¥59.90"变成数字59.9,算出每店最低价
  5. 汇总写入对比表,算差价、标最低,发通知

拆成子流程不是为了好看。第3步的采集逻辑各平台差异最大,封装开后,新增一个平台只需要新写一个采集子流程,主流程一行不动。这是影刀流程设计里我最认可的一条经验:把"会变的"和"不变的"分开装。

子流程一:读取配置与循环结构的选择

用【打开】指令加载店铺清单,【读取区域】把整个表读成列表。每个店铺是一行数据,接下来要遍历它。

循环指令这里有讲究。店铺数量是已知的、数据是规整的二维表,用ForEach列表循环最合适,循环变量就是当前这一行的店铺信息。不要用For次数循环硬写次数,店铺加了删了你就得改流程,违背了配置驱动的初衷。
在这里插入图片描述

循环体第一步是打开店铺的搜索页。用【打开网页】指令,URL参数直接取当前行的"搜索URL"列拼接上商品关键词,打开方式选当前标签页。这里有个坑我踩过:不同店铺页面的加载速度差异很大,着急往下走会采到空数据,所以打开后必须挂等待。

等待的选择我做个对比:

等待方式适用场景我的选择
固定延迟执行页面加载稳定的内部系统兜底用
【等待元素(web)】有明确"加载完成"标志元素首选
【获取已打开的网页对象】后校验弹新标签页的场景配合使用

电商后台推荐固定用【等待元素(web)】等价格区域元素出现,超时设20秒, Catch住超时的情况单独记日志,而不是让整个流程崩掉。

子流程二:价格采集的两种实现路线

采集价格有两条路线,性能和适用性差别很大,我两条都长期用过。

路线A是【获取相似元素列表】。捕获搜索结果里的商品卡片作为相似元素,循环列表,在循环体内用【获取文本】逐个抠出商品名和价格。优点是逻辑直观、好调试,缺点是商品多的时候页面要滚动加载,你得先处理懒加载——先用【获取滚动条位置】判断有没有滚到底,没到底就继续往下滚,直到位置不再变化。

路线B是【数据抓取】指令,或者更进一步的网页监听方案。按F12打开开发者工具,Ctrl+R重新加载页面,在Network里搜价格数字,找到返回商品数据的接口请求,然后用影刀的【开始监听请求】、【获取网页监听结果】这套指令直接拿接口返回的原始数据。数据量大的时候这条路快得多,还顺便绕开了页面元素变动的问题。
在这里插入图片描述

两条路线的选型原则:商品数少于50、页面结构简单,用路线A够用;店铺多、商品多、追求分钟级完成,上路线B。 我的对比表方案最后落在B上,因为某次平台改版把卡片结构改了,路线A重抓元素花了一下午,接口数据反而一直稳。

数据清洗:价格字段的三道工序

采回来的价格是"¥1,299.00"甚至"¥1299.00起"这种脏数据,直接写进Excel,后面求最低价、算差价全是文本拼接事故。清洗就三道工序,用Python协同做最顺手:

# 输入:采集到的原始价格字符串 price_raw,如 "¥1,299.00起"
# 输出:float类型的价格数字

import re

# 第一道:去掉货币符号、千分位逗号等非数字字符
cleaned = re.sub(r'[^\d.]', '', price_raw)

# 第二道:处理"起"字截断的多区间价格,这里统一取最低价
# 如果原始数据是"99.00-199.00",取横杠前的部分
cleaned = cleaned.split('-')[0]

# 第三道:转数字并兜底,空值给一个明显异常的哨兵值便于后续过滤
try:
    price = float(cleaned)
except ValueError:
    price = -1.0  # -1 表示本次采集失败,汇总时单独标记

哨兵值这个技巧值得单独说。新手容易在转换失败时填0,0在求最低价时会"赢",一张异常数据就把整个对比结论带偏了。用-1这种业务上不可能的价格,写表时一眼就能看出哪些店铺采集出了问题。

清洗完用字典结构装结果,店铺名做键、最低价做值,最后一步写表时直接按店铺名取用,比维护一堆price1、price2变量干净太多。这也是影刀变量类型里字典最实用的场景之一。

子流程三:对比表生成与条件标色

汇总写表是方案的门面。我用【写入单元格】逐个写入各店铺的最低价,再横向比较算出全场最低价和最高价店铺。

在这里插入图片描述

条件标色是我强烈建议加的功能:谁的售价低于全场均价10%,那格标绿色;高于均价15%标红色。影刀Excel模块里【设置单元格格式】支持填充色,配合If条件判断写在循环里,十几行指令的事。老板看一眼颜色就知道该调谁的价,这比我解释半天数字直观。

对比表最终结构大概长这样:

商品关键词全场最低价最低价店铺全场均价各店价格(横向展开)
无线蓝牙耳机59.90B店-京东71.5069.90 / 59.90 / 75.00

写完表别急着收工,加一个【保存】指令。我吃过亏:流程跑完没保存,第二天打开对比表还是昨天的数据,还以为是采集出了问题,查了半天才发现是Excel没落盘。

异常处理与防限流:跑得稳比跑得快重要

十一个店铺循环跑,任何一个店铺崩了都不该拖垮整场。所以循环体内整个套Try-Catch:Catch里输出店铺名和报错到日志,截图存档,然后继续下一个店铺。Finally块放关闭标签页,保证不留一堆残余标签页拖慢后续循环。

防限流方面两个动作。一是每个店铺之间加随机延迟,我用Python的random生成3到8秒的随机数再延迟,别让请求节奏太机械。二是错峰,采集任务安排在早上七点跑,避开平台流量高峰,登录态也更稳定。
在这里插入图片描述

登录态本身是另一个话题。我用的是浏览器Profile隔离加Cookie保持的思路,每个店铺一个独立浏览器环境,流程里先用【判断登录态是否有效】的思路——打开后台后用【等待元素(web)】等登录后才有的元素,等不到就走扫码提醒分支,人工介入一次,Cookie又能用一周。

定时任务与消息通知:让机器人自己干活

方案跑顺之后,最后一步是把它变成无人值守的定时任务。单机场景在影刀客户端里配计划任务,每天早上七点触发;如果要集中调度多台机器,就上控制台,把客户端开成调度模式变成受控的机器人,云端统一下发计划任务。

跑完的通知我用【飞书群通知】把关键结果推到运营群:今天最低价、价差最大的商品、采集失败的店铺。临时想要更详细的明细就配【发送邮件】,把对比表作为附件发出来,收件人多个邮箱用英文分号隔开。

通知内容里有分组数和错误明细,出问题的店铺人工只要看那一家就行,不用全量复查。这套"自动跑+主动报"的组合,是把流程从"能用"推到"好用"的关键一步。

易错速查表

这套方案实际运行中出过的问题,浓缩成六条速查:

报错/现象原因解决
Array to String报错把列表写进了单元格写单元格用字符串,列表先join
采集结果全为空页面没加载完等待元素(web)加到20秒
某店铺价格全是-1登录态失效或页面改版查日志截图,重抓元素
在这里插入图片描述

| 求最低价结果为0 | 转换失败填了0 | 改用-1哨兵值 |
| 翻页只翻第一页 | 下一页按钮disabled判断漏了 | 循环条件里校验class含disabled |
| 日期显示成数字 | Excel日期序列值 | 写入前转文本或设单元格格式 |

其中翻页那条多提一句:不确定总页数时,别数页码,用下一页按钮的disabled状态做循环条件——按钮可用就继续翻,disabled就停,这是我试过最稳的翻页写法。

从六家店到十一家店:扩展时改哪里

最后讲扩展性,这是配置驱动架构的回报时刻。新开一家店铺,我只需要三步:清单表加一行、对应平台的采集子流程确认能兼容新店铺页面、跑一遍验证。十分钟的事。

平台层面的大改版才是真正的维护成本。我的应对是把采集子流程里的XPath集中写在子流程顶部的注释块里,改版时只动那一处。元素定位四合一的能力在这里体现出价值:XPath搞定90%的场景,剩下的用CSS选择器和正则补充,偶尔遇到结构混乱的老页面,再用图像识别兜底点按钮。

完整流程源码我放在代码仓库 home.linyan.cloud,可以直接参考改造,配置表模板和清洗脚本都在里面。

想系统补基础的话,影刀官网的帮助中心搜"数据抓取"、“网页监听”、"Excel"这几个词条,把官方示例跑一遍,再回头看这篇会顺很多。

#影刀RPA #RPA自动化 #电商自动化 #数据采集 #Excel #流程设计

在这里插入图片描述

作者:林焱

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值