TEMU(拼多多跨境)后台的商品数据、竞品监控,每天要手工复制粘贴。
解决方法:用影刀模拟人工操作,自动采集商品列表、销量、价格等信息。
本文给出TEMU采集的完整流程,适配TEMU卖家中心前台搜索页和后台管理页。
一、TEMU采集的两种场景
| 场景 | 数据来源 | 是否需要登录 | 难度 |
|---|---|---|---|
| 前台搜索页 | temu.com搜索关键词 | 不需要 | 简单 |
| 后台商品管理 | seller.temu.com 商品列表 | 需要登录 | 中等 |
本文以前台搜索页为例(公开数据,无反爬压力)。
后台采集类似,只是元素定位不同,加登录步骤即可。
二、捕获TEMU搜索页的关键元素
打开TEMU官网(https://www.temu.com),搜索任意词,F12查看结构。
需要捕获的元素(TEMU特有)
| 元素名 | 用途 | XPath参考 |
|---|---|---|
input_search | 搜索输入框 | //input[@placeholder='Search'] 或 //input[@type='search'] |
btn_search | 搜索按钮 | //button[@type='submit'] 或含 search 的按钮 |
div_product_card | 商品卡片容器 | //div[contains(@class,'product-card')] 或 //div[@data-testid='product-card'] |
txt_title | 商品标题 | {当前卡片}//a[contains(@class,'title')] |
txt_price | 当前价格 | {当前卡片}//span[contains(@class,'price')] |
txt_original_price | 原价(划线价) | {当前卡片}//span[contains(@class,'original')] |
txt_sales | 销量(已售) | {当前卡片}//span[contains(@class,'sold')] |
txt_rating | 评分 | {当前卡片}//div[contains(@class,'rating')] |
link_detail | 商品链接 | {当前卡片}//a[@href] |
btn_next | 下一页 | //a[@aria-label='Next'] 或 //span[text()='Next'] |
💡 TEMU的class名通常带随机后缀,用
contains()匹配固定前缀。
比如product-card实际可能是product-card__3f2a,用contains(@class,'product-card')即可。
捕获技巧:
- 商品卡片用“捕获元素”选中商品区域的最外层div。
- 子元素用右键父元素 → “捕获子元素”生成相对路径。
三、完整流程设计
A_Main(主流程)
├─ 1. 打开Excel(创建或读取)
├─ 2. 打开TEMU搜索页
├─ 3. 输入关键词并搜索
├─ 4. 等待商品列表加载
├─ 5. 调用 C_01_CollectOnePage(采集当前页)
├─ 6. 条件循环(下一页存在)
│ ├─ 点击下一页
│ ├─ 等待新列表加载
│ └─ 调用 C_01_CollectOnePage
└─ 7. 关闭Excel
C_01_CollectOnePage
├─ 1. 获取相似元素列表 div_product_card → list_cards
├─ 2. 循环相似元素列表(当前卡片变量 card)
│ ├─ 提取标题、价格、原价、销量、评分、链接
│ ├─ 数据清洗(去除$符号,销量转数字)
│ ├─ 组装行数据列表
│ └─ 追加行到Excel
└─ 3. 返回
四、分步指令详解
步骤1:打开TEMU并搜索
# 1. 打开TEMU首页
# 打开网页:https://www.temu.com
# 等待元素出现:input_search(超时5秒)
# 2. 输入关键词(假设全局变量 keyword = "phone case")
# 输入文本:目标元素 input_search,内容 {keyword},清空原有内容
# 3. 点击搜索按钮
# 鼠标点击:btn_search
# 4. 等待列表加载
# 等待元素出现:div_product_card(超时8秒)
步骤2:采集一页数据
# 获取相似元素列表
# 目标元素:div_product_card
# 输出列表:product_cards
# 循环相似元素列表
# 列表:product_cards
# 当前元素变量:card
# 循环体内:
# 1. 获取元素文本(标题)
# 元素路径:{card}//a[contains(@class,'title')] → 输出 title
# 注意:标题可能有换行,用“获取元素文本”会自动处理
# 2. 获取元素文本(价格)
# 元素路径:{card}//span[contains(@class,'price')] → 输出 price_raw
# 清洗:去除 $ 和逗号,转float,例如 "$9.99" → 9.99
# 3. 获取元素文本(原价,可选)
# 元素路径:{card}//span[contains(@class,'original')] → 输出 original_raw
# 可能为空,空则留空
# 4. 获取元素文本(销量)
# 元素路径:{card}//span[contains(@class,'sold')] → 输出 sales_raw
# 例如 "1.2K sold" 或 "500 sold",提取数字并转换 K=千
# 5. 获取元素文本(评分)
# 元素路径:{card}//div[contains(@class,'rating')] → 输出 rating_raw
# 例如 "4.5 ★" 提取数字4.5
# 6. 获取元素属性(链接)
# 元素:{card}//a[@href]
# 属性名:href → 输出 link
# 注意:TEMU链接可能是相对路径,前面补 https://www.temu.com
# 7. 组装一行数据:[title, price_clean, original_clean, sales_num, rating_num, link]
# 8. 追加行到Excel(Excel对象已在主流程打开)
步骤3:翻页
# 条件循环(当下一页按钮存在时继续)
# 循环条件:判断元素是否存在(btn_next) == True
# 注意:TEMU最后一页下一页按钮可能消失或变灰
# 循环体内:
# 1. 鼠标点击 btn_next(模拟点击)
# 2. 固定等待 1 秒
# 3. 等待元素出现 div_product_card(超时8秒)
# 4. 调用子流程 C_01_CollectOnePage
# 条件循环结束
五、数据清洗Python代码(处理TEMU格式)
TEMU的价格和销量有特殊格式,用Python清洗。
import re
# 清洗价格(去除 $ 和逗号)
price_raw = get_var("price_raw") # 如 "$9.99" 或 "$12.99 - $15.99"
if '-' in price_raw:
# 取最低价
price_raw = price_raw.split('-')[0].strip()
price_clean = re.sub(r'[^\d\.]', '', price_raw) # 去除非数字和小数点
price_num = float(price_clean) if price_clean else 0
# 清洗销量(如 "1.2K sold" 或 "500 sold")
sales_raw = get_var("sales_raw")
match = re.search(r'([\d\.]+)(K|M)?', sales_raw)
if match:
num = float(match.group(1))
if match.group(2) == 'K':
sales_num = int(num * 1000)
elif match.group(2) == 'M':
sales_num = int(num * 1000000)
else:
sales_num = int(num)
else:
sales_num = 0
# 清洗评分(如 "4.5 ★")
rating_raw = get_var("rating_raw")
rating_match = re.search(r'(\d+\.?\d*)', rating_raw)
rating_num = float(rating_match.group(1)) if rating_match else 0
set_var("price_num", price_num)
set_var("sales_num", sales_num)
set_var("rating_num", rating_num)
六、TEMU专属避坑指南
坑1:商品卡片懒加载
TEMU滚动到底部才加载更多商品,但分页模式下每页固定数量,不需要滚动。
如果采不到所有卡片,检查是否用了“移动端视图”,建议用PC端网页。
坑2:价格有区间
部分商品显示 $9.99 - $15.99,采集时取最低价或最高价。
上面代码已处理取最低价。
坑3:反爬与验证码
TEMU对频繁访问有限制,建议:
- 每次翻页后固定等待1~2秒
- 单次运行不超过10页
- 采集间隔设置随机(如2~3秒)
坑4:登录态要求
采集前台公开数据不需要登录。
如果要采集后台数据(如自己店铺的商品),需要在流程开始时登录TEMU卖家中心。
坑5:下一页按钮定位
TEMU的下一页按钮可能是 Next 文字或右箭头图标。
捕获时用 //span[text()='Next'] 或 //a[@aria-label='Next']。
七、完整Excel输出示例
| 商品标题 | 价格 | 原价 | 销量 | 评分 | 商品链接 |
|---|---|---|---|---|---|
| iPhone 15 Case | 9.99 | 19.99 | 2300 | 4.5 | https://... |
| Magnetic Phone Ring | 5.99 | 12.99 | 10800 | 4.7 | https://... |
表头建议:
在流程开始前手动创建Excel,写入表头。
或用影刀“写入行”在首次运行时写入。
八、影刀专属操作清单
| 操作 | 精确指令 | 说明 |
|---|---|---|
| 打开TEMU | 打开网页 | URL用 https://www.temu.com |
| 输入搜索词 | 输入文本 | 模式选模拟输入 |
| 等待列表 | 等待元素出现 | 超时8秒 |
| 获取卡片列表 | 获取相似元素列表 | 目标元素为商品卡片 |
| 相对定位 | {当前卡片}//子路径 | 循环内用 |
| 点击下一页 | 鼠标点击 | 加固定等待1秒 |
| 追加行 | 追加行 | Excel对象 |
| 数据清洗 | Python代码 | 用正则处理 |
版本差异:社区版采集TEMU时注意控制页数(建议≤10页),防止触发反爬。
创业版可搭配代理IP轮换。
常见问题速查
| 问题 | 原因 | 解决方法 |
|---|---|---|
| 搜索后无结果 | 关键词无结果或页面未加载 | 加等待时间,检查元素路径 |
| 卡片列表只采到几个 | 页面未滚动完全 | 滚动到底部再获取,或改用分页URL |
| 价格为0 | 正则匹配失败 | 查看price_raw原始值,调整正则 |
| 销量显示0 | 销量格式变化(如“1.2k”小写k) | 正则加上大小写 [Kk] |
| 翻页停不下来 | 下一页按钮最后一页依然存在 | 加判断:按钮是否包含disabled |
| 评分提取为空 | 评分在子元素里 | 改用 {card}//div[contains(@class,'rating')]//span[1] |
推荐资源
- TEMU前台:https://www.temu.com (直接访问)
- 影刀模板市场:搜索“TEMU商品采集”,有社区分享的模板
- XPath Helper:校验TEMU的元素定位
最后一句:TEMU采集比淘宝简单(反爬没那么严),但要注意价格区间的处理。
把清洗逻辑写在Python代码里,一次写好后续复用。这套流程跑通后,每天竞品监控效率提升10倍。
作者:林焱
本文为《影刀RPA学习手册》系列文章之一,内容源于实操经验的整理与分享。
