返回教程列表
教程2026年10月11日5 分钟阅读

淘宝/天猫商品数据怎么获取?商品搜索、详情与评价 API 教程

通过 Just One API 按关键词和价格区间搜索淘宝/天猫商品,获取详情与买家评价。包含价格口径、评价分页和保存 JSON 的 Python 示例。

从商品搜索到买家评价

做淘宝或天猫选品时,通常需要同时看商品信息和买家反馈:先找出某个品类、价格区间内的商品,再获取详情和评价,整理用户关注的材质、规格、使用体验和售后问题。

通过 Just One API,可以用同一个 API Token 串联商品搜索、商品详情和商品评价接口。本文以“30–100 元的保温杯”为例,搜索一页商品,选择最多 3 个商品,保存详情和每个商品最多 2 页评价。

这是一份接入教程,示例关键词和价格区间不构成选品推荐。采集到的结果也不能直接代表全市场销量或消费者总体意见。

注册并免费测试商品搜索

注册 Just One API 账户 获取 API Token,在 商品搜索 V1 文档 中填入 Token、关键词和筛选条件即可免费测试。一个 Token 可接入各平台 API,后续按实际调用量付费;试用次数以账户内各接口显示为准。

本文使用以下 GET 接口,均需要 token 查询参数:

  • /api/taobao/search-item-list/v1:按关键词与筛选条件查找商品。
  • /api/taobao/get-item-detail/v6:按 itemId 获取商品详情。
  • /api/taobao/get-item-comment/v3:按 itemId 和页码获取商品评价。

请求完成后先检查业务 code 是否为 0,再处理 data 中的数据。不要只看 HTTP 状态码。

第一步:设置关键词、价格和平台筛选

搜索必填参数是 keyword。本例传入“保温杯”,将 startPrice 和 endPrice 分别设置为 30 和 100,价格区间包含上下限。

  • tmall=true:只保留天猫商品;false 表示不启用天猫专属筛选。
  • sort=_sale:按销量排序。
  • sort=bid:价格从低到高;sort=_bid:价格从高到低。
  • sort=_coefp:综合排序。
  • page:从第 1 页开始,请求更多页时保持筛选条件不变。

当前公开样例中的商品列表位于 data.model.itemList,商品标识是 itemId。示例从一页搜索结果中去重选择商品,不会自动遍历所有搜索页。

第二步:获取详情,区分不同价格和销量口径

将商品 ID 传入 商品详情 V6。当前公开样例中,data.item 包含商品标题、图片与价格相关字段,data.seller 包含店铺信息,data.delivery 包含配送信息,SKU 相关内容位于 skuBase 与 skuCore。

整理数据时要区分商品展示价格、SKU 价格和券后价。V6 文档说明支持模糊销量、邮费信息,以及部分商品的券后价;不要把缺失的券后价当作零元,也不要把模糊销量直接转成精确成交数量。

如果业务重点是 SKU 数量,文档另有 商品详情 V8。应根据所需字段与实测结果选择版本,不要默认版本号最大就一定最合适。切换时需要重新核对返回结构。

价格监控还应保存采集时间和价格类型。同一个商品不同规格或不同优惠条件的价格,不能直接当作同口径的涨跌。

第三步:分页读取买家评价

商品评价 V3 使用 itemId、page 和 orderType。本例选择 orderType=feedbackdate 按评价时间排序;也可使用 general 综合排序。

当前公开样例中,列表位于 data.comments,评价内容字段为 content,评价 ID 为 rateId,是否还有下一页由 data.hasNextPage 表示。后续页递增 page,并保留相同排序方式。

做反馈分析时,可以按“商品 ID + 评价 ID”去重,再整理保温效果、杯盖密封、容量和物流等主题。评价是样本反馈;追评、商家回复和 SKU 描述也需要区分,不宜全部拼成一条用户原始评价。

Python 示例:保存商品与评价样本

先安装依赖并设置 Token。以下命令适用于 macOS 或 Linux;your_token 是占位值,真实 Token 不应放入公开代码或日志。

bash
python3 -m pip install requests
export JUSTONEAPI_TOKEN='your_token'

保存代码为 taobao_sample.py,运行 python3 taobao_sample.py。脚本最多请求 10 次:1 次搜索,最多 3 次详情,以及每个商品最多 2 页评价。这是样本规模,不是接口额度。

python
import json
import os
from datetime import datetime, timezone
from pathlib import Path

import requests

BASE_URL = "https://api.justoneapi.com"
TOKEN = os.environ.get("JUSTONEAPI_TOKEN", "")


def call_api(path, method="GET", accepted_codes=(0,), **params):
    if not TOKEN or TOKEN == "your_token":
        raise RuntimeError("Set JUSTONEAPI_TOKEN before running")
    values = {"token": TOKEN, **params}
    arguments = {"data": values} if method == "POST" else {"params": values}
    try:
        response = requests.request(
            method, BASE_URL + path, timeout=120, **arguments,
        )
    except requests.RequestException:
        raise RuntimeError("Network error or timeout") from None
    if response.status_code != 200:
        raise RuntimeError(f"HTTP {response.status_code}")
    try:
        result = response.json()
    except ValueError:
        raise RuntimeError("Response is not valid JSON") from None
    if not isinstance(result, dict) or result.get("code") not in accepted_codes:
        code = result.get("code") if isinstance(result, dict) else None
        raise RuntimeError(f"API failed: code={code}; check the docs")
    return result


def output_dir(prefix):
    stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%S%fZ")
    folder = Path(prefix) / stamp
    folder.mkdir(parents=True, exist_ok=False)
    return folder


def save_json(folder, filename, value):
    (folder / filename).write_text(
        json.dumps(value, ensure_ascii=False, indent=2), encoding="utf-8",
    )


KEYWORD = "保温杯"
MAX_PRODUCTS = 3
MAX_REVIEW_PAGES = 2


def main():
    folder = output_dir("taobao-output")
    search = call_api(
        "/api/taobao/search-item-list/v1",
        keyword=KEYWORD, page=1, sort="_sale", tmall="false",
        startPrice="30", endPrice="100",
    )
    save_json(folder, "search-1.json", search)
    items = (search["data"].get("model") or {}).get("itemList") or []
    item_ids = list(dict.fromkeys(
        str(item["itemId"]) for item in items if item.get("itemId")
    ))[:MAX_PRODUCTS]
    save_json(folder, "selected-item-ids.json", item_ids)

    for index, item_id in enumerate(item_ids, start=1):
        detail = call_api("/api/taobao/get-item-detail/v6", itemId=item_id)
        save_json(folder, f"item-{index}-detail.json", detail)
        for page in range(1, MAX_REVIEW_PAGES + 1):
            reviews = call_api(
                "/api/taobao/get-item-comment/v3",
                itemId=item_id, orderType="feedbackdate", page=page,
            )
            save_json(folder, f"item-{index}-reviews-{page}.json", reviews)
            if reviews["data"].get("hasNextPage") not in (True, 1, "1"):
                break
    print(f"Saved {len(item_ids)} product samples to {folder}")


if __name__ == "__main__":
    try:
        main()
    except RuntimeError as error:
        raise SystemExit(str(error)) from None

结果保存在 taobao-output 下本次运行的独立目录中,包含原始搜索响应、选中的商品 ID、详情和评价 JSON。字段解析依据当前文档公开样例;实际内容以运行时返回为准。先确认这些字段满足需求,再增加 CSV 导出或数据库写入。

脚本遇到错误会停止,成功保存的文件会保留。它不会自动重试,再次运行会重新发起请求。需要批量任务时,可参考 失败重试指南,增加断点记录和有上限的重试。

常见问题

已有商品 ID,是否还要调用搜索?

不需要。可以直接调用详情和评价接口。搜索用于发现商品;已知目标商品时跳过搜索,能减少请求数量。

能否获取一个店铺的商品?

可以从 店铺商品列表文档 开始,按该接口要求传入店铺对应的卖家标识。关键词搜索、店铺列表和商品详情使用的标识不同,不要将 shopId 直接作为 itemId。

搜索价格与详情价格为什么可能不同?

两次请求时间、规格选择、活动和优惠口径都可能影响价格。先核对字段代表的是哪类价格,并保留原始返回值;不要看到差异就直接认定商品涨价或接口错误。

每次返回的评价数量一定相同吗?

不一定。按实际列表和分页标识处理,不要写死每页条数。本文还设置了 2 页上限,因此保存的评价不代表该商品所有评价。

用一个真实选品问题开始

先在 商品搜索在线文档 中免费测试自己的关键词和价格区间,再选几个商品核对详情及评价。确认价格口径、评价结构和采集范围后,再扩展到持续监测或批量选品流程。

继续使用 Just One API

登录 Dashboard 获取 Token,查看完整 API 文档,或打开 MCP GitHub 项目了解最新配置。