×

实战解析:Amazon商品详情API接口(item_get)完整指南

admin admin 发表于2025-11-17 16:22:20 浏览4 评论0

抢沙发发表评论

在跨境电商选品、价格监控和市场分析中,稳定获取亚马逊商品详情数据是核心能力。本文深度解析Amazon Product Advertising API的ItemLookup接口(即item_get),提供从AWS认证到生产级Python代码的完整实战方案。

一、接口概述

1.1 核心功能

Amazon item_get接口(官方方法名:ItemLookup)通过商品ASIN(Amazon Standard Identification Number)获取全维度商品信息,覆盖:
  • 基础信息:ASIN、标题、品牌、类目、商品URL、主图及多图列表
  • 价格体系:售价、市场价、折扣、货币单位(支持全球多币种)
  • 库存状态:库存状态、预售标识、Prime配送资格
  • 交易数据:销量排名(Sales Rank)、评分、评论数、问答数据
  • SKU规格:颜色、尺寸等多规格组合及对应价格/库存
  • 卖家信息:卖家名称、评分、是否为Amazon自营
  • 多媒体:高清图片、视频链接、A+页面内容
  • 物流信息:配送方式、运费、发货地、预计送达时间

1.2 接口端点(区域化)

Amazon接口需严格区分区域站点,不同国家endpoint不同:
表格
复制
站点域名Marketplace ID适用市场
美国webservices.amazon.comATVPDKIKX0DER北美
英国webservices.amazon.co.ukA1F83G8C2ARO7P欧洲
日本webservices.amazon.co.jpA1VC38T7YXB528日本
德国webservices.amazon.deA1PA6795UKMFR9欧洲
加拿大webservices.amazon.caA2EUQ1WTGCTBG2北美

二、准备工作

2.1 注册开发者账号

  1. 访问Amazon开发者平台,注册企业开发者账号(个人账号权限受限)
  2. 在AWS控制台创建IAM用户:
    • 创建用户,选择编程访问,获取Access Key IDSecret Access Key
  3. 注册Amazon Product Advertising API,关联IAM用户
  4. 获取Associate Tag(追踪推荐流量的必填标识)

2.2 申请API权限

  • item_get接口属于Product Advertising API基础功能,需单独申请开通
  • 配额限制:默认每小时4000次调用,可申请扩容
  • 区域权限:不同站点需分别申请权限(美国站、欧洲站、日本站等)

2.3 环境准备

bash
复制
pip install requests
pip install botocore  # AWS SDK,用于自动生成签名



三、认证机制:AWS Signature Version 4

Amazon采用业界最严格的AWS Signature Version 4签名算法,手动实现易出错,强烈建议使用AWS SDK

3.1 签名生成步骤(原理)

  1. 创建规范请求(Canonical Request)
  2. 创建签名密钥(Signing Key):AWS4 + Secret Key + Date + Region + Service
  3. 计算签名(Signature):HMAC-SHA256
  4. 构建Authorization头:包含签名、Access Key、Scope等信息

3.2 Python实现(推荐SDK方式)

Python
复制
from botocore.auth import SigV4Authfrom botocore.awsrequest import AWSRequestimport requestsimport datetimeclass AmazonItemAPI:
    """Amazon商品详情API客户端"""
    
    def __init__(self, access_key: str, secret_key: str, associate_tag: str, region: str = "com"):
        self.access_key = access_key
        self.secret_key = secret_key
        self.associate_tag = associate_tag
        self.region = region
        self.host = f"webservices.amazon.{region}"
        self.endpoint = f"https://{self.host}/onca/xml"  # 支持JSON需额外申请
    
    def item_get(self, asin: str, response_group: str = "ItemAttributes,Offers,Images") -> dict:
        """
        获取商品详情
        :param asin: 商品ASIN编码
        :param response_group: 返回字段组,逗号分隔
        """
        # 构建请求参数
        params = {
            "Service": "AWSECommerceService",
            "Operation": "ItemLookup",
            "IdType": "ASIN",
            "ItemId": asin,
            "ResponseGroup": response_group,
            "AWSAccessKeyId": self.access_key,
            "AssociateTag": self.associate_tag,
            "Timestamp": datetime.datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ")
        }
        
        # 使用AWS SDK生成签名
        request = AWSRequest(method="GET", url=self.endpoint, params=params)
        SigV4Auth(
            credentials={"access_key": self.access_key, "secret_key": self.secret_key},
            service_name="ProductAdvertisingAPI",
            region_name=self.region        ).add_auth(request)
        
        # 发送请求
        response = requests.get(self.endpoint, params=params, headers=dict(request.headers))
        response.raise_for_status()
        
        # 解析XML响应(默认返回XML,JSON需特殊申请)
        import xml.etree.ElementTree as ET
        root = ET.fromstring(response.content)
        
        # 检查错误
        error = root.find(".//Error")
        if error is not None:
            return {
                "success": False,
                "error_code": error.find("Code").text,
                "error_msg": error.find("Message").text            }
        
        return {
            "success": True,
            "data": self._parse_item(root.find(".//Item"))
        }
    
    def _parse_item(self, item_element) -> dict:
        """解析商品XML节点"""
        if item_element is None:
            return {}
        
        return {
            "ASIN": item_element.findtext("ASIN"),
            "title": item_element.findtext(".//ItemAttributes/Title"),
            "brand": item_element.findtext(".//ItemAttributes/Brand"),
            "price": item_element.findtext(".//Offers/Offer/OfferListing/Price/FormattedPrice"),
            "currency": item_element.findtext(".//Offers/Offer/OfferListing/Price/CurrencyCode"),
            "stock": item_element.findtext(".//Offers/Offer/OfferListing/Availability"),
            "sales_rank": item_element.findtext("SalesRank"),
            "main_image": item_element.findtext(".//LargeImage/URL"),
            "review_count": item_element.findtext(".//CustomerReviews/TotalReviews"),
            "rating": item_element.findtext(".//CustomerReviews/AverageRating"),
            "seller": item_element.findtext(".//Offers/Offer/Merchant/Name"),
            "is_amazon_fulfilled": item_element.findtext(".//Offers/Offer/IsEligibleForPrime") == "1"
        }



四、核心参数详解

4.1 请求参数

表格
复制
参数必填说明示例
ItemId商品ASIN编码,从商品URL提取B07VGRJDFY
ResponseGroup返回字段组,可组合使用ItemAttributes,Offers,Images
IdTypeID类型,固定为ASINASIN
AWSAccessKeyIdIAM用户Access KeyAKIAIOSFODNN7EXAMPLE
AssociateTag推广追踪标签my-store-20
TimestampUTC时间戳,ISO 8601格式2025-01-15T12:00:00Z

4.2 ResponseGroup字段组(关键)

可组合多个组,用逗号分隔:
  • ItemAttributes  :标题、品牌、型号、规格参数、包装清单
  • Offers  :价格、库存、卖家信息、Prime资格
  • Images  :主图、详情图、缩略图
  • SalesRank  :销量排名(大类和小类)
  • Reviews  :评价摘要、评分分布
  • Variations  :多规格SKU数据
  • EditorialReview  :官方编辑描述
  • BrowseNodes  :类目路径

4.3 多规格商品处理

当商品有多个SKU时,Variations字段包含所有规格组合:
Python
复制
# 解析多规格示例variations = item_element.find(".//Variations")if variations is not None:
    sku_list = []
    for variation in variations.findall("Item"):
        sku_list.append({
            "asin": variation.findtext("ASIN"),
            "color": variation.findtext(".//ItemAttributes/Color"),
            "size": variation.findtext(".//ItemAttributes/Size"),
            "price": variation.findtext(".//Offers/Offer/OfferListing/Price/FormattedPrice"),
            "stock": variation.findtext(".//Offers/Offer/OfferListing/Availability")
        })



五、响应数据解析

5.1 完整响应结构(XML转JSON示例)

JSON
复制
{
  "success": true,
  "data": {
    "ASIN": "B07VGRJDFY",
    "title": "Sony WH-1000XM4 Wireless Headphones",
    "brand": "Sony",
    "price": "$278.00",
    "currency": "USD",
    "market_price": "$349.99",
    "discount": 0.21,
    "stock": "In Stock",
    "sales_rank": "1234",
    "main_image": "https://images-na.ssl-images-amazon.com/images/I/71o8Q5XJS5L._SL1500_.jpg",
    "image_list": [
      "https://images-na.ssl-images-amazon.com/images/I/71o8Q5XJS5L._SL1500_.jpg",
      "https://images-na.ssl-images-amazon.com/images/I/71k7b+I2Q3L._SL1500_.jpg"
    ],
    "rating": "4.7",
    "review_count": "24567",
    "seller": "Amazon.com",
    "is_amazon_fulfilled": true,
    "prime_eligible": true,
    "features": [
      "Industry-leading noise canceling with Dual Noise Sensor technology",
      "Up to 30-hour battery life"
    ],
    "variations": [
      {
        "asin": "B07VGRJDFY",
        "color": "Black",
        "price": "$278.00",
        "stock": "In Stock"
      },
      {
        "asin": "B08MVGF24M",
        "color": "Silver",
        "price": "$279.00",
        "stock": "In Stock"
      }
    ]
  }}


5.2 关键字段说明

  • SalesRank  :数字越小销量越高,需结合大类目判断
  • Offers/Offer/IsEligibleForPrime  :是否为Prime商品,影响转化率
  • CustomerReviews/TotalReviews  :评价总数,虚假评论需过滤
  • PackageDimensions  :包装尺寸,用于物流成本计算
  • ItemDimensions  :商品尺寸,用于FBA费用估算

六、高级实战技巧

6.1 多区域站点轮询

Python
复制
def multi_region_search(asin: str, regions: list):
    """多区域比价"""
    results = {}
    for region in regions:
        api = AmazonItemAPI(ACCESS_KEY, SECRET_KEY, ASSOCIATE_TAG, region)
        result = api.item_get(asin)
        if result["success"]:
            results[region] = {
                "price": result["data"]["price"],
                "currency": result["data"]["currency"],
                "stock": result["data"]["stock"]
            }
    return results# 比价示例prices = multi_region_search("B07VGRJDFY", ["com", "co.uk", "de"])print(prices)


6.2 批量ASIN查询(最多10个)

Python
复制
def batch_get_items(asins: list):
    """批量查询(不超过10个ASIN)"""
    api = AmazonItemAPI(ACCESS_KEY, SECRET_KEY, ASSOCIATE_TAG)
    params = {
        "ItemId": ",".join(asins),  # 逗号分隔
        "ResponseGroup": "ItemAttributes,Offers"
    }
    # 复用item_get逻辑,ItemId支持批量
    return api.item_get(params["ItemId"], params["ResponseGroup"])


6.3 错误处理与重试

Python
复制
from tenacity import retry, stop_after_attempt, wait_exponential@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))def safe_item_get(api: AmazonItemAPI, asin: str):
    """带重试的查询"""
    return api.item_get(asin)


6.4 配额监控

Python
复制
class QuotaManager:
    """配额管理器"""
    def __init__(self, hourly_limit: int = 4000):
        self.hourly_limit = hourly_limit
        self.call_times = []
    
    def can_call(self) -> bool:
        now = datetime.datetime.now()
        self.call_times = [t for t in self.call_times if now - t < datetime.timedelta(hours=1)]
        return len(self.call_times) < self.hourly_limit    
    def record_call(self):
        self.call_times.append(datetime.datetime.now())



七、关键注意事项

7.1 配额与限流

  • 默认配额:每小时4000次调用,超出返回RequestThrottled错误
  • 申请扩容:通过AWS Support可申请更高配额(需提供业务说明)
  • 最佳实践:实现本地缓存(Redis),重复ASIN查询间隔≥24小时

7.2 地区差异处理

  • 货币转换:不同站点返回本地货币,需通过Exchange Rates API转换
  • 语言适配:欧洲站点支持多语言,Accept-Language头控制返回语言
  • 配送规则:Prime资格、运费模板因地区而异

7.3 数据合规

  • Associate Tag必须使用:每个请求必须包含有效的推广标签,否则账号会被暂停
  • 禁止数据缓存:Amazon规定商品数据缓存不超过24小时
  • API不能使用于价格监控:违反服务条款,仅限推广和选品用途
  • 用户代理头:需设置User-Agent标识应用名称和版本

7.4 常见错误码

表格
复制
错误码含义解决方案
ItemNotFoundASIN不存在检查ASIN是否有效,或商品已下架
InvalidParameterValue参数错误验证Timestamp格式、ResponseGroup拼写
SignatureDoesNotMatch签名错误检查Secret Key、参数排序、编码
RequestThrottled频率超限降低调用频率,或申请更高配额

八、替代方案:第三方Scrape API

如果官方API权限申请困难,可使用第三方服务如Pangolin Scrape API:
Python
复制
# Pangolin API示例(无需AWS签名)import requests

API_KEY = "your_pangolin_key"ENDPOINT = "https://api.pangolinfo.com/v1/amazon/product"params = {
    "asin": "B07VGRJDFY",
    "marketplace": "US",
    "fields": "title,price,rating,images,description,reviews_total"}headers = {"Authorization": f"Bearer {API_KEY}"}response = requests.get(ENDPOINT, params=params, headers=headers)data = response.json()print(f"标题: {data['title']}, 价格: {data['price']['current_price']}")


优缺点对比
  • 官方API:数据权威、稳定,但申请门槛高、配额有限
  • 第三方API:无需签名、调用简单,但费用较高(约$0.01/次)

九、总结

Amazon item_get接口是获取全球商品数据的黄金通道,但严格的AWS Signature V4认证和配额管理对开发者提出了较高要求。本文提供的AWS SDK封装方案可自动处理签名,大幅降低开发难度。

如遇任何疑问或有进一步的需求,请随时与我私信或者评论联系。

群贤毕至

访客