Amazon(亚马逊)开放平台的item_get接口是获取商品详情的核心工具,适用于全球跨境电商分析、多平台比价、选品系统等场景。本文将作为全球最大的电商平台之一,其商品数据具有极高的商业价值。本文将全面讲解该接口的对接流程、认证机制、代码实现及最佳实践,帮助开发者系统掌握从入门到精通的全流程。
一、接口基础认知
二、对接前置准备
三、接口调用流程
四、代码实现示例(Python)
import requests
import datetime
import hashlib
import hmac
import urllib.parse
from botocore.auth import SigV4Auth
from botocore.awsrequest import AWSRequest
class AmazonItemApi:
def __init__(self, access_key, secret_key, associate_tag, region="com"):
self.access_key = access_key
self.secret_key = secret_key
self.associate_tag = associate_tag
self.region = region # 区域:com/co.uk/de/co.jp等
self.host = f"webservices.amazon.{region}"
self.endpoint = f"https://{self.host}/onca/xml" # 部分区域支持JSON,需申请
def generate_signature_v4(self, params):
"""使用AWS SDK生成V4签名"""
# 准备请求参数
params["Service"] = "AWSECommerceService"
params["AWSAccessKeyId"] = self.access_key
params["AssociateTag"] = self.associate_tag
params["Timestamp"] = datetime.datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%SZ')
# 构建AWS请求
request = AWSRequest(
method="GET",
url=self.endpoint,
params=params
)
# 签名请求
sigv4 = SigV4Auth(
credentials={
'access_key': self.access_key,
'secret_key': self.secret_key
},
service_name="AWSECommerceService",
region_name=self.region
)
sigv4.add_auth(request)
return request.url
def parse_xml_response(self, xml_content):
"""解析XML响应为字典(简化版)"""
# 实际应用中建议使用lxml等库进行解析
import xmltodict
try:
return xmltodict.parse(xml_content)
except Exception as e:
return {"error": f"XML解析失败: {str(e)}"}
def item_get(self, asin, response_group="ItemAttributes,Offers,Images,SalesRank"):
"""
获取商品详情
:param asin: 商品ASIN编码(必填)
:param response_group: 返回字段组,多个用逗号分隔
:return: 商品详情数据
"""
# 1. 组装业务参数
params = {
"Operation": "ItemLookup",
"ItemId": asin,
"ResponseGroup": response_group
}
# 2. 生成签名并获取完整URL
signed_url = self.generate_signature_v4(params)
try:
# 3. 发送GET请求
response = requests.get(
url=signed_url,
timeout=20
)
response.raise_for_status()
# 4. 解析响应(Amazon默认返回XML,JSON需单独申请)
result = self.parse_xml_response(response.content)
# 5. 处理响应
if "ItemLookupResponse" not in result:
return {
"success": False,
"error_msg": "无效的响应格式"
}
items = result["ItemLookupResponse"].get("Items", {})
if "Error" in items:
return {
"success": False,
"error_code": items["Error"]["Code"],
"error_msg": items["Error"]["Message"]
}
return {
"success": True,
"data": items.get("Item", {})
}
except Exception as e:
return {
"success": False,
"error_msg": f"请求异常: {str(e)}"
}
# 使用示例
if __name__ == "__main__":
# 替换为实际参数
ACCESS_KEY = "your_access_key"
SECRET_KEY = "your_secret_key"
ASSOCIATE_TAG = "your_associate_tag"
REGION = "com" # 美国站点
# 初始化API客户端
api = AmazonItemApi(ACCESS_KEY, SECRET_KEY, ASSOCIATE_TAG, REGION)
# 调用接口,获取商品详情(ASIN为示例)
result = api.item_get(
asin="B07VGRJDFY",
response_group="ItemAttributes,Offers,Images,SalesRank,Reviews"
)
if result["success"]:
item = result["data"]
# 提取基本信息(XML解析后结构可能嵌套较深)
item_attrs = item.get("ItemAttributes", {})
offers = item.get("Offers", {}).get("Offer", {})
print(f"ASIN: {item.get('ASIN')}")
print(f"标题: {item_attrs.get('Title')}")
print(f"售价: {offers.get('OfferListing', {}).get('Price', {}).get('FormattedPrice')}")
print(f"品牌: {item_attrs.get('Brand')}")
print(f"销量排名: {item.get('SalesRank')}")
print(f"主图: {item.get('LargeImage', {}).get('URL')}")
else:
print(f"获取失败: {result['error_msg']} (错误码: {result.get('error_code')})")