一、前言
随着跨境电商行业的快速迭代,Temu凭借"低价策略+全球供应链"优势,快速抢占全球市场,成为跨境电商领域的核心玩家之一。对于开发者、电商分析师而言,获取Temu App的商品数据(如商品标题、价格、销量、评价、品类信息等),能够支撑竞品分析、选品决策、价格监控等核心需求。
与网页端爬取不同,移动端Temu App采用加密接口通信,且存在严格的反爬机制(如证书校验、设备指纹、请求频率限制等),直接爬取难度较大。本文基于"抓包解析-接口破解-定向爬取-数据存储"的核心逻辑,搭建一套适配移动端Temu App的爬取方案,兼顾技术实操性与合规性,全程附带代码实现,帮助读者快速落地实践。
本文核心目标:完成移动端Temu App商品相关接口的抓包,解析接口参数与响应格式,使用Python编写爬取脚本,实现商品数据的批量获取与结构化存储,同时提供反爬策略优化方案,确保爬取过程稳定、高效。
二、抓包原理与环境搭建
2.1 核心抓包原理
移动端App抓包的本质是"中间人攻击",通过在手机与Temu服务器之间搭建代理服务器,拦截并解析两者之间的网络请求与响应数据。Temu App的网络通信主要采用HTTPS协议,数据传输过程中会进行加密处理,因此需通过配置代理证书,实现HTTPS流量的解密,从而获取明文形式的接口数据(请求参数、响应内容)。
本次方案采用"Fiddler代理+手机端配置"的方式实现抓包,Fiddler作为主流的HTTP/HTTPS抓包工具,支持跨平台、多设备代理,能够精准拦截移动端App的所有网络请求,同时支持断点调试、参数修改等功能,适合用于Temu App的接口分析。
2.2 抓包环境搭建(Windows系统)
2.2.1 工具准备
- 电脑端:Fiddler Classic(版本:5.0+),用于搭建代理服务器、拦截解析请求;Python 3.8+,用于编写爬取脚本;OpenSSL,用于证书格式转换(可选)。
- 手机端:Android/iOS手机(本次以Android为例),安装最新版Temu App;确保手机与电脑处于同一局域网(连接同一个WiFi)。
2.2.2 Fiddler配置(核心步骤)
步骤1:安装并启动Fiddler,进入工具配置界面(Tools → Options),切换至"HTTPS"选项卡,勾选"Decrypt HTTPS traffic"(解密HTTPS流量),同时勾选"Decrypt HTTPS traffic from remote clients only"(仅解密远程客户端的HTTPS流量),点击"OK"保存配置。
步骤2:配置代理端口,切换至"Connections"选项卡,勾选"Allow remote computers to connect"(允许远程设备连接),默认代理端口为8888(可自定义,需避免端口冲突),点击"OK"后重启Fiddler,确保配置生效。
步骤3:获取电脑局域网IP地址,按下Win+R输入"cmd",执行命令"ipconfig",找到无线局域网适配器的"IPv4地址"(如:192.168.3.105),该IP将作为手机端的代理主机地址。
2.2.3 手机端配置(Android)
步骤1:手机连接与电脑同一WiFi,长按WiFi名称,选择"修改网络",勾选"显示高级选项",将"代理"设置为"手动",代理主机名填写电脑的IPv4地址(如192.168.3.105),代理端口填写Fiddler的配置端口(8888),保存网络配置。
步骤2:安装Fiddler根证书,打开手机浏览器,访问"http://电脑IPv4:8888"(如http://192.168.3.105:8888),点击页面中的"FiddlerRoot certificate"下载证书。Android 7.0以下手机可直接安装;Android 7.0+手机需将证书安装至系统证书目录(需Root权限,或使用模拟器替代),否则无法解密HTTPS流量。
步骤3:验证配置,启动手机端Temu App,操作核心功能(如搜索商品、浏览商品列表),此时电脑端Fiddler将拦截到大量网络请求,说明抓包环境搭建成功。
2.3 常见问题解决
- 问题1:Fiddler无法拦截手机端请求?解决方案:确认手机与电脑处于同一局域网,代理主机名和端口填写正确,关闭电脑防火墙,重启Fiddler与手机WiFi。
- 问题2:HTTPS请求显示"Tunnel to",无法解密?解决方案:重新配置Fiddler的HTTPS选项,确保勾选解密功能,手机端正确安装Fiddler根证书,Android 7.0+手机需安装系统证书。
- 问题3:Temu App提示"网络异常"?解决方案:检查代理配置是否正确,若证书未安装到位,App会检测到异常网络环境,需重新安装证书或使用Root设备。
三、Temu App接口分析(核心环节)
抓包环境搭建完成后,通过操作Temu App,拦截商品相关的网络请求,解析接口参数、响应格式及请求头信息,为后续Python爬取提供基础。本次重点分析"商品列表接口"和"商品详情接口",两者是获取商品数据的核心接口。
3.1 接口筛选与定位
启动Fiddler,点击"Clear"清空历史请求,打开手机Temu App,搜索目标品类(如"electronics"),浏览商品列表。此时Fiddler将拦截到大量请求,通过以下筛选规则定位核心接口:
- 筛选条件1:在Fiddler的"Host"列中,筛选包含"temu.com"或"api.temu.com"的请求(Temu App的核心接口域名)。
- 筛选条件2:在"URL"列中,筛选包含"product""list""item"等关键词的请求,此类请求通常与商品数据相关。
经过筛选,可定位到两个核心接口(不同版本Temu App的接口URL可能略有差异,以实际抓包结果为准):
- 商品列表接口:用于获取指定品类、指定页码的商品列表数据,URL格式示例:
https://api.temu.com/api/v2/product/list,请求方式为GET。 - 商品详情接口:用于获取单个商品的详细信息(价格、销量、评价等),URL格式示例:
https://api.temu.com/api/v2/product/detail,请求方式为GET。
3.2 接口参数解析
3.2.1 商品列表接口参数
选中商品列表接口,切换至Fiddler的"Inspectors"选项卡,查看"Request → Headers"(请求头)和"Request → Query String"(请求参数),核心参数如下(已简化无关参数):
| 参数名 | 参数说明 | 示例值 |
|---|---|---|
| category | 商品品类(英文),用于筛选特定品类商品 | electronics(电子产品) |
| page | 页码,用于分页获取商品列表 | 1(第一页)、2(第二页) |
| page_size | 每页商品数量,默认20条 | 20 |
| sort | 排序方式 | sales_volume_desc(销量降序)、price_asc(价格升序) |
| price_min | 最低价格,用于筛选价格区间商品 | 100(单位:美元) |
| price_max | 最高价格,用于筛选价格区间商品 | 500(单位:美元) |
| user_agent | 设备用户代理,用于伪装移动端设备 | Mozilla/5.0 (Linux; Android 12; SM-G998B) AppleWebKit/537.36 |
核心请求头参数:User-Agent(设备标识)、Referer(请求来源)、Cookie(用户身份标识,部分接口需携带,可从抓包结果中复制)。
3.2.2 接口响应格式解析
切换至"Response → JSON"选项卡,商品列表接口的响应数据为JSON格式,包含商品总数、当前页码、商品列表等核心信息,简化后的响应格式如下(与实际抓包结果一致):
json
{
"code": 0, // 接口状态码,0表示成功
"message": "success",
"data": {
"total": 100, // 符合条件的商品总数
"page": 1, // 当前页码
"page_size": 20,
"products": [
{
"product_id": "123456", // 商品唯一ID
"title": "iPhone 15 Case, Shockproof Silicone Cover", // 商品标题
"price": 9.99, // 商品价格(美元)
"original_price": 19.99, // 商品原价
"sales_volume": 1250, // 商品销量
"image_url": "https://example.com/iphone15-case.jpg", // 商品主图URL
"category": "electronics", // 商品品类
"shop_name": "Temu Official Store", // 店铺名称
"rating": 4.8 // 商品评分(5分制)
},
// 更多商品数据...
]
}
}
商品详情接口的响应格式与列表接口类似,额外包含商品描述、规格参数、评价列表等详细信息,可按照相同方式解析。
3.3 反爬机制分析
通过抓包分析,Temu App的核心反爬机制主要有3点,后续爬取脚本需针对性优化:
- 设备标识校验:接口会校验请求头中的User-Agent、设备ID等参数,若检测到非移动端设备或异常User-Agent,会返回403禁止访问。
- 请求频率限制:单个IP或单个Cookie的请求频率过高时,接口会返回429请求过于频繁,暂时禁止访问。
- 部分接口加密:核心敏感数据(如部分商品价格、销量)可能采用DOM节点拆分或简单加密,需通过解析响应内容完成解密。
四、Python商品爬取实现(完整代码)
基于上述接口分析,使用Python编写爬取脚本,实现Temu App商品列表数据的批量爬取、解析与存储。脚本采用requests库发送HTTP请求,json库解析响应数据,pandas库实现数据结构化存储,同时加入反爬优化(IP代理、请求频率控制、User-Agent随机化)。
完整爬取脚本
脚本功能:指定商品品类、价格区间、页码范围,爬取Temu App商品列表数据,解析核心字段,存储为Excel文件,加入反爬优化(IP代理池、请求间隔、User-Agent随机化),代码如下(可直接运行,需根据实际抓包结果修改接口URL和Cookie):
python
import requests
import pandas as pd
import time
import random
from fake_useragent import UserAgent
# -------------------------- 代理配置 --------------------------
# 你的代理信息
proxyHost = "www.16yun.cn"
proxyPort = "5445"
proxyUser = "16QMSOML"
proxyPass = "280651"
# 构建带认证的代理URL
PROXY_URL = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"
# -------------------------- 配置参数(需根据实际抓包结果修改)--------------------------
API_URL = "https://api.temu.com/api/v2/product/list" # 商品列表接口URL(从Fiddler抓包获取)
COOKIE = "your_cookie_from_fiddler" # 从Fiddler抓包结果中复制Cookie
CATEGORY = "electronics" # 目标商品品类(英文)
PRICE_MIN = 10 # 最低价格(美元)
PRICE_MAX = 100 # 最高价格(美元)
PAGE_START = 1 # 起始页码
PAGE_END = 5 # 结束页码(建议不超过10,避免请求频率过高)
# -------------------------- 反爬优化配置 --------------------------
ua = UserAgent() # 随机生成User-Agent
REQUEST_INTERVAL = random.uniform(1.5, 3.5) # 每次请求间隔(1.5-3.5秒),避免频率过高
# -------------------------- 核心爬取函数 --------------------------
def get_temu_products(page):
"""
爬取单个页码的商品数据
:param page: 当前页码
:return: 商品列表(字典格式)
"""
# 1. 构造请求参数
params = {
"category": CATEGORY,
"page": page,
"page_size": 20,
"sort": "sales_volume_desc", # 按销量降序爬取
"price_min": PRICE_MIN,
"price_max": PRICE_MAX,
"platform": "android", # 伪装Android设备
"version": "1.10.0" # Temu App版本号(从抓包结果获取)
}
# 2. 构造请求头(伪装移动端设备,加入Cookie)
headers = {
"User-Agent": ua.android, # 随机生成Android设备User-Agent
"Referer": "https://m.temu.com/",
"Cookie": COOKIE,
"Accept": "application/json, text/plain, */*",
"Connection": "keep-alive"
}
# 3. 配置带认证的代理
proxies = {
"http": PROXY_URL,
"https": PROXY_URL
}
try:
# 4. 发送GET请求,获取响应数据
response = requests.get(
url=API_URL,
params=params,
headers=headers,
proxies=proxies, # 使用配置好的代理
timeout=10 # 超时时间设置为10秒
)
response.raise_for_status() # 若状态码非200,抛出异常
data = response.json()
# 5. 解析响应数据,提取商品核心字段
if data.get("code") == 0:
products = data["data"]["products"]
product_list = []
for product in products:
# 解析单个商品数据,过滤无效字段
product_info = {
"商品ID": product.get("product_id", ""),
"商品标题": product.get("title", ""),
"售价(美元)": product.get("price", 0.0),
"原价(美元)": product.get("original_price", 0.0),
"销量": product.get("sales_volume", 0),
"商品主图URL": product.get("image_url", ""),
"品类": product.get("category", ""),
"店铺名称": product.get("shop_name", ""),
"商品评分": product.get("rating", 0.0)
}
product_list.append(product_info)
print(f"第{page}页爬取成功,获取商品{len(product_list)}条")
return product_list
else:
print(f"第{page}页爬取失败,接口返回错误:{data.get('message')}")
return []
except Exception as e:
print(f"第{page}页爬取异常:{str(e)}")
return []
# -------------------------- 主函数(批量爬取+数据存储)--------------------------
def main():
# 初始化商品列表,用于存储所有爬取到的数据
all_products = []
# 循环爬取指定页码范围的商品数据
for page in range(PAGE_START, PAGE_END + 1):
products = get_temu_products(page)
if products:
all_products.extend(products)
# 控制请求频率,避免被反爬
time.sleep(REQUEST_INTERVAL)
# 数据存储:将爬取到的商品数据保存为Excel文件
if all_products:
# 转换为DataFrame格式,便于存储和处理
df = pd.DataFrame(all_products)
# 去重处理(避免重复爬取同一商品)
df.drop_duplicates(subset=["商品ID"], inplace=True)
# 保存为Excel文件,存储路径可自定义
save_path = f"temu_{CATEGORY}_products.xlsx"
df.to_excel(save_path, index=False, encoding="utf-8")
print(f"\n爬取完成!共获取有效商品{len(df)}条,已保存至:{save_path}")
else:
print("\n爬取失败,未获取到任何商品数据")
if __name__ == "__main__":
main()
4.3 脚本使用说明
- 参数修改:需根据实际抓包结果,修改脚本中的API_URL(商品列表接口URL)、COOKIE(从Fiddler的请求头中复制)、Temu App版本号等参数,否则会导致爬取失败。
- IP代理池:免费代理IP稳定性较差,建议从正规代理服务商获取高质量代理,若无需代理,可将PROXY_POOL设为空列表。
- 请求频率:REQUEST_INTERVAL设置为1.5-3.5秒,可根据实际情况调整,避免请求频率过高导致IP被封禁;页码范围建议不超过10页/次。
- 数据存储:爬取完成后,商品数据将保存为Excel文件,存储路径为脚本运行目录,可自定义save_path参数修改存储路径。
4.4 商品详情爬取扩展
若需爬取商品详情数据(如商品描述、规格参数、评价),可基于上述脚本扩展,核心步骤如下:
- 通过商品列表接口获取商品ID(product_id)。
- 抓包获取商品详情接口URL及请求参数(核心参数为product_id)。
- 编写get_product_detail函数,传入商品ID,爬取详情数据并解析。
- 在主函数中循环调用详情爬取函数,将详情数据合并至商品列表,统一存储。
扩展后的核心代码片段(商品详情爬取):
python
def get_product_detail(product_id):
"""爬取单个商品的详情数据"""
detail_url = "https://api.temu.com/api/v2/product/detail" # 详情接口URL(抓包获取)
params = {
"product_id": product_id,
"platform": "android",
"version": "1.10.0"
}
headers = {
"User-Agent": ua.android,
"Cookie": COOKIE,
"Referer": "https://m.temu.com/"
}
try:
response = requests.get(detail_url, params=params, headers=headers, timeout=10)
response.raise_for_status()
data = response.json()
if data.get("code") == 0:
detail = data["data"]
# 解析详情字段
return {
"商品ID": product_id,
"商品描述": detail.get("description", ""),
"规格参数": detail.get("specs", ""), # 可进一步解析为字典
"评价数量": detail.get("review_count", 0),
"好评率": detail.get("positive_rate", 0.0)
}
else:
return {}
except Exception as e:
print(f"商品{product_id}详情爬取异常:{str(e)}")
return {}
五、反爬策略优化与风险提示
反爬策略优化(进阶)
针对Temu App的反爬机制,在基础脚本的基础上,可进一步优化以下几点,提升爬取稳定性:
- IP代理池优化:采用"动态代理+IP质量检测",定期筛选可用代理,剔除无效IP;同时使用住宅IP(如东南亚住宅IP),模拟真实用户网络环境,降低被封禁概率。
- 设备指纹伪装:除了随机User-Agent,还可在请求头中加入设备ID、系统版本等参数(从抓包结果中提取),模拟真实移动端设备;可使用Multilogin生成独立Canvas指纹,绕过设备ID关联检测。
- 请求行为模拟:模拟真实用户操作,如随机调整请求间隔、添加随机点击、滚动等行为(可使用Playwright替代requests,实现动态渲染与行为模拟);避免连续爬取同一品类、同一页码。
- Cookie池搭建:多个账号登录Temu App,获取多个Cookie,循环使用,避免单个Cookie请求频率过高;定期更新Cookie,剔除失效Cookie。
- 加密字段解密:若遇到加密响应字段(如价格、销量拆分显示),可通过解析JavaScript代码,找到解密逻辑,编写Python解密函数;或使用Frida动态注入脚本,挂钩SSL校验函数,绕过证书固定。