
随着跨境电商行业的快速迭代,Temu凭借“低价策略+全球供应链”优势,快速抢占全球市场,成为跨境电商领域的核心玩家之一。对于开发者、电商分析师而言,获取Temu App的商品数据(如商品标题、价格、销量、评价、品类信息等),能够支撑竞品分析、选品决策、价格监控等核心需求。
与网页端爬取不同,移动端Temu App采用加密接口通信,且存在严格的反爬机制(如证书校验、设备指纹、请求频率限制等),直接爬取难度较大。本文基于“抓包解析-接口破解-定向爬取-数据存储”的核心逻辑,搭建一套适配移动端Temu App的爬取方案,兼顾技术实操性与合规性,全程附带代码实现,帮助读者快速落地实践。
本文核心目标:完成移动端Temu App商品相关接口的抓包,解析接口参数与响应格式,使用Python编写爬取脚本,实现商品数据的批量获取与结构化存储,同时提供反爬策略优化方案,确保爬取过程稳定、高效。
移动端App抓包的本质是“中间人攻击”,通过在手机与Temu服务器之间搭建代理服务器,拦截并解析两者之间的网络请求与响应数据。Temu App的网络通信主要采用HTTPS协议,数据传输过程中会进行加密处理,因此需通过配置代理证书,实现HTTPS流量的解密,从而获取明文形式的接口数据(请求参数、响应内容)。
本次方案采用“Fiddler代理+手机端配置”的方式实现抓包,Fiddler作为主流的HTTP/HTTPS抓包工具,支持跨平台、多设备代理,能够精准拦截移动端App的所有网络请求,同时支持断点调试、参数修改等功能,适合用于Temu App的接口分析。
步骤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将作为手机端的代理主机地址。
步骤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将拦截到大量网络请求,说明抓包环境搭建成功。
抓包环境搭建完成后,通过操作Temu App,拦截商品相关的网络请求,解析接口参数、响应格式及请求头信息,为后续Python爬取提供基础。本次重点分析“商品列表接口”和“商品详情接口”,两者是获取商品数据的核心接口。
启动Fiddler,点击“Clear”清空历史请求,打开手机Temu App,搜索目标品类(如“electronics”),浏览商品列表。此时Fiddler将拦截到大量请求,通过以下筛选规则定位核心接口:
经过筛选,可定位到两个核心接口(不同版本Temu App的接口URL可能略有差异,以实际抓包结果为准):
https://api.temu.com/api/v2/product/list,请求方式为GET。https://api.temu.com/api/v2/product/detail,请求方式为GET。选中商品列表接口,切换至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(用户身份标识,部分接口需携带,可从抓包结果中复制)。
切换至“Response → 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分制)
},
// 更多商品数据...
]
}
}商品详情接口的响应格式与列表接口类似,额外包含商品描述、规格参数、评价列表等详细信息,可按照相同方式解析。
通过抓包分析,Temu App的核心反爬机制主要有3点,后续爬取脚本需针对性优化:
基于上述接口分析,使用Python编写爬取脚本,实现Temu App商品列表数据的批量爬取、解析与存储。脚本采用requests库发送HTTP请求,json库解析响应数据,pandas库实现数据结构化存储,同时加入反爬优化(IP代理、请求频率控制、User-Agent随机化)。
脚本功能:指定商品品类、价格区间、页码范围,爬取Temu App商品列表数据,解析核心字段,存储为Excel文件,加入反爬优化(IP代理池、请求间隔、User-Agent随机化),代码如下(可直接运行,需根据实际抓包结果修改接口URL和Cookie):
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()若需爬取商品详情数据(如商品描述、规格参数、评价),可基于上述脚本扩展,核心步骤如下:
扩展后的核心代码片段(商品详情爬取):
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的反爬机制,在基础脚本的基础上,可进一步优化以下几点,提升爬取稳定性:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。