影刀RPA新手教程:从小白到独立开发的完整学习路线图——用电商价格监控项目贯穿每个学习阶段

很多人问我:学影刀到底该怎么开始?先学什么后学什么?大概要多久?

我自己的体会是,如果你有一个明确的项目目标,学习效率会高很多。

这篇给你画一条完整的学习路线,每个阶段用"电商价格监控"这个项目来实战——监测淘宝、拼多多上指定商品的每日价格,价格低了自动通知你。

这个项目学完,你能搞定日常90%的自动化需求。

第一阶段:先把环境搭起来(1天)

下载和安装

去影刀官网下载社区版,免费。安装过程一路下一步就行,和装普通软件一样。

装完之后两件事必须做:

第一,安装浏览器插件。影刀的安装目录里有浏览器插件,双击打开,自动安装到Chrome。

第二,打开影刀登录。手机号注册,社区版不需要企业认证。

打开界面后不用紧张——左边的指令面板有几百条指令,但你第一个月真正用到的也就二三十条。

第一个测试

新建一个空白流程,拖一条"输出信息"到编辑区,内容写"hello"。

点击运行,看看下面的日志窗口有没有输出。

能跑通,环境就没问题。

在这里插入图片描述

第二阶段:学会找东西——元素定位(核心技能,3天)

做价格监控,第一步是能定位到淘宝搜索框、商品列表、价格标签。

影刀找元素的方法就四种,我按使用频率排:

元素捕获(最常用)

打开淘宝首页,在影刀里点"元素捕获",鼠标移到搜索框上。

影刀会自动识别输入框的属性。存到元素库,以后在流程里直接选"淘宝搜索框"就行。

XPath与CSS选型指南

当元素捕获不够用时就得手写定位。

XPath写法:

//input[@id='q']                          # 淘宝搜索框
//div[@class='price']/span[2]             # 商品价格
//a[contains(@class,'title')]             # 商品标题,class是动态的
//div[@class='item'][1]//div[@class='price']  # 第一个商品的价格
//span[text()='月销量']/preceding-sibling::span  # 月销量数字
//div[@data-index='0']//span[@class='price-value']  # 数据属性定位

CSS选择器:

#q                                        /* id选择器 */
.price > span                             /* 子元素 */
a.title-link                              /* class选择器 */
div.item div.price                        /* 后代选择器 */
input[placeholder*="搜索"]                /* 属性模糊匹配 */
div.item:nth-child(2)                     /* 第二个商品 */
div.item:first-child .price               /* 第一个商品价格 */
.sku-item.selected                        /* 组合选择器 */

你问我选哪个?项目初期用CSS(简短好读),遇到复杂父子关系用XPath(轴定位更强)。

我第一次做价格监控,发现商品标题的class是随机字符串,CSS直接类名匹配失效了。

排查后发现XPath的 contains() 可以模糊匹配,换XPath就解决了。

正则的3个实战场景

采集的价格可能是"¥59.90"这种格式,要提取出数字59.90。

在这里插入图片描述

import re
price = re.findall(r'\d+\.?\d*', '¥59.90')[0]  # 得到 "59.90"

商品链接里的商品ID:

item_id = re.findall(r'id=(\d+)', url)[0]

清洗拼多多标题中的活动标签:

clean_title = re.sub(r'【.*?】', '', title)

第三阶段:数据存取(2天)

变量类型速记

做价格监控常用的变量类型:

price = 59.90           # 浮点数存价格
title = "连衣裙夏季"     # 字符串存标题
is_lowest = True        # 布尔存状态
urls = ["url1","url2"]  # 列表存多个商品链接
product = {
    "title": "连衣裙",
    "price": 59.90,
    "shop": "某某旗舰店",
    "history": [69.90, 65.00, 59.90]  # 历史价格
}

字典的键不要用中文——这个坑我踩过。影刀Python引擎下,中文字典键在部分操作里会报 KeyError

Excel读写——价格监控的核心存储

拼多多店群自动化上架方案

读取监控列表: 你的Excel里存了要监控的商品链接,用"读取Excel"指令整列读取。

excel = xbot.app.excel.get_active()
sheet = excel.get_active_sheet()
url_list = sheet.get_range("A2:A50")  # 从第2行开始读

写入价格记录: 每次采集完,把数据追加到Excel。

# 表头:日期 | 商品名称 | 当前价格 | 昨日价格 | 差值 | 链接
for product in all_results:
    sheet.write_row(row, ["2025-01-15", product["title"], 
                           product["price"], product["yesterday_price"],
                           product["diff"], product["url"]])
    row += 1

文本清洗

在这里插入图片描述

淘宝价格有时显示"¥59.90-89.90"这样的区间,需要提取最低价。

if "-" in price_text:
    min_price = float(price_text.split("-")[0].replace("¥", ""))

JSON处理

如果用淘宝/拼多多的接口直接获取数据,返回的是JSON。

import json
response_data = json.loads(接口返回文本)
price = response_data["data"]["item"]["price"]

数据库存储(进阶)

价格监控数据量大的时候用数据库更好管理。

import sqlite3
conn = sqlite3.connect("price_monitor.db")
conn.execute("""
    CREATE TABLE IF NOT EXISTS price_history (
        id INTEGER PRIMARY KEY,
        product TEXT,
        price REAL,
        date TEXT
    )
""")
conn.execute("INSERT INTO price_history VALUES (NULL,?,?,?)",
             (product["title"], product["price"], "2025-01-15"))
conn.commit()
conn.close()

数据库连接的5个常见报错一定要记:

  1. no such table — 忘了建表,先执行CREATE TABLE
  2. database is locked — 上一次操作没 conn.close(),后面全卡住
  3. UNIQUE constraint failed — 主键冲突,用 INSERT OR REPLACE
  4. OperationalError: near "xxx": syntax error — SQL语句多了或少了个引号/逗号
  5. sqlite3.ProgrammingError — 连接已经关了还在操作数据,检查close()的位置

第四阶段:流程控制——让脚本有脑子(3天)

循环的五种形态

价格监控用得最多的是这三种:

For次数循环: 知道今天要检查20个商品,循环20次。

ForEach列表循环: 遍历商品链接列表,一个个打开查看。

for url in url_list:
    打开网页(url)
    提取价格()
    保存数据()

While条件循环: 翻页用。淘宝搜索结果的翻页不确定有几页,用While配合"下一页"按钮状态判断。

在这里插入图片描述

while True:
    采集当前页商品价格()
    
    下一页按钮 = 查找元素("下一页")
    if "disabled" in 下一页按钮.get_attribute("class"):
        break
    点击(下一页按钮)
    sleep(2)

If判断的妙用

同一个页面,价格显示格式可能不同。

price_element = 查找元素("价格")

if price_element is None:
    # 用图像识别找价格
    price = ocr_识别价格()
elif "¥" in price_element.text:
    price = float(price_element.text.replace("¥", ""))
else:
    # 可能是区间价
    price = 处理区间价(price_element.text)

Try-Catch救命

网络波动、页面改版、反爬弹出验证码——这些都会导致流程中断。

for url in url_list:
    try:
        打开网页(url)
        提取价格()
        保存到Excel()
    except Exception as e:
        print("商品{}采集失败:{}".format(url, str(e)))
        写入错误日志(url, str(e))
        continue  # 跳过这个,继续下一个

我第一次做价格监控跑了3天就停了,因为某个商品下架了,程序直接崩溃。

加了Try-Catch之后连续跑了一个月没断过。

第五阶段:网页自动化进阶(3天)

等待策略

淘宝、拼多多这类大站,页面加载速度不稳定。

三种等待策略混着用:

# 策略1:固定等待
sleep(3)

# 策略2:等待元素出现——等搜索结果加载
等待元素出现("商品列表容器", timeout=10)

# 策略3:等待元素消失——等loading遮罩消失
等待元素消失("加载中", timeout=15)

我的习惯是:固定等待只用在不需要精确操作的间隙;核心操作前后用元素等待。

弹窗处理五步法

电商网站弹窗特别多——登录弹窗、活动弹窗、优惠券弹窗…

在这里插入图片描述

def 处理所有弹窗():
    # Step 1: 检测
    弹窗元素列表 = 查找所有元素("弹窗关闭按钮")
    
    for 弹窗 in 弹窗元素列表:
        # Step 2: 点关闭
        try:
            点击(弹窗)
        except:
            # Step 3: 图像识别找X
            try:
                win32.image.click("关闭图标")
            except:
                # Step 4: 按Esc
                按ESC键()
    # Step 5: 确认所有弹窗已消失
    等待元素消失("弹窗遮罩", timeout=3)

翻页的disabled class判断

淘宝搜索结果翻到底,下一页按钮变成灰色不能点。

def 有没有下一页():
    按钮 = 查找元素("下一页")
    class_attr = 按钮.get_attribute("class")
    return "disabled" not in class_attr

懒加载处理

拼多多的商品列表是懒加载的,滚到哪加载到哪。

last_count = 0
while True:
    采集可见商品()
    current_count = len(已采集列表)
    if current_count == last_count:
        break  # 数量没变,说明到底了
    last_count = current_count
    页面滚动到底部()
    sleep(2)

iframe处理

有些后台管理系统的商品编辑页面在iframe里。

先"切换到iframe"→操作iframe内元素→"切回主页面"。

窗口切换

点击商品链接可能打开新标签页。用"切换网页窗口"按标题切换到新标签,操作完再切回来。

第六阶段:硬件操作(2天)

模拟vs驱动模式

做价格监控,网页操作用驱动模式就行——速度快。

但如果想截商品图片存证据,驱动模式的截图可能和实际显示不一样,这时候用模拟模式截图。

图像识别做兜底

在这里插入图片描述

有些按钮没法用元素定位——比如拼多多的某些按钮是纯图片。

from xbot import win32

# 等待"价格保护"按钮出现
win32.image.wait_appear("价格保护图标", timeout=10)

# 点击按钮右下角(避免点到文字上)
win32.image.click("价格保护图标", anchor=('bottomRight', 5, 5))

# 鼠标悬停在价格图上
win32.image.hover("价格图表", anchor=('middleCenter', 0, 0))

锚点9位置加上偏移量,能精准点击任何图片的任何位置。

键盘操作

搜索时输入了关键词,回车触发搜索——按键("Enter")

截图时按Ctrl+S保存——按键("Ctrl+S")

第七阶段:进阶武器库(一周)

HTTP请求直抓接口

这个方法比模拟网页快10倍不止。

打开浏览器的F12开发者工具,切到Network标签,搜索一个商品,看哪个XHR请求返回了价格数据。

import requests

url = "https://api.example.com/item/detail?id=123"
headers = {
    "User-Agent": "Mozilla/5.0 ...",
    "Cookie": "从浏览器复制"
}

resp = requests.get(url, headers=headers)
data = resp.json()
price = data["data"]["item"]["price"]

Python协同

写复杂的逻辑用Python代码块。

# 自定义函数:计算价格变化百分比
def calc_change(today, yesterday):
    if yesterday == 0:
        return 0
    return round(((today - yesterday) / yesterday) * 100, 2)

change = calc_change(59.90, 69.90)  # -14.32%

跨模块调用:from . import tools 引用你封装好的工具函数。

OCR识别价格图

有些店铺的价格写在图片上而不是文本里。

在这里插入图片描述

影刀的OCR能从截图中识别数字。

截图保存("价格区域.png")
price_text = ocr_识别("价格区域.png")
price = float(re.findall(r'\d+\.?\d*', price_text)[0])

ADB手机自动化

监控手机端的价格——电商App的价格有时候和网页不一样。

from xbot import mobile

session = mobile.connect_by_custom_name("我的手机")
session.find_by_xpath("//android.widget.TextView[@text='淘宝']").click()
session.find_by_id("com.taobao.taobao:id/search_edit").send_keys("连衣裙")
session.swipe(500, 1200, 500, 200)  # 向上翻

第八阶段:平台实战——淘宝+拼多多

淘宝价格监控流程

打开淘宝首页
  → 处理可能弹出的登录弹窗
  → 在搜索框输入商品名称
  → 按回车搜索
  → 等待结果加载
  → 循环商品列表
      → 提取标题、价格、月销量、店铺名
      → 和昨日价格比较
      → 如果降价超过10%则标记
  → 判断有没有下一页(看disabled)
      → 有就继续翻
  → 写入Excel
  → 有降价商品则发送飞书通知

拼多多价格监控

和淘宝基本一样,区别:

  • 拼多多搜索结果页的结构不同,class命名规范不一样
  • 拼多多反爬更严,等待时间要更长
  • 拼多多的"下一页"翻页用按钮文本判断更稳

两个平台各写一套选择器,其他逻辑完全复用。

第九阶段:系统联动——让流程自己跑、自己通知

飞书消息通知

TEMU店群如何管理运营?

价格降了自动发飞书消息给你。

在飞书群里添加自定义机器人,拿webhook地址。

在这里插入图片描述

import requests

webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"

msg = {
    "msg_type": "interactive",
    "card": {
        "header": {"title": {"content": "价格监控提醒", "tag": "plain_text"}},
        "elements": [{"content": "商品{}降价了!从{}降到{}".format(
                         product, old_price, new_price), "tag": "plain_text"}]
    }
}

requests.post(webhook, json=msg)

飞书多维表格

数据量大的时候,飞书多维表格比Excel更适合做历史记录。

影刀的飞书多维表格指令支持直接写入记录。

邮件通知

配置SMTP后可以发邮件。

用QQ邮箱的话需要开启SMTP服务获取授权码。

定时任务

在影刀控制台配置定时任务,让价格监控每天自动跑。

设置每天上午9点执行,跑完后发飞书通知。

第十阶段:工程化——写出能维护的流程

子流程封装

一个价格监控流程可能有上百条指令,全部铺在主流程里是灾难。

拆分子流程:

主流程
 ├── 读取监控列表
 ├── 处理所有弹窗(子流程)
 ├── 循环采集商品
 │    ├── 打开商品页面(子流程)
 │    ├── 提取价格(子流程)
 │    └── 比较历史价格(子流程)
 ├── 写入Excel(子流程)
 └── 发送通知(子流程)

调试断点

运行报错时,在出错指令前打断点。

在这里插入图片描述

点击指令行号后面的空白处,出现橙色点就是断点。

重新运行,程序停住后看"调试变量"面板。

我第一次做价格监控时遇到 Can not convert Array to String 的报错。

打断点后发现循环读取Excel时,循环项变量是个列表而不是单个值——因为我设置了循环"多列",应该设置循环"单列"。

改了之后就可以了。

这个报错的核心原因:你把一个数组(列表)传给了一个只接受字符串的参数。

命名规范

  • 变量:product_namecurrent_pricehistory_prices
  • 子流程:提取商品价格比较历史最低发送降价通知
  • 注释写在关键步骤前

版本选择

社区版免费,个人用足够。创业版多了团队协作。企业版有权限管理和私有化部署。新手起步用社区版。

流程模板

价格监控的框架可以复用给任何采集类项目:

准备数据→打开网页→处理弹窗→循环采集→数据处理→存储→通知→退出

把商品链接换成其他内容,就是一个通用采集器模板。

附:常见报错速查

元素定位失败:
可能原因:页面没加载完、元素在iframe里、选择器用了动态class。
排查顺序:加等待→查F12→换成contains写法。

XPath语法报错:
最常见的错误:函数名写错(contians不是contains)、中文引号([class='标题'])—换英文、漏了@符号。
在这里插入图片描述

Excel Array to String:
把列表直接写进单元格了。Excel一个单元格只能存一个值。取列表第一项或逐个写入。

Excel日期偏移:
影刀读Excel日期可能偏一天。用日期格式化统一处理。

数据库连接失败:
5种常见报错:no such table、database is locked、UNIQUE约束冲突、OperationalError语法错误、已关闭连接继续操作。

弹窗拦截:
电商网站的弹窗最烦。5步流程多练几遍形成肌肉记忆。

无限循环:
While忘了写退出条件。写循环前先想清楚什么时候停。

图像识别失败:
图片库的截图分辨率和当前屏幕不匹配。重新截图,确保分辨率一致。

关于学习资源,影刀官方文档是最全的。还有一个 home.linyan.cloud 上面整理了不少实战合集,可以翻翻看看有没有对口味的内容。

#影刀RPA #RPA教程 #学习路线 #价格监控 #自动化

作者:林焱

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐