影刀RPA实操指南:拼多多商品价格自动监控——降价、破价与竞品调价一手掌握
拼多多店铺运营最怕什么?
竞争对手半夜调价,你的商品排名一落千丈,第二天早上看后台才发现。
自动化方案:影刀每天定时采集竞品价格 → 与昨日对比 → 变化超过阈值就飞书告警。人在睡觉,流程在盯盘。
这篇文章是真实跑过的方案,不是理论推演。
一、方案架构
监控商品配置表(Excel) ↓ 读取待监控商品ID 遍历每个商品: ├── 拼多多搜索或直接打开商品页 ├── 抓取:商品名、当前价格、券后价、已拼数量 └── 写入今日数据表 ↓ Pandas对比昨日数据: ├── 降价超过5% → 标红告警 ├── 上新券 → 标黄提醒 └── 无变化 → 正常 ↓ 飞书推送异常商品列表 ↓ 保存今日数据作为明日基准二、监控配置表设计
商品监控配置.xlsx:
| 商品ID | 商品名称 | 监控策略 | 降价阈值 | 状态 |
|---|---|---|---|---|
| 12345678 | 夏季连衣裙 | 每日监控 | 5% | 启用 |
| 87654321 | 防晒帽 | 每日监控 | 3% | 启用 |
| 23456789 | 帆布包 | 停用 | 10% | 停用 |
核心字段讲解:
店群矩阵自动化突破运营极限!
监控策略:全部设"每日监控"。如果商品已经下架或不再竞争,直接改"停用"——流程会自动跳过。
降价阈值:不是所有商品都用同一个阈值。主推爆款降价 3% 就要告警(影响大),长尾商品 10% 才告警(调价频繁、告警太多就没意义)。
三、拼多多商品页采集核心逻辑
拼多多有反爬机制,直接用采集指令会被拦截。几个关键经验:
1. 优先用移动端URL
拼多多移动端页面比PC端简单得多,反爬也更弱。
# 移动端URL格式商品ID="12345678"移动端URL=f"https://mobile.yangkeduo.com/goods.html?goods_id={商品ID}"# 在影刀里打开网页(移动端URL)等待元素出现("商品详情页主体",5秒)2. 价格元素的定位
拼多多商品详情页的价格通常不是标准 HTML 文本,而是用特殊格式渲染。
# 通过XPath定位价格区域价格元素="//div[contains(@class, 'price')]//span[contains(text(), '¥') or contains(text(), '¥')]"获取元素文本(价格元素)→ 价格文本 # 价格文本可能是 "¥ 39.90" 或 "¥39.90起" 或 "39.9"# 需要清洗价格=re.findall(r'[\d.]+',价格文本)[0]# 提取纯数字如果是券后价,页面上通常有两个价格——原价(有删除线)和券后价(红色大字)。券后价才是真正要监控的。
# 券后价通常在一个特定class的span里券后价元素="//div[contains(@class, 'price-info')]//span[contains(@style, 'color')]"3. 已拼数量
已拼数量反映的是商品近期的销售热度。价格没变但销量暴涨 → 说明竞品在做其他促销(投流、首页推荐位等)。
已拼元素="//span[contains(text(), '已拼')]"获取元素文本(已拼元素)→ 已拼文本# "已拼10万+件"四、数据清洗完整代码
# Python代码指令:拼多多价格数据清洗importpandasaspdimportrefromdatetimeimportdatetimedef清洗拼多多数据(原始数据列表):""" 原始数据列表格式: [ {"商品ID": "123", "商品名": "xxx", "原价": "¥39.90", "券后价": "¥29.90", "已拼": "已拼1.2万件", "采集时间": "..."}, ... ] 返回清洗后的DataFrame """df=pd.DataFrame(原始数据列表)# 价格清洗:去除¥符号和中文,转为floatdef洗价格(value):ifpd.isna(value)orvalue=="":returnNonecleaned=re.sub(r'[¥¥元起\s\u00a0]','',str(value))try:returnfloat(cleaned)except:returnNonedf["原价_数值"]=df["原价"].apply(洗价格)df["券后价_数值"]=df["券后价"].apply(洗价格)# 计算实际折扣率df["折扣率"]=round(df["券后价_数值"]/df["原价_数值"]*100,1)# 已拼数量清洗def洗已拼(value):ifpd.isna(value):return0cleaned=re.sub(r'[^\d万w\.]','',str(value))if'万'instr(value)or'w'instr(value).lower():num=re.findall(r'[\d.]+',str(value))[0]returnfloat(num)*10000try:returnfloat(cleaned)except:return0df["已拼_数值"]=df["已拼"].apply(洗已拼)# 实际卖出价格 = 券后价(有券走券后,没券用原价)df["实际价格"]=df["券后价_数值"].fillna(df["原价_数值"])# 采集时间标准化df["采集日期"]=datetime.now().strftime("%Y-%m-%d")returndf[["商品ID","商品名","实际价格","原价_数值","折扣率","已拼_数值","采集日期"]]五、价格对比与告警逻辑
# Python代码指令:价格对比分析def价格对比分析(今日数据,昨日数据,配置表):""" 对比今日和昨日价格,返回告警列表 """告警列表=[]for_,商品in今日数据.iterrows():商品ID=商品["商品ID"]# 查找昨日对应数据昨日行=昨日数据[昨日数据["商品ID"]==商品ID]if昨日行.empty:# 新加入监控的商品,跳过对比continue昨日价格=昨日行.iloc[0]["实际价格"]今日价格=商品["实际价格"]if昨日价格isNoneor今日价格isNone:continue变化率=(今日价格-昨日价格)/昨日价格*100# 获取该商品的降价阈值阈值行=配置表[配置表["商品ID"]==商品ID]if阈值行.empty:continue阈值=阈值行.iloc[0]["降价阈值"]# 判断是否触发告警if变化率<=-阈值:告警列表.append({"商品名":商品["商品名"],"昨日价格":昨日价格,"今日价格":今日价格,"变化率":f"{变化率:.1f}%","告警级别":"高"if变化率<=-10else"中",})return告警列表六、飞书告警消息
# 构建告警消息告警消息=f"🚨 拼多多价格监控告警 ({datetime.now().strftime('%m-%d %H:%M')})\n\n"iflen(告警列表)>0:foritemin告警列表:告警消息+=f"🛑{item['商品名']}\n"告警消息+=f" 价格:{item['昨日价格']}→{item['今日价格']}({item['变化率']})\n"告警消息+=f" 级别:{item['告警级别']}\n\n"[video(video-4R4Qot06-1781339810285)(type-csdn)(url-https://live.csdn.net/v/embed/524992)(image-https://v-blog.csdnimg.cn/asset/b59aed2f01d4fe8583467562aaf4dcfd/cover/Cover0.jpg)(title-temu店群自动化报活动案例)]else:告警消息+="✅ 所有监控商品价格无异常波动"# 飞书Webhook发送requests.post(飞书webhook,json={"msg_type":"text","content":{"text":告警消息}})七、定时执行设置
- 每天早上 7:00跑一次(赶在上班前拿到数据)
- 下午15:00补跑一次(捕捉下午调价)
- 周末不打烊,照常跑
双次执行的好处:有些竞品上午调价、下午又调回来。只跑一次可能错过中间的价格变化。
八、避坑笔记
坑1:拼多多多次访问触发验证码
同一商品短时间内多次访问,会被要求滑块验证。
解决方案:商品间隔 3~5 秒访问。如果触发验证码,该商品标记为"待重试",流程结束后统一用更长的间隔重试。
坑2:商品下架了
监控商品如果下架,页面会返回 404 或"商品不存在"。不要直接报错退出。捕获这个状态,标记为"已下架",继续下一个。
坑3:价格元素变化
这是拼多多的家常便饭。每个月都可能有结构微调。建议:在Catch里加一句截图,每次异常保留当时的页面截图,方便调整定位。
Try:采集商品价格()Catch:截图(f"price_error_{商品ID}.png")输出日志(f"商品{商品ID}价格采集失败,已截图")价格为None# 标记为None,告警逻辑会跳过内容标签:#影刀RPA #拼多多自动化 #价格监控 #竞品监控 #电商运营
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。