移动端Temu App数据抓包与商品爬取方案

一、前言

随着跨境电商行业的快速迭代,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可能略有差异,以实际抓包结果为准):

  1. 商品列表接口:用于获取指定品类、指定页码的商品列表数据,URL格式示例:https://api.temu.com/api/v2/product/list,请求方式为GET。
  2. 商品详情接口:用于获取单个商品的详细信息(价格、销量、评价等),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点,后续爬取脚本需针对性优化:

  1. 设备标识校验:接口会校验请求头中的User-Agent、设备ID等参数,若检测到非移动端设备或异常User-Agent,会返回403禁止访问。
  2. 请求频率限制:单个IP或单个Cookie的请求频率过高时,接口会返回429请求过于频繁,暂时禁止访问。
  3. 部分接口加密:核心敏感数据(如部分商品价格、销量)可能采用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 脚本使用说明

  1. 参数修改:需根据实际抓包结果,修改脚本中的API_URL(商品列表接口URL)、COOKIE(从Fiddler的请求头中复制)、Temu App版本号等参数,否则会导致爬取失败。
  2. IP代理池:免费代理IP稳定性较差,建议从正规代理服务商获取高质量代理,若无需代理,可将PROXY_POOL设为空列表。
  3. 请求频率:REQUEST_INTERVAL设置为1.5-3.5秒,可根据实际情况调整,避免请求频率过高导致IP被封禁;页码范围建议不超过10页/次。
  4. 数据存储:爬取完成后,商品数据将保存为Excel文件,存储路径为脚本运行目录,可自定义save_path参数修改存储路径。

4.4 商品详情爬取扩展

若需爬取商品详情数据(如商品描述、规格参数、评价),可基于上述脚本扩展,核心步骤如下:

  1. 通过商品列表接口获取商品ID(product_id)。
  2. 抓包获取商品详情接口URL及请求参数(核心参数为product_id)。
  3. 编写get_product_detail函数,传入商品ID,爬取详情数据并解析。
  4. 在主函数中循环调用详情爬取函数,将详情数据合并至商品列表,统一存储。

扩展后的核心代码片段(商品详情爬取):

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的反爬机制,在基础脚本的基础上,可进一步优化以下几点,提升爬取稳定性:

  1. IP代理池优化:采用"动态代理+IP质量检测",定期筛选可用代理,剔除无效IP;同时使用住宅IP(如东南亚住宅IP),模拟真实用户网络环境,降低被封禁概率。
  2. 设备指纹伪装:除了随机User-Agent,还可在请求头中加入设备ID、系统版本等参数(从抓包结果中提取),模拟真实移动端设备;可使用Multilogin生成独立Canvas指纹,绕过设备ID关联检测。
  3. 请求行为模拟:模拟真实用户操作,如随机调整请求间隔、添加随机点击、滚动等行为(可使用Playwright替代requests,实现动态渲染与行为模拟);避免连续爬取同一品类、同一页码。
  4. Cookie池搭建:多个账号登录Temu App,获取多个Cookie,循环使用,避免单个Cookie请求频率过高;定期更新Cookie,剔除失效Cookie。
  5. 加密字段解密:若遇到加密响应字段(如价格、销量拆分显示),可通过解析JavaScript代码,找到解密逻辑,编写Python解密函数;或使用Frida动态注入脚本,挂钩SSL校验函数,绕过证书固定。
相关推荐
吃吃喝喝小朋友2 小时前
JavaScript文件的操作方法
开发语言·javascript·ecmascript
2301_797312262 小时前
学习Java42天
java·开发语言·学习
2501_944526422 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 知识问答游戏实现
android·开发语言·javascript·python·flutter·游戏·harmonyos
chilavert3182 小时前
技术演进中的开发沉思-325 JVM:java体系技术全貌(下)
java·开发语言·jvm
chilavert3182 小时前
技术演进中的开发沉思-324 JVM:java技术体系全貌(上)
java·开发语言
人工智能AI技术2 小时前
【Agent从入门到实践】21 Prompt工程基础:为Agent设计“思考指令”,简单有效即可
人工智能·python
2501_941322032 小时前
铆钉表面缺陷检测:YOLO13-BiFPN模型实现与性能优化_1
python
CCPC不拿奖不改名2 小时前
python基础面试编程题汇总+个人练习(入门+结构+函数+面向对象编程)--需要自取
开发语言·人工智能·python·学习·自然语言处理·面试·职场和发展
2501_944424122 小时前
Flutter for OpenHarmony游戏集合App实战之数字拼图滑动交换
android·开发语言·flutter·游戏·harmonyos