在跨境电商选品、价格监控和市场分析中,稳定获取亚马逊商品详情数据是核心能力。本文深度解析Amazon Product Advertising API的ItemLookup接口(即item_get),提供从AWS认证到生产级Python代码的完整实战方案。
一、接口概述
1.1 核心功能
Amazon item_get接口通过商品ASIN(Amazon Standard Identification Number)获取全维度商品信息,覆盖:
-
基础信息:ASIN、标题、品牌、类目、商品URL、主图及多图列表
-
价格体系:售价、市场价、折扣、货币单位(支持全球多币种)
-
库存状态:库存状态、预售标识、Prime配送资格
-
交易数据:销量排名(Sales Rank)、评分、评论数、问答数据
-
SKU规格:颜色、尺寸等多规格组合及对应价格/库存
-
卖家信息:卖家名称、评分、是否为Amazon自营
-
多媒体:高清图片、视频链接、A+页面内容
-
物流信息:配送方式、运费、发货地、预计送达时间
1.2 接口端点(区域化)
Amazon接口需严格区分区域站点,不同国家endpoint不同:
| 站点 | 域名 | Marketplace ID | 适用市场 |
|---|---|---|---|
| 美国 | webservices.amazon.com | ATVPDKIKX0DER | 北美 |
| 英国 | webservices.amazon.co.uk | A1F83G8C2ARO7P | 欧洲 |
| 日本 | webservices.amazon.co.jp | A1VC38T7YXB528 | 日本 |
| 德国 | webservices.amazon.de | A1PA6795UKMFR9 | 欧洲 |
| 加拿大 | webservices.amazon.ca | A2EUQ1WTGCTBG2 | 北美 |
二、准备工作
2.1 注册开发者账号
-
注册企业开发者账号(个人账号权限受限)
2.2 申请API权限
-
item_get接口属于Product Advertising API基础功能,需单独申请开通 -
配额限制:默认每小时4000次调用,可申请扩容
-
区域权限:不同站点需分别申请权限(美国站、欧洲站、日本站等)
2.3 环境准备
pip install requests
pip install botocore # AWS SDK,用于自动生成签名
三、认证机制:AWS Signature Version 4
Amazon采用业界最严格的AWS Signature Version 4签名算法,手动实现易出错,强烈建议使用AWS SDK。
3.1 签名生成步骤(原理)
-
创建规范请求(Canonical Request)
-
创建签名密钥(Signing Key):
AWS4 + Secret Key + Date + Region + Service -
计算签名(Signature):HMAC-SHA256
-
构建Authorization头:包含签名、Access Key、Scope等信息
3.2 Python实现(推荐SDK方式)
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
import requests
import datetime
class 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 |
| IdType | 是 | ID类型,固定为ASIN | ASIN |
| AWSAccessKeyId | 是 | IAM用户Access Key | AKIAIOSFODNN7EXAMPLE |
| AssociateTag | 是 | 推广追踪标签 | my-store-20 |
| Timestamp | 是 | UTC时间戳,ISO 8601格式 | 2025-01-15T12:00:00Z |
4.2 ResponseGroup字段组(关键)
可组合多个组,用逗号分隔:
-
ItemAttributes:标题、品牌、型号、规格参数、包装清单 -
Offers:价格、库存、卖家信息、Prime资格 -
Images:主图、详情图、缩略图 -
SalesRank:销量排名(大类和小类) -
Reviews:评价摘要、评分分布 -
Variations:多规格SKU数据 -
EditorialReview:官方编辑描述 -
BrowseNodes:类目路径
4.3 多规格商品处理
当商品有多个SKU时,Variations字段包含所有规格组合:
# 解析多规格示例
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示例)
5.2 关键字段说明
-
SalesRank:数字越小销量越高,需结合大类目判断 -
Offers/Offer/IsEligibleForPrime:是否为Prime商品,影响转化率 -
CustomerReviews/TotalReviews:评价总数,虚假评论需过滤 -
PackageDimensions:包装尺寸,用于物流成本计算 -
ItemDimensions:商品尺寸,用于FBA费用估算
六、高级实战技巧
6.1 多区域站点轮询
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个)
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 错误处理与重试
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 配额监控
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 常见错误码
| 错误码 | 含义 | 解决方案 |
|---|---|---|
ItemNotFound | ASIN不存在 | 检查ASIN是否有效,或商品已下架 |
InvalidParameterValue | 参数错误 | 验证Timestamp格式、ResponseGroup拼写 |
SignatureDoesNotMatch | 签名错误 | 检查Secret Key、参数排序、编码 |
RequestThrottled | 频率超限 | 降低调用频率,或申请更高配额 |
八、替代方案:第三方Scrape API
如果官方API权限申请困难,可使用第三方服务如Pangolin Scrape API:
# 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封装方案可自动处理签名,大幅降低开发难度。
244

被折叠的 条评论
为什么被折叠?



