做拼多多店群或者竞品分析,每天要盯几十个关键词的搜索结果。
手动复制粘贴效率太低,用影刀RPA可以自动搜索、翻页、采集商品标题/价格/销量,最后存到Excel。
我把整个流程拆成4个核心模块: 搜索关键词 → 采集当前页商品列表 → 翻页 → 写入Excel。
每个模块都有稳定的元素定位和翻页处理,照着搭就能跑通。
一、整体流程设计
| 步骤 | 子流程 | 核心指令 |
|---|---|---|
| 1 | A01_打开拼多多并搜索 | 打开网页、输入文本、点击搜索 |
| 2 | B01_采集当前页商品数据 | 获取相似元素列表、提取标题/价格/销量 |
| 3 | B02_翻页到下一页 | 判断下一页按钮是否存在、点击、等待新页面 | | 4 | C01_写入Excel并保存 | 创建文件、追加行、保存关闭 |
注意: 拼多多搜索页是传统的“下一页”按钮翻页,不是滚动加载,比小红书简单。
二、第一步:打开拼多多并搜索关键词
操作步骤
-
打开拼多多首页
指令:打开网页,URL填https://www.pinduoduo.com -
等待搜索框加载
捕获搜索框元素(首页中部)
# 拼多多首页搜索框
//input[@class='search-input']
- 输入关键词并搜索
- 用
输入文本指令,内容设为变量关键词
- 用
- 用
模拟按键(enter)或点击“搜索”按钮
# 搜索按钮
//button[contains(@class,'search-btn')]
- 等待搜索结果页加载完成
等待商品卡片出现
# 商品卡片父容器
//div[@data-testid='goods-card']
批量搜索多个关键词
如果有关键词列表(从Excel读取),外层套一个循环:
关键词列表 = 读取Excel列数据("A2:A10")
循环遍历列表(关键词列表, 当前词)
输入文本(搜索框, 当前词)

点击搜索按钮
等待元素出现(商品卡片, 5秒)
调用子流程(采集当前页数据)
三、第二步:采集当前页商品数据
捕获关键元素(基于商品卡片父容器)
先捕获一个商品卡片作为父元素,然后基于它用相对路径捕获子元素。
# 父元素:商品卡片
//div[@data-testid='goods-card']
# 子元素:商品标题(基于卡片)
.//a[contains(@class,'title')]
# 子元素:价格(拼多多价格在 span 里)
.//span[contains(@class,'price')]
# 子元素:销量(“已拼10万+件”)
.//div[contains(@class,'sales')]
采集逻辑
# 获取当前页所有商品卡片
商品卡片列表 = 获取相似元素列表(商品卡片父元素)

当前页数据 = [] # 存储本页的商品行
循环遍历列表(商品卡片列表, 当前卡片)
标题 = 获取元素文本(当前卡片, ".//a[contains(@class,'title')]")
价格 = 获取元素文本(当前卡片, ".//span[contains(@class,'price')]")
销量原始 = 获取元素文本(当前卡片, ".//div[contains(@class,'sales')]")
# 清洗销量(去掉“已拼”和“件”,只保留数字)
销量数字 = 正则提取(销量原始, "\\d+")
如果 销量数字 == "" 则 销量数字 = "0"
追加到列表(当前页数据, [标题, 价格, 销量数字])
处理价格和销量格式
价格示例: ¥99.00 → 清洗后 99.00
销量示例: 已拼10万+件 → 清洗后 100000(需要处理“万”)
可以用Python代码清洗:
import re
# 清洗价格(去掉¥符号)
price_clean = re.sub(r'[^0-9.]', '', price_raw)
# 清洗销量(处理“万”)
sales_raw = "已拼10万+件"
if '万' in sales_raw:
num = re.search(r'(\d+(?:\.\d+)?)', sales_raw).group(1)
sales_clean = int(float(num) * 10000)
else:
sales_clean = int(re.search(r'\d+', sales_raw).group(0))
四、第三步:翻页到下一页
拼多多搜索页有明确的“下一页”按钮,最后一页按钮会变成灰色或消失。
捕获下一页按钮
# 下一页按钮(未禁用状态)
//a[contains(@class,'next') and not(contains(@class,'disabled'))]
翻页循环逻辑
当前页码 = 1
最大页码 = 20 # 防护
循环 当 当前页码 <= 最大页码
输出日志("正在采集第" + 当前页码 + "页")
# 采集当前页数据
调用子流程(B01_采集当前页, 输出={本页数据: 页数据})
全部数据 = 全部数据 + 页数据
# 判断是否有下一页
判断元素是否存在(下一页按钮, 有下一页)
如果 有下一页 == False
输出日志("已到最后一页,停止翻页")
跳出循环
# 点击下一页
鼠标点击(下一页按钮, 点击方式=模拟点击) # 拼多多反爬,用模拟点击更稳
# 等待新页面的商品卡片出现
等待元素出现(商品卡片, 8秒, 超时)
如果 超时 == True
输出日志("翻页超时,停止")
跳出循环
当前页码 = 当前页码 + 1
翻页注意事项
- 拼多多翻页后URL会变(
page=2),也可以用URL拼接法(参考选题池16号) - 点击下一页后必须等待新页面的商品卡片,不要用固定等待
- 如果翻页后元素高亮位置偏移,加
滚动到元素指令
五、第四步:写入Excel
创建Excel文件并写入表头
创建Excel文件("C:\拼多多采集结果.xlsx") # 如果文件不存在
打开Excel("C:\拼多多采集结果.xlsx", Excel对象)
写入行数据到表格(Excel对象, "A1", ["标题", "价格", "销量"])
写入所有采集到的数据
循环遍历列表(全部数据, 单行数据)
追加行到表格(Excel对象, 单行数据)
保存并关闭
保存Excel(Excel对象)
关闭Excel(Excel对象)
输出日志("采集完成,共" + 长度(全部数据) + "条商品")
六、完整流程代码(逻辑结构)
主流程:
# 参数设置
关键词 = "运动鞋"
最大翻页数 = 10
全部数据 = []
# 1. 打开并搜索
调用子流程(A01_打开拼多多并搜索, 输入={关键词: 关键词})
# 2. 翻页循环
当前页码 = 1
循环 当 当前页码 <= 最大翻页数
输出日志("第" + 当前页码 + "页")
# 采集当前页
调用子流程(B01_采集当前页商品, 输出={本页数据: 页数据})
全部数据 = 全部数据 + 页数据
# 翻页判断
判断元素是否存在(下一页按钮, 有下一页)
如果 有下一页 == False
跳出循环
鼠标点击(下一页按钮, 点击方式=模拟点击)
等待元素出现(商品卡片, 8秒, 超时)
如果 超时 == True 则 跳出循环
当前页码 = 当前页码 + 1
# 3. 写入Excel
调用子流程(C01_写入Excel, 输入={数据: 全部数据, 文件路径: "C:\拼多多_运动鞋.xlsx"})
七、常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
捕获到的商品卡片XPath带[1] | 直接捕获了第一个卡片 | 删掉下标,保留//div[@data-testid='goods-card'] |
| 价格提取出来是空 | 价格在伪元素里或动态加载 | 等待元素出现后再取,或用获取元素属性('innerText') |
| 销量带“万”转换后不对 | 小数处理错误,如“1.2万” | 用float(数字)*10000,不要用int |
| 翻页后采集的还是第一页数据 | 没等待新页面加载完 | 等待元素出现(商品卡片) 且确保XPath不依赖页面URL |
| 拼多多弹出验证码 | 采集频率过高 | 每次翻页后随机等待3-5秒,或用代理IP |
| 社区版30分钟不够 | 翻页+等待耗时 | 减少最大翻页数(5页以内),或升级创业版 |
八、扩展功能
1. 采集商品详情页
如果需要采集商品详情(如品牌、发货地、评价数),可以在采集列表时拿到商品链接,再逐个打开详情页采集。
获取商品链接:
.//a[contains(@class,'title')]/@href
2. 按价格/销量排序
拼多多搜索页有排序按钮(综合/销量/价格)。
点击排序按钮后再采集,需要重新捕获排序后的商品列表。
# 点击“销量”排序
//div[contains(text(),'销量')]
3. 定时自动运行
配合影刀的“定时触发器”(创业版及以上),每天固定时间跑采集。
推荐资源
- 影刀官方学院: “实战案例——拼多多商品数据采集”(视频教程)
- 我的文章联动:
- 翻页详细方案:[翻页逻辑的3种实现方式(选题池16号)]
- 元素定位稳定性:[网页元素捕获的4种稳定性提升方法(选题池1号)]
- 数据清洗:[从文本中提取数据的4种方法(选题池19号)]
- 小工具: XPath Helper插件,测试拼多多页面元素XPath是否稳定
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
