做TEMU半托管或全托管,经常需要从其他平台采集商品数据,或者批量上架商品到店铺后台。 TEMU后台是典型的跨境电商管理系统,有分页列表、多语言切换、批量操作等功能。
核心流程:登录TEMU卖家中心 → 采集在售商品数据 → 或批量上架商品(Excel导入/逐个添加)→ 异常处理。
一、整体流程结构
| 子流程 | 功能 |
|---|---|
| A_Main | 主流程调度 |
| B01_Login | 登录TEMU卖家中心 |
| C01_CollectProductList | 采集商品列表(分页) |
| C02_BatchUpload | 批量上架商品(读Excel→填表单) |
| D01_ExportResult | 导出操作结果 |
社区版提醒: TEMU后台加载较慢,建议等待时间设长一些(5-8秒),避免元素找不到。
二、步骤1:登录TEMU卖家中心
TEMU卖家中心地址通常为 https://seller.temu.com 或 https://seller.temu.com/login。
登录需要邮箱/手机号+验证码,或者扫码。
# B01_Login 子流程

打开网页:"https://seller.temu.com/login",打开方式=新建标签页
# 判断是否已登录(检查“店铺名称”或“订单”菜单)
判断元素是否存在://div[contains(@class,'shop-name')] → 存入“已登录”

如果 已登录 == False
# 点击“邮箱登录”或“手机号登录”(根据页面)
点击元素://div[contains(text(),'邮箱登录')]
# 输入账号密码
输入文本://input[@placeholder='邮箱/手机号'],内容={账号}
输入文本://input[@type='password'],内容={密码}
# 点击登录按钮
点击元素://button[contains(text(),'登录')]
# 等待可能的二次验证(短信/邮箱验证码)
等待元素出现://input[@placeholder='验证码'],超时3秒
输出日志:"请输入验证码,等待30秒"
固定等待:30秒
点击元素://button[contains(text(),'确认')]
# 等待后台首页加载完成
等待元素出现://div[contains(@class,'dashboard')] 或 //span[contains(text(),'商品管理')],超时10秒
输出日志:"登录成功"
注意: TEMU登录可能有滑块验证,需要人工介入或使用第三方打码。建议首次登录时手动过验证,保持cookie。
三、场景A:采集在售商品列表
进入“商品管理”→“在售商品”,通常是分页表格。
操作步骤
- 进入商品列表页
- 获取当前页表格行
- 循环每行提取:商品ID、名称、价格、库存、状态
- 翻页到最后一页
# C01_CollectProductList 子流程
# 导航到商品列表
点击元素://span[contains(text(),'商品管理')]
点击元素://a[contains(text(),'在售商品')]
等待元素出现://table[@class='goods-table'] 或 //div[contains(@class,'goods-list')],超时8秒
设置变量:全部商品 = []
设置变量:当前页 = 1
设置变量:还有下一页 = True
循环条件:还有下一页 == True
# 获取当前页表格行(通常每行是一个商品)
获取相似元素列表://table/tbody/tr → 存入“行列表”
# 循环处理每一行
循环列表:行列表,循环变量=当前行
Try
# 在当前行下查找各字段
在当前元素下查找元素:.//td[1]//span[@class='goods-id'] → 获取文本 → 商品ID
在当前元素下查找元素:.//td[2]//a[@class='goods-name'] → 获取文本 → 商品名
在当前元素下查找元素:.//td[3]//span[@class='price'] → 获取文本 → 价格
在当前元素下查找元素:.//td[4]//span[@class='stock'] → 获取文本 → 库存
在当前元素下查找元素:.//td[5]//span[@class='status'] → 获取文本 → 状态
全部商品.append([商品ID, 商品名, 价格, 库存, 状态])
Catch
输出日志:"提取单行失败,跳过"
# 翻页判断
判断元素是否存在://a[contains(text(),'下一页') and not(contains(@class,'disabled'))] → 存入“可翻页”
如果 可翻页 == True
点击元素://a[contains(text(),'下一页')]
等待元素出现://table/tbody/tr,超时8秒

当前页 = 当前页 + 1
输出日志:"进入第{当前页}页"
否则
还有下一页 = False
输出日志:"共采集{全部商品的长度}条商品"
设置输出参数:商品列表 = 全部商品
TEMU表格列数可能变化,用“捕获元素”定位实际列。
四、场景B:批量上架商品
从Excel读取商品数据(标题、价格、库存、图片链接等),逐个添加到TEMU后台。
流程拆分
- 读取Excel商品数据
- 点击“添加商品”按钮
- 填写商品表单(多步骤:基本信息、规格、图片、运费)
- 提交并记录结果
# C02_BatchUpload 子流程
# 1. 读取Excel数据
Excel Workbook打开:文件"C:\temu_upload.xlsx" → 工作簿
读取区域数据到列表:起始"A2",结束"F" → 存入“商品数据列表”
Excel Workbook关闭
输出日志:"共{商品数据列表的长度}条待上架商品"
# 2. 循环上架
设置变量:成功数 = 0
设置变量:失败数 = 0
设置变量:失败记录 = []
循环列表:商品数据列表,循环变量=一行
# 一行数据示例:[商品名, 价格, 库存, 分类, 主图链接, 描述]
Try
# 点击“添加商品”
点击元素://button[contains(text(),'添加商品')]
等待元素出现://div[@class='goods-form'],超时5秒
# 填写基本信息
输入文本://input[@name='goods_name'],内容={一行[0]},清空
输入文本://input[@name='price'],内容={一行[1]},清空
输入文本://input[@name='stock'],内容={一行[2]},清空
# 选择分类(可能是下拉框)
点击元素://div[@class='category-select']
等待元素出现://li[contains(text(),{一行[3]})] → 点击
# 上传图片(需要文件路径,提前准备图片)
# 注意:TEMU图片上传可能需要用“模拟输入”填入本地路径
# 或者用“上传文件”指令
上传文件://input[@type='file'],文件路径="{一行[4]}"
等待元素消失://div[contains(text(),'上传中')],超时30秒
# 点击提交
点击元素://button[contains(text(),'提交')]
等待元素出现://div[contains(text(),'提交成功')],超时10秒
成功数 = 成功数 + 1
输出日志:"上架成功:{一行[0]}"
# 可选:关闭成功提示
点击元素://button[contains(text(),'关闭')]
Catch
失败数 = 失败数 + 1
失败记录.append([一行[0], 异常信息])
输出日志:"上架失败:{一行[0]},原因:{异常信息}"
# 尝试关闭可能弹窗
判断元素是否存在://button[contains(text(),'取消')]
如果存在,点击取消
Finally
# 每个商品后休息2-3秒,避免风控
固定等待:随机(2,3)
# 输出结果
输出日志:"批量上架完成:成功{成功数},失败{失败数}"
设置输出参数:失败记录列表 = 失败记录
五、EXCEL上架模板示例
| A(商品名) | B(价格) | C(库存) | D(分类) | E(主图路径) | F(描述) |
|---|---|---|---|---|---|
| 女士T恤 | 19.99 | 100 | 女装 | D:\images\t1.jpg | 纯棉透气 |
| 男士短裤 | 29.99 | 50 | 男装 | D:\images\t2.jpg | 夏季新款 |
注意: 图片路径必须是本地绝对路径,且图片格式、大小符合TEMU要求(通常≤2MB,jpg/png)。
六、关键XPath参考
# TEMU卖家中心常见元素(仅供参考,实际需捕获)
# 登录页
邮箱输入框://input[@type='email' or @name='email']
密码框://input[@type='password']
登录按钮://button[contains(text(),'登录')]
# 商品管理菜单
商品管理://span[contains(text(),'商品')]
在售商品://a[contains(@href,'goods/list')]
# 商品列表页
表格行://table/tbody/tr
商品ID:.//td[1]/span
商品名链接:.//td[2]/a
# 添加商品页
商品名输入框://input[@id='goods_name'] 或 //input[@name='goodsName']
价格输入框://input[@name='price']
库存输入框://input[@name='stock']
分类选择器://div[@class='category-picker']
提交按钮://button[contains(text(),'保存') or contains(text(),'提交')]
七、易错速查表
| 错误现象 | 原因 | 解决方法 |
|---|---|---|
| 登录后跳转不到商品管理 | 页面加载慢或权限不足 | 加等待元素出现,超时10秒 |
| 采集表格行时取到表头 | 相似元素列表包含了表头 | 用XPath排除thead,例如//tbody/tr |
| 上架时分类选不中 | 下拉框需要逐级展开 | 模拟点击展开后,等待选项出现再选 |
| 图片上传失败 | 文件路径不对或格式不符 | 检查文件是否存在,用os.path.exists验证 |
| 提交后提示“请填写xxx” | 必填项没填完整 | 加检查逻辑,确保每个输入框都填了 |
| TEMU弹出滑块验证 | 操作频率太高 | 每个商品后固定等待3-5秒 |
八、销量/价格数据清洗(TEMU常见格式)
TEMU上采集到的价格可能是$19.99,销量可能是1.2k。用Python清洗。
# 清洗价格:去掉$符号,转float
价格文本 = "$19.99"
价格数字 = float(价格文本.replace('$', ''))
# 清洗销量:1.2k → 1200
def parse_k(text):
if 'k' in text.lower():
return int(float(text.lower().replace('k', '')) * 1000)
return int(text)
output_销量 = parse_k("1.2k")
九、完整主流程示例
# A_Main
输出日志:"=== TEMU自动化开始 ==="
# 登录
调用子流程:B01_Login
# 选择操作类型(通过参数或手动选择)
设置变量:操作模式 = "采集" # 或 "上架"
如果 操作模式 == "采集"
调用子流程:C01_CollectProductList
输出参数存入:商品数据
调用子流程:D01_ExportResult
输入参数:数据={商品数据},类型="采集"
否则
调用子流程:C02_BatchUpload
输出参数存入:失败列表
调用子流程:D01_ExportResult
输入参数:数据={失败列表},类型="上架"
输出日志:"=== 流程结束 ==="
十、推荐资源
- 影刀官方帮助中心:搜索“TEMU”可找到商家实战案例
- TEMU卖家中心API文档(如果有权限):用API上架比RPA更稳定
- 我的经验:TEMU后台经常改版,每两周要检查一次XPath是否失效,建议关键元素用
contains(@class, '固定部分')模糊匹配
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
