按 ASIN 获取亚马逊商品详情:先核对对象,再读取价格和规格

Pangolinfo
2026-09-29

Pangolinfo 编辑团队 · 电商数据 API 与采集工程 · 实测 / 草稿更新:2026-09-28

按 ASIN 获取亚马逊商品详情,需要同时指定站点与配送地区,再通过Amazon Scraper API或 MCP 读取商品结果。拿到 JSON 后,先核对返回 ASIN,再按字段含义提取标题、价格、图片和规格;HTTP 200 只是第一层检查。

这篇教程使用我们在 2026 年 9 月 28 日发起的实时请求。白色翻新 iPhone 的两次返回价格为 $619.00 和 $619.95,卖家也不同;顶层 size 为 8 GB,而存储容量在属性表中是 512 GB。下面用这些原始结果走完输入、调用、读取、保存和排错,不用虚构的成功响应代替示例。

采样时间为当日 UTC 08:23:53–08:26:19,精确起止时间保存在证据文件中。价格、卖家和配送文字只代表这轮返回值。本次没有打开 Amazon 页面逐项复核,也没有取得源页面采集时间或后台账单,因此不把客户端接收时间当作数据更新时间,不以响应中的 pointCost 代替账户扣费记录。

1. 有 ASIN 后,应该用 API 还是 MCP?

如果你要把结果写入数据库、做定时任务或接入自己的系统,REST API 更便于控制请求和保存流程。若你在 AI 对话中核对几个商品,Amazon Data MCP可以让 Agent 读取工具定义并发起商品查询。本次两条路径都调用了,但它们的最外层响应不同,解析时不能混用。

Amazon 的 Catalog Items 接口也提供按 ASIN 获取目录条目的能力。它属于有授权条件的官方业务接口;本篇演示的公开商品详情采集服务是另一种接入路线。先确认你需要的是目录信息、页面购买条件,还是授权账户的数据,再选接口。不应把“有 ASIN”理解成所有接口都能无条件使用。

本文的主要目标是完成一条可追溯的商品观测。若你尚未决定需要哪些数据源,可以先看亚马逊商品数据 API 支柱页;若已确定查询对象,就从下面的参数开始。我们不在这篇里展开供应商排行或字段全集。

本轮查了哪些对象,为什么这样选?

我们选择两个项目历史记录中出现过的子 ASIN,重新请求其当前数据。历史记录只帮助选样,本篇的数值来自本轮响应。随后从返回的 parentAsin 追查父编号,测试错误格式,再用一个人为构造的十位编号观察“格式通过”的边界。最后以同一白色子 ASIN 调用 REST,核对两种接入方式的结构。

请求ASIN / 输入站点与邮区本轮用途
MCP 白色款B0CMZFCQ6Damz_us / 10041正常详情与字段读取
MCP 白色款B0CMZFCQ6Damz_us / 90001比较两个请求条件下的返回
MCP 黑色款B0CMZ5KBNSamz_us / 10041检查同父变体与规格
MCP 父编号,两次B0GP8D698Xamz_us / 10041查看父对象能否直接查详情
MCP 格式错误BAD-ASINamz_us / 10041检查参数拒绝路径
MCP 构造编号B000000000amz_us / 10041检查内容合理性,不预设不存在
REST 白色款B0CMZFCQ6Damz_us / 10041核对 REST 结构与保存流程

这是八次业务工具或接口调用,包括一次格式校验请求、一次父编号复测。初始化、工具发现与能力查询另计。样本规模适合解释操作与异常,不能用来计算服务成功率、全市场覆盖率或平均性能。

2. 第一步:怎样从商品链接取得正确的 ASIN?

商品地址中的 /dp/ 后常见十位商品编号。本例输入 B0CMZFCQ6D,而不是整段带分享参数的链接、父编号或卖家 SKU。若手中是完整地址,先保留原链接,识别站点域名,再提取 ASIN。程序应允许大小写输入并统一格式,但格式检查只确认十位字母数字,不证明商品存在或内容一致。

在 MCP 的 tools/list 实时定义中,get_amazon_product 的必填输入是 asin;site、zipcode 和 format 是可配置项。本次我们没有依赖默认站点或省略邮区。对于已经明确要查的商品,直接用详情工具,不必先调用搜索工具付出额外请求,也不要让模型自己编一个看似像 ASIN 的编号。

父 ASIN 与可购买的子 ASIN要分开。两款手机的 parentAsin 都返回 B0GP8D698X,但直接用这个父编号请求详情,两次均出现“页面不存在或与请求 ASIN 不匹配”的工具错误。这个结果只描述本次父编号请求,不能扩大为“所有父 ASIN 都不能查”,更不能说明它的子商品已经下架。

输入格式正确,为什么仍可能拿到不该使用的数据?

BAD-ASIN 在本轮被工具拒绝,错误为 BAD_INPUT,提示十位字母数字格式要求。相同错误参数不值得重试。相反,B000000000 满足格式要求,返回 code 0,却出现标题为玉米片、category_name 为圆珠笔类目、属性品牌又不同的组合。我们将该记录排除出正常商品示例。

这并不能确定矛盾来自源页面、特殊商品编号、解析过程还是其他环节,因为本次没有拿到对应页面的独立证据。它能支持的结论是:输入格式校验和业务状态检查之后,还要检查身份与关键语义;随机构造的编号也不能在测试报告里被提前标成“确定不存在”。

3. 第二步:站点和邮区应该怎样填写?

本次请求使用美国站 amz_us,明确传入 10041 或 90001。站点决定商品查询所在的市场,邮区描述期望使用的配送条件。把 ASIN、site、zipcode 一起保存在请求记录里,后续才能判断两次结果是否处于同一比较口径。不能把美国邮区原样带到其他国家的请求。

Pangolinfo 商品文档说明,省略邮区时后端会选择所在市场的邮区。省略参数适合某些不关心地区的读取任务,却不适合作为固定地区比价的默认做法。代码可以拒绝缺少邮区的任务,避免调用方以为使用了一个从未指定的目的地。

两个邮区的实测结果说明了什么?

白色款在 10041 请求中返回 $619.00,卖家为 Prime Renewed Store;90001 请求返回 $619.95,卖家为 Tech Exchangee。两个结果的 ASIN 和父编号一致,配送文字都是 Tomorrow, September 29,shippingFee 都是字符串 0。请求相隔约 40 秒,不是同一瞬间的受控试验。

因此,我们只报告“这两次不同邮区请求返回了不同卖家与价格”,不写“邮区导致涨价 0.95 美元”。时序变化、卖家选择与地区上下文都可能影响观测,而响应没有独立确认目的地的证据字段。下游应同时记录 requested_zipcode 和 destination_verified,后者在本例为未知。

shippingFee 的 0 也不能单独用来确定包邮。文档说明这个值可能表示免费,也可能缺少运费信息;本轮 fastestDelivery 和 shipper 是空字符串。程序要保留这些原值,不凭一个 0 就计算含运费总价,不把空字符串转换成“无配送”或“没有卖家”。

4. 第三步:如何连接 MCP 并调用商品工具?

本轮通过 Streamable HTTP 与远程 MCP 服务完成 initialize、initialized 通知和 tools/list,再调用 pangolinfo_capabilities。服务返回名称 pangolinfo-mcp、版本 0.9.2,工具发现结果有 21 项。本文使用的是连接当时的工具定义,不把官网某处显示的工具数量当成固定契约。

下面是通用 MCP 客户端配置示意。密钥占位值要替换为你自己的凭证,具体客户端字段以其支持方式为准;本轮使用的是临时会话客户端,未把凭证写进项目,也没有修改用户全局客户端配置。接入说明见连接与鉴权文档。

{"mcpServers":{"pangolinfo":{"url":"https://mcp.pangolinfo.com/mcp","headers":{"Authorization":"Bearer <YOUR_API_KEY>"}}}}

工具参数应来自 tools/list,而不是照着模型记忆拼接。下面这组参数已用于本轮 MCP 白色款请求。注意 MCP 的 zipcode 在 arguments 顶层;REST 则把它放到 bizContext 中,两者不能不加转换就复制。

{"name":"get_amazon_product","arguments":{"asin":"B0CMZFCQ6D","site":"amz_us","zipcode":"10041","format":"json"}}

你也可以向已接入 MCP 的 Agent 明确交代任务:“查询美国站 ASIN B0CMZFCQ6D,邮区 10041。只调用商品详情,返回标题、原始价格、卖家、父 ASIN、RAM 和存储容量;记录缺失字段,不追加评论采集。”这个提示把目标和调用范围一起给出,避免一个详情问题扩展成不必要的评论或搜索任务。

MCP 连接失败,应该先查哪一层?

本轮第一次用 Python urllib 客户端时收到 Cloudflare 403 / 1010,响应说明限制了客户端签名。之后改用标准 curl HTTP 客户端,同一服务的初始化与鉴权成功。这是本机接入过程记录,不意味着遇到 403 都能用同一办法解决,也不意味着密钥曾经失效。

区分网络接入、MCP 握手、工具参数和商品业务结果,可以减少无效排查。401 需要检查凭证;工具 BAD_INPUT 需要改参数;父编号的 SERVER 错误需要核对对象或有限复测。我们对父编号复测一次仍失败后停止,没有依赖 retriable=yes 无限重复请求。

5. 第四步:REST 怎么调用,JSON 应从哪里读取?

若要用 Python 获取亚马逊商品详情,可以直接调用 REST 商品接口。下面给出请求体,示例 ASIN 与本轮 REST 请求一致。url 留空,content 填 ASIN,parserName 使用 amzProductDetail;按 ASIN 与按完整 URL 两种输入方式不要混成互相矛盾的目标。

{"url":"","parserName":"amzProductDetail","site":"amz_us","content":"B0CMZFCQ6D","format":"json","bizContext":{"zipcode":"10041"}}

请求发送到商品文档列出的 /api/v1/scrape,鉴权放 Authorization 头,内容类型为 application/json。REST 本轮返回 HTTP 200、外层 code 0、pointCost 1.0,再进入 data.json 数组。MCP 则先返回 JSON-RPC 结果,商品数据位于 result.content 中的文本 JSON。两条路径最终出现相同的商品结果层级。

MCP 文本结果与 REST 响应汇入业务状态、任务状态、商品数组和身份核对的流程图
MCP 与 REST 商品响应的读取路径;依据 2026-09-28 实测响应绘制。

先看请求是否取得响应,再检查 MCP isError 或 JSON-RPC error,然后检查业务 code、任务 code 和 results。只有这些检查都完成,才轮到比对返回 ASIN。解析流程如果直接写成 response.price,读到的是不存在的路径;如果只判断 HTTP 200,父编号与格式错误也会被误记成成功。

真实响应里,哪些字段需要保留原义?

以下是 MCP 美国站 10041 白色款响应的字段节选。为了阅读省略了其他字段和数组元素,结构与展示值来自原始返回,不是重新模拟的响应。它代表 2026-09-28 本轮采样,不能作为发布日或阅读日的报价。

{
  "asin": "B0CMZFCQ6D",
  "parentAsin": "B0GP8D698X",
  "title": "Apple iPhone 15 Pro, 512GB, White Titanium - Unlocked (Renewed)",
  "price": "$619.00",
  "size": "8 GB",
  "color": "",
  "seller": {
    "hasLink": true,
    "name": "Prime Renewed Store",
    "link": "/gp/help/seller/at-a-glance.html/ref=dp_merchant_link?ie=UTF8&seller=A1NY8YUA22BXMM&asin=B0CMZFCQ6D&ref_=dp_merchant_link",
    "id": "A1NY8YUA22BXMM"
  },
  "delivery": {
    "deliveryTime": "Tomorrow, September 29",
    "fastestDelivery": ""
  },
  "attributes": [
    {
      "value": "8 GB",
      "key": "RAM Memory Installed"
    },
    {
      "value": "512 GB",
      "key": "Memory Storage Capacity"
    },
    {
      "value": "White Titanium",
      "key": "Color"
    }
  ]
}

这条商品结果有 51 个顶层键、49 项 attributes、3 个 images 元素,另有不同用途的图片数组。键数量不是 51 项业务条件都已满足,更不表示每个键都有值。读取图片时也应明确选择 images 还是高分辨率数组,去重和尺寸判断由自己的展示需求决定。

RAM Memory Installed 的值是 8 GB,Memory Storage Capacity 是 512 GB,Color 是 White Titanium。顶层 size 同样为 8 GB,而 color 是空字符串。一个只靠顶层 size 和 color 的目录导入程序,会把 RAM 当成存储,或错过已经存在于 attributes 的颜色。处理方法是按属性名建立映射,同时保存原数组,不能按数组第几项取值。

商品标题中的 Renewed 是购买对象的一部分,不能在比较新品报价时删去。seller.name 与 seller.id 应和 price 一起保存;这次两个邮区返回不同卖家,若只导出 ASIN 和价格,就丢掉了解释差异所需的信息。price 的美元符号也不应被默默删除后直接跨市场求差。

为什么 18 个变体条目不等于 18 件商品?

白色款 variantDetails 有 18 项,但按 ASIN 去重只有 15 个值。同一个子 ASIN 在容量、颜色、运营商或商品状态选项里可重复出现,所以这个数组首先是页面选项信息,不是经过验收的独立商品清单。返回的变体价格为空,也不能把当前选中价格复制到所有选项。

黑色子 ASIN B0CMZ5KBNS 在另一次请求中返回 $617.95,卖家为 Cell Surfers;它与白色款共享同一个 parentAsin。这个样本支持我们把两者作为需要分别查询的购买选项,但仍不证明已覆盖整个商品族。详情对象与变体映射的完整设计会放到后续专题。

详情页评论同样有范围限制。10041 白色款响应有 13 个 reviews 元素,90001 响应则为 null。这个差异不能被解释成“该地区没有评论”。若业务需要分页、筛选或评论归属研究,应单独评估 Amazon Review API,不要用详情页片段替代评论数据集。

6. 第五步:怎样用 Python 保存 JSON 和 CSV?

最小请求能解释接口,保存程序则需要为失败留痕。配套脚本 product_by_asin.py 支持实时 REST 调用与离线证据读取:凭证从环境变量获取,经标准输入传给 curl;原始响应先保存,再检查状态和字段。运行环境需要 Python 3.10 及以上和 curl,密钥由运行环境注入,不写进源代码。

python3 examples/product_by_asin.py --asin B0CMZFCQ6D --site amz_us --zipcode 10041 --output captures

复现文章里的既有结果时可以使用 fixture 模式,它读取随项目保存的证据,不再调用远程接口。不要把离线回放写成一次新的实时查询。输出会标明 fixture 或 live,并且检查输入 ASIN、站点和邮区是否与证据记录一致,避免把别的样本贴上新参数标签。

python3 examples/product_by_asin.py --asin B0CMZFCQ6D --site amz_us --zipcode 10041 --fixture 04_元数据/evidence/product-us-10041.json --output replay

下面是解析商品结果的核心代码。完整可运行脚本与文章一起交付,包含网络调用、原始记录保存、JSON 输出和 CSV 导出;这里集中展示最容易被忽略的状态检查。代码兼容任务数组元素是对象或 JSON 字符串两种形态,本轮实际收到的是对象。

import json

def extract(response):
    if 'error' in response:
        raise ValueError('JSON-RPC error; inspect saved evidence')
    if 'result' in response:
        result = response['result']
        if result.get('isError'):
            raise ValueError('MCP tool error; inspect saved evidence')
        parts = [x['text'] for x in result.get('content', []) if x.get('type') == 'text']
        if len(parts) != 1:
            raise ValueError('Unexpected MCP content shape')
        response = json.loads(parts[0])
    if response.get('code') != 0:
        raise ValueError('API business error')
    tasks = response.get('data', {}).get('json')
    if not isinstance(tasks, list) or not tasks:
        raise ValueError('Missing task list')
    rows = []
    for task in tasks:
        task = json.loads(task) if isinstance(task, str) else task
        if not isinstance(task, dict) or task.get('code') != 0:
            raise ValueError('Task error')
        items = task.get('data', {}).get('results')
        if not isinstance(items, list) or not items or not all(isinstance(x, dict) for x in items):
            raise ValueError('Missing product results')
        rows.extend(items)
    return rows
展开完整 Python 请求与导出脚本
"""Fetch a single ASIN through REST, or inspect a saved MCP/REST capture.
Requires Python 3.10+ and curl for live requests. No credentials in files.
"""
import argparse
import csv
import json
import os
from pathlib import Path
import re
import subprocess
from datetime import datetime, timezone
from uuid import uuid4


def extract(response):
    if 'error' in response:
        raise ValueError('JSON-RPC error; inspect saved evidence')
    if 'result' in response:
        result = response['result']
        if result.get('isError'):
            raise ValueError('MCP tool error; inspect saved evidence')
        parts = [x['text'] for x in result.get('content', []) if x.get('type') == 'text']
        if len(parts) != 1:
            raise ValueError('Unexpected MCP content shape')
        response = json.loads(parts[0])
    if response.get('code') != 0:
        raise ValueError('API business error')
    tasks = response.get('data', {}).get('json')
    if not isinstance(tasks, list) or not tasks:
        raise ValueError('Missing task list')
    rows = []
    for task in tasks:
        task = json.loads(task) if isinstance(task, str) else task
        if not isinstance(task, dict) or task.get('code') != 0:
            raise ValueError('Task error')
        items = task.get('data', {}).get('results')
        if not isinstance(items, list) or not items or not all(isinstance(x, dict) for x in items):
            raise ValueError('Missing product results')
        rows.extend(items)
    return rows


def csv_safe(value):
    text = '' if value is None else str(value)
    return "'" + text if text.lstrip().startswith(('=', '+', '-', '@')) else text


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument('--asin', required=True)
    parser.add_argument('--site', default='amz_us')
    parser.add_argument('--zipcode', required=True)
    parser.add_argument('--fixture', type=Path)
    parser.add_argument('--output', type=Path, default=Path('captures'))
    args = parser.parse_args()
    asin = args.asin.strip().upper()
    if not re.fullmatch(r'[A-Z0-9]{10}', asin):
        parser.error('ASIN must contain 10 letters/digits')
    args.output.mkdir(parents=True, exist_ok=True)
    if args.fixture:
        record = json.loads(args.fixture.read_text())
        req = record.get('request', {})
        context = req.get('params', {}).get('arguments', {}) if req.get('method') == 'tools/call' else req
        captured_asin = context.get('asin', context.get('content'))
        captured_zip = context.get('zipcode', context.get('bizContext', {}).get('zipcode'))
        if (captured_asin, context.get('site'), captured_zip) != (asin, args.site, args.zipcode):
            raise ValueError('Fixture request differs from CLI context')
        mode = 'fixture'
    else:
        key = os.environ.get('PANGOLINFO_API_KEY', '')
        if not key or '\n' in key or '\r' in key:
            parser.error('Set PANGOLINFO_API_KEY in the process environment')
        payload = {'url': '', 'parserName': 'amzProductDetail', 'site': args.site,
                   'content': asin, 'format': 'json', 'bizContext': {'zipcode': args.zipcode}}
        started = datetime.now(timezone.utc).isoformat()
        config = 'url = "https://scrapeapi.pangolinfo.com/api/v1/scrape"\nrequest = "POST"\n'
        for h in ['Content-Type: application/json', 'Authorization: Bearer ' + key]:
            config += 'header = ' + json.dumps(h) + '\n'
        config += 'data = ' + json.dumps(json.dumps(payload)) + '\n'
        env = {k: v for k, v in os.environ.items() if k != 'PANGOLINFO_API_KEY'}
        proc = subprocess.run(['curl', '-sS', '--max-time', '60', '--config', '-',
                               '--write-out', '\n%{http_code}'], input=config,
                              text=True, capture_output=True, env=env)
        raw = proc.stdout.replace(key, '[REDACTED]')
        body, _, status = raw.rpartition('\n')
        record = {'request': payload, 'started_at_utc': started,
                  'received_at_utc': datetime.now(timezone.utc).isoformat(),
                  'http_status': int(status) if status.isdigit() else 0,
                  'curl_exit': proc.returncode, 'raw_body': body}
        try:
            record['response'] = json.loads(body)
        except ValueError:
            record['response'] = {}
        mode = 'live'
    stem = args.output / (mode + '-' + uuid4().hex)
    stem.with_suffix('.raw.json').write_text(json.dumps(record, ensure_ascii=False, indent=2))
    if record.get('http_status') != 200 or record.get('curl_exit', 0):
        raise ValueError('Transport failure; inspect saved evidence')
    rows = extract(record['response'])
    outputs = []
    for item in rows:
        if item.get('asin') != asin:
            raise ValueError('Returned ASIN mismatch; inspect saved evidence')
        attrs = {}
        for a in item.get('attributes') or []:
            attrs.setdefault(a.get('key'), []).append(a.get('value'))
        outputs.append({'mode': mode, 'requested_asin': asin, 'returned_asin': item['asin'],
                        'site': args.site, 'requested_zipcode': args.zipcode,
                        'received_at_utc': record.get('received_at_utc'),
                        'source_captured_at': None, 'destination_verified': None,
                        'title': item.get('title'), 'price_raw': item.get('price'),
                        'size_raw': item.get('size'), 'attributes_by_name': attrs,
                        'ready_for_price_comparison': False})
    stem.with_suffix('.json').write_text(json.dumps(outputs, ensure_ascii=False, indent=2))
    columns = ['requested_asin', 'returned_asin', 'site', 'requested_zipcode', 'title', 'price_raw']
    with stem.with_suffix('.csv').open('w', newline='', encoding='utf-8-sig') as handle:
        writer = csv.DictWriter(handle, fieldnames=columns)
        writer.writeheader()
        writer.writerows({k: csv_safe(row.get(k)) for k in columns} for row in outputs)
    print(json.dumps({'mode': mode, 'records': len(outputs), 'output_stem': str(stem)}))


if __name__ == '__main__':
    main()

导出的 JSON 保留原始价格、size、按名称分组的属性、请求邮区和客户端接收时间。source_captured_at 与 destination_verified 在缺少证据时保持 null;ready_for_price_comparison 明确设为 false,因为通过结构和身份检查还不能确认价格可比。CSV 是便于查看的平面投影,不包含原始响应的全部信息。

属性名重复时,程序保留多个值,不用后一个静默覆盖前一个。缺失值不补成 0。针对外部文本导出到表格的场景,CSV 还处理了可能被表格软件解释为公式的起始字符;原始 JSON 不因此被改写。这里的保存规则是应用侧设计,不是 Pangolinfo 响应字段。

7. 单次查询怎样扩展为批量任务?

本篇的详情调用一次传入一个 ASIN。若有一份 ASIN 列表,可以在客户端去重、排队、逐条调用,并给每次请求保存自己的结果;不能把循环称为服务端原生批量接口。去重键至少包含站点、ASIN、邮区与所需格式,否则会把不同地区任务误合并。

先用低并发确认错误类型和额度,再按服务约定调整。为每条任务区分待处理、成功、输入错误、待复测与需人工检查。BAD_INPUT 直接退回输入修正;网络超时要保留结果未知状态;父编号本次两次 SERVER 错误后停止。服务端允许重试不代表应用应该无上限重试。

本轮三条正常 MCP 商品观测与一条 REST 对照均各返回 pointCost 1;构造编号响应也返回 1。五个响应合计声明 5 点,两次父编号错误与格式错误中没有可据此确认的扣费值。我们没有读取账单,所以不把 5 点写成整个实验的最终扣费。套餐与实际计费以价格页和账户记录为准。

耗时同样要保留口径。三次正常 MCP 子商品请求在本机记录约 4.47–5.22 秒,REST 对照约 5.29 秒;这些是客户端从发出到接收的单次耗时,不是后端处理时间,也不是两种方式的性能排名。两条路径顺序执行、样本少,没有控制网络与缓存,因此不做速度优劣判断。

白色款两个邮区及黑色款一个邮区的实测价格和卖家对照
三次子商品请求的价格与卖家对照;2026-09-28 非同时请求,价差不能单独归因于邮区。实测对象为手机,图中鞋子图标仅作示意。

8. 实际接入时,哪些结果应该停下来核对?

观察到的结果本轮证据应采取的动作
HTTP 200,但 isError=true父编号和格式错误先识别工具错误,禁止继续读商品字段
size 与业务容量不同8 GB 与属性中的 512 GB按属性语义映射,保留原值
相同 ASIN,卖家与价格不同两个邮区的白色款比较上下文,不单独归因于邮区
格式正确、code 0,但内容冲突构造编号的标题与类目隔离记录,补页面或其他证据
shippingFee=0、部分配送字段为空本轮正常手机响应保留未知状态,不推定到手价

这张表不是建议每次请求都做人工审核。结构、身份、必填字段和已知格式可以自动检查;标题与类目冲突、属性语义变化或卖家切换则进入更具体的业务规则。规则要服务于任务:商品图片补全与价格告警,不必共用一条相同的通过标准。

想看其他业务怎样利用采集数据,可以阅读Pangolinfo 数据采集案例。这些案例是进一步阅读,本篇的实时记录是独立实验,不借其他案例的规模或效果为本轮请求背书。使用 Agent 工作流时,也可了解 Amazon Scraper Skill;它不会替你消除字段含义和比较口径的问题。

按 ASIN 获取亚马逊商品详情,第一步是拿到数据,下一步是让每条值保留它属于谁、在哪个市场、按什么条件取得。可以从本例的一个子 ASIN 开始,保存原始响应和请求参数,再检查自己最关心的字段。你的任务若是比价,先确认卖家、规格、币种和配送条件;若是补目录,先确认属性映射和来源。

常见问题

没有卖家账号能查询商品详情吗?

取决于接入路线。本篇使用 Pangolinfo 账户凭证;Amazon 官方业务接口有各自授权要求。不能把一种接口的资格套到其他接口。

父 ASIN 可以直接代替子 ASIN 吗?

不能作统一替代。本轮父编号两次返回工具错误,子编号可取得结果;其他商品需按实际返回确认。查购买条件时优先使用目标子 ASIN。

返回的价格就是最终付款金额吗?

不是。还需核对卖家、商品状态、币种、配送、运费与优惠资格。shippingFee 为 0 不能单独证明运费已确认。

一次请求可以查询多个 ASIN 吗?

本篇使用的 get_amazon_product 接受一个 asin。客户端队列可以组织多个请求,但不等于该工具原生支持批量数组。

可以把结果直接导出到 Excel 吗?

配套程序导出 CSV,可用于表格查看。原始 JSON 另存,保留嵌套属性、请求上下文与缺失状态,避免平面表丢失信息。

Pangolinfo 系列解决方案

从这里,开启您的下一个项目。

三种方式,将亚马逊数据融入您的工作流。

面向开发者

Amazon Scraper API

通过 API 将亚马逊商品数据集成到应用中,构建自己的数据工作流。

了解 API
面向 AI 应用

Amazon Data MCP

通过 MCP 将亚马逊数据连接到 AI 工具,让数据融入智能应用。

了解 MCP
面向智能体工作流

Amazon Scraper Skill

通过可复用的 Skill,将亚马逊数据采集任务融入智能体工作流。

了解 Skill

微信扫一扫
与我们联系

QR Code
快速测试