TEMU(拼多多跨境)卖家经常需要批量上架商品,或者采集竞品的价格、销量数据。
但TEMU的后台是英文界面,元素定位比国内站复杂,而且有反爬机制。
这篇文章讲两个实战流程:一是从Excel批量上架商品到TEMU,二是采集TEMU商品列表数据。
全程使用稳定的XPath(基于文本和属性,避免动态class),并处理验证码和登录态。
一、流程概览
- 上架流程:读取Excel商品数据 → 登录TEMU卖家中心 → 逐个填写商品信息 → 提交
- 采集流程:搜索关键词 → 滚动加载商品列表 → 采集标题/价格/销量 → 导出Excel
二、前置准备:登录态保持
TEMU后台登录有时需要验证码或邮箱验证。
建议在影刀浏览器里手动登录一次,勾选“记住登录状态”,然后影刀流程直接使用这个登录态。
操作步骤:
- 打开影刀浏览器,访问TEMU卖家中心登录页
- 手动输入账号密码,完成验证
- 登录成功后,关闭浏览器(不要点退出)
- 在影刀流程中用“打开网页”指令,会自动携带之前的cookie
影道指令精确名称:“打开网页”如果不指定“清除cookie”,会复用浏览器的登录态。
三、批量上架商品(从Excel读取)
场景: 你有一个Excel表格,列包括:商品标题、价格、库存、描述、图片链接。
需要自动登录TEMU后台,逐个创建商品。
第一步:读取Excel数据
# 打开Excel,读取所有行(跳过表头)
打开Excel("C:/temu_products.xlsx") → 【Excel对象】
读取区域数据到列表(【Excel对象】, 起始行=2) → 【商品数据列表】
关闭Excel(【Excel对象】)
# 【商品数据列表】是一个二维列表,每行是一个商品
第二步:进入商品发布页面
TEMU卖家中心的商品发布入口通常是“Add Product”或“发布商品”。
# 捕获元素:商品管理菜单(基于文本)
//span[contains(text(),'Products')]
# 捕获元素:添加商品按钮
//button[contains(text(),'Add Product')]
# 或者
//a[contains(@href, 'add-product')]
# 流程
打开网页("https://seller.temu.com")
等待元素出现(商品管理菜单, 10)
点击元素(商品管理菜单)
等待元素出现(添加商品按钮, 5)
点击元素(添加商品按钮)
等待元素出现(商品标题输入框, 10)
第三步:循环填写商品信息
ForEach列表循环(【商品数据列表】):
【当前商品】 = 当前循环项 # 是一个列表,索引对应各列
【标题】 = 获取列表元素(【当前商品】, 0)
【价格】 = 获取列表元素(【当前商品】, 1)
【库存】 = 获取列表元素(【当前商品】, 2)
【描述】 = 获取列表元素(【当前商品】, 3)
【图片链接】 = 获取列表元素(【当前商品】, 4)

# 填写标题
输入文本(标题输入框, 【标题】)
# 填写价格(注意TEMU价格单位是美元)
输入文本(价格输入框, 【价格】)
# 填写库存
输入文本(库存输入框, 【库存】)
# 填写描述(可能要用模拟输入,因为有字数统计)
模拟输入(描述输入框, 【描述】, 逐字间隔=10)

# 上传图片:TEMU支持URL上传或本地文件
# 方法1:如果支持URL,直接填入图片链接
输入文本(图片URL输入框, 【图片链接】)
# 方法2:需要下载图片再上传,用“上传文件”指令
# 下载文件(【图片链接】, "C:/temp.jpg")
# 点击元素(上传图片按钮)
# 上传文件(文件路径="C:/temp.jpg")
# 点击“保存”或“提交”
点击元素(保存按钮)
# 等待保存成功提示出现
等待元素出现(成功提示, 超时时间15)
# 点击“继续添加”或“添加下一个”
点击元素(继续添加按钮)
# 重置页面,等待下一个商品表单加载
等待元素出现(标题输入框, 10)
容易踩坑:
TEMU的商品表单可能有必填字段没填(如品牌、分类),提交时会报错。
建议在Excel里把必填字段都准备好,或者在流程里用默认值填充。
影道指令精确名称:“上传文件”指令在“界面操作”分类下,可以模拟选择本地文件上传。
四、采集TEMU商品列表数据
场景: 搜索某个关键词,采集商品标题、价格、已售数量、店铺名。
第一步:搜索关键词
# 捕获元素:搜索框(TEMU前台)
//input[@placeholder='Search...' or @name='search']
# 捕获元素:搜索按钮
//button[@type='submit']
打开网页("https://www.temu.com")
输入文本(搜索框, "phone case")
点击元素(搜索按钮)
等待元素出现(第一个商品卡片, 超时时间10)
第二步:滚动加载(TEMU也是瀑布流)
参考小红书滚动加载逻辑,但TEMU的滚动加载更稳定,可以直接用。
【上次数量】 = 0
【连续无新增】 = 0
【最大滚动次数】 = 20
条件循环(当【连续无新增】 < 3 and 【滚动次数】 < 【最大滚动次数】):
获取相似元素列表(商品卡片) → 【卡片列表】
【当前数量】 = 获取列表长度(【卡片列表】)
如果 【当前数量】 > 【上次数量】:
【上次数量】 = 【当前数量】
【连续无新增】 = 0
否则:
【连续无新增】 = 【连续无新增】 + 1
滚动到页面底部()
固定等待(2)
【滚动次数】 = 【滚动次数】 + 1
第三步:采集卡片字段
TEMU的商品卡片结构相对规整,以下是稳定的XPath(基于文本和class固定部分)。
# 商品卡片父级
//div[contains(@class, 'product-card')]
# 标题(在卡片内)
.//div[contains(@class, 'title')]//a
# 价格(TEMU显示格式如 $1.99)
.//div[contains(@class, 'price')]//span
# 已售数量(如 "1.2K sold")
.//div[contains(@class, 'sold')]//span
# 店铺名
.//div[contains(@class, 'store-name')]//span
# 采集循环
获取相似元素列表(商品卡片) → 【最终卡片列表】
ForEach列表循环(【最终卡片列表】):
获取元素文本(当前循环项, ".//div[contains(@class,'title')]") → 【标题】
获取元素文本(当前循环项, ".//div[contains(@class,'price')]//span") → 【价格】
获取元素文本(当前循环项, ".//div[contains(@class,'sold')]") → 【销量】
获取元素文本(当前循环项, ".//div[contains(@class,'store-name')]") → 【店铺】
# 清洗价格(去掉$符号)
替换文本(【价格】, "$", "") → 【价格】
# 清洗销量(提取数字)
提取文本中间(【销量】, "", " sold") → 【销量数字】 # 或用正则
# 写入Excel
追加一行数据到表格(【Excel对象】, 数据=[【标题】, 【价格】, 【销量数字】, 【店铺】])
影道指令精确名称:“提取文本中间”可以提取固定前后的内容。如果销量格式是“1.2K sold”,提取“ sold”前面的部分。
五、处理TEMU的反爬和验证码
TEMU对自动化工具比较敏感,频繁操作可能弹出验证码或IP限制。
应对策略:
- 降低操作频率:每次点击或滚动后加0.5-1秒随机等待
- 使用代理IP:如果采集量大,建议购买住宅代理
- 验证码处理:用“判断元素是否存在”检测验证码,如果出现则暂停并发送通知(飞书/钉钉),手动处理后继续
# 验证码检测
判断元素是否存在(验证码图片) → 【有验证码】
如果 【有验证码】:
输出日志("检测到验证码,暂停流程,请手动处理")
发送飞书消息(webhook, "TEMU验证码需要手动处理")
固定等待(60) # 给你时间手动处理
# 也可以设置循环等待,直到验证码消失
条件循环(当 【有验证码】):
固定等待(10)
判断元素是否存在(验证码图片) → 【有验证码】
影道版本差异:创业版以上支持飞书/钉钉指令,社区版可以用“输出日志”替代。
六、完整流程代码框架(采集版)
# A01_TEMU商品采集
# 初始化
打开Excel("C:/temu_products.xlsx", 可见=False) → 【Excel对象】
写入行数据(第1行, ["标题","价格","销量","店铺"])
# 打开TEMU并搜索
打开网页("https://www.temu.com")
等待元素出现(搜索框, 10)
输入文本(搜索框, "phone case")
点击元素(搜索按钮)
等待元素出现(商品卡片, 10)
# 滚动加载
【上次数量】 = 0
【连续无新增】 = 0
【滚动次数】 = 0
条件循环(当【连续无新增】 < 3 and 【滚动次数】 < 20):
获取相似元素列表(商品卡片) → 【卡片列表】
【当前数量】 = 列表长度(【卡片列表】)
如果 【当前数量】 > 【上次数量】:
【上次数量】 = 【当前数量】
【连续无新增】 = 0
否则:
【连续无新增】 = 【连续无新增】 + 1
如果 【连续无新增】 < 3:
滚动到页面底部()
固定等待(2)
【滚动次数】 = 【滚动次数】 + 1
# 采集
获取相似元素列表(商品卡片) → 【最终卡片】
ForEach列表循环(【最终卡片】):
Try:
获取元素文本(当前循环项, ".//div[contains(@class,'title')]") → 【标题】
获取元素文本(当前循环项, ".//div[contains(@class,'price')]//span") → 【价格】
获取元素文本(当前循环项, ".//div[contains(@class,'sold')]") → 【销量】
获取元素文本(当前循环项, ".//div[contains(@class,'store-name')]") → 【店铺】
# 清洗
替换文本(【价格】, "$", "")
【销量数字】 = 提取文本中间(【销量】, "", " sold")
if 【销量数字】 == "": 【销量数字】 = "0"
追加一行数据到表格(【Excel对象】, 数据=[【标题】, 【价格】, 【销量数字】, 【店铺】])
Catch:
输出日志("采集单个商品失败,跳过")
保存Excel(【Excel对象】)
关闭Excel(【Excel对象】)
输出日志("采集完成")
七、常见问题速查
| 问题 | 解决方法 |
|---|---|
| TEMU卖家中心登录需要验证码 | 提前手动登录并保持cookie;或接入打码平台 |
| 商品上架时提示“分类未选” | 在Excel中增加分类列,流程中用“选择下拉选项”指令 |
| 采集到的价格带货币符号 | 用“替换文本”去掉$、€等符号 |
| 滚动加载到底部后没有新商品 | 可能是IP被限,换代理或降低频率 |
| 上传图片失败 | 确保图片URL可访问;或先下载到本地再上传 |
| 商品描述中包含特殊字符导致提交失败 | 用Python正则过滤掉emoji或控制字符 |
| 批量上架时中途失败,如何断点续传 | 记录已成功的行数,下次从失败行开始。用全局变量保存进度 |
推荐资源
- TEMU卖家中心官方帮助文档(英文):了解商品发布字段要求
- 影刀社区搜索“TEMU”,有用户分享的采集模板
- 代理IP推荐:Bright Data(原Luminati)或911.re(住宅代理)
- 打码平台:超级鹰、图鉴,可以自动识别验证码(需额外费用)
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
