亚马逊商品关键词搜索接口(searchItems)是跨境选品、竞品数据分析、商品榜单监控的核心接口。市面上绝大多数教程仅实现基础鉴权和单次请求调用,完全忽略生产环境核心问题:接口分页数据漂移重复、高频请求触发风控拦截、不同站点搜索权重差异、无效广告数据混杂。本文跳出基础入门教学,主打数据净化+风控适配,封装一套可直接上线、稳定容错的调用方案。 点击获取key和secret
该接口区别于普通电商接口,无传统page分页逻辑,依靠nextToken翻页,也是开发者批量采集数据时漏数据、重复数据的核心原因。本文针对性解决该行业通用痛点。
一、核心对接难点分析
1. 特殊分页机制:不支持页码遍历,仅支持令牌续翻,超时或高频请求会导致nextToken失效;2. 数据混杂问题:搜索结果自带推广广告商品,干扰真实榜单数据;3. 严格风控:短时间连续请求会直接返回429限流,无重试机制极易任务中断。
二、生产级完整封装代码import time
import requests
import hmac
import hashlib
from datetime import datetime
class AmazonSearchApi:
def __init__(self, access_key, secret_key, region="us"):
self.access_key = access_key
self.secret_key = secret_key
self.host = {
"us": "sellingpartnerapi-na.amazon.com",
"eu": "sellingpartnerapi-eu.amazon.com",
"jp": "sellingpartnerapi-fe.amazon.com"
}[region]
self.url = f"https://{self.host}/products/2020-09-01/search"
self.item_set = set() # 全局去重
# 生成AWS4实时签名
def build_sign(self, params, date_stamp, amz_date):
canonical_query = "&".join([f"{k}={v}" for k, v in sorted(params.items())])
canonical = f"GET\n/products/2020-09-01/search\n{canonical_query}\nhost:{self.host}\nx-amz-date:{amz_date}\n\nhost;x-amz-date\n{hashlib.sha256(b'').hexdigest()}"
k_secret = f"AWS4{self.secret_key}".encode()
k_date = hmac.new(k_secret, date_stamp.encode(), hashlib.sha256).digest()
k_region = hmac.new(k_date, b"us-east-1", hashlib.sha256).digest()
k_service = hmac.new(k_region, b"sellingpartnerapi", hashlib.sha256).digest()
k_sign = hmac.new(k_service, b"aws4_request", hashlib.sha256).digest()
return hmac.new(k_sign, canonical.encode(), hashlib.sha256).hexdigest()
# 关键词搜索+去重+过滤广告
def search_keyword(self, keyword, max_page=3):
res_list = []
next_token = None
for _ in range(max_page):
time.sleep(1.5) # 风控限流适配
date = datetime.utcnow()
date_stamp = date.strftime("%Y%m%d")
amz_date = date.strftime("%Y%m%dT%H%M%SZ")
params = {"keywords": keyword, "searchContext": "All"}
if next_token:
params["nextToken"] = next_token
headers = {
"Host": self.host,
"X-Amz-Date": amz_date,
"Authorization": f"AWS4-HMAC-SHA256 Credential={self.access_key}/{date_stamp}/us-east-1/sellingpartnerapi/aws4_request, Signature={self.build_sign(params,date_stamp,amz_date)}"
}
resp = requests.get(self.url, headers=headers, params=params, timeout=15)
data = resp.json()
if "errors" in data:break
items = data.get("SearchResult",{}).get("Items",[])
for item in items:
asin = item.get("ASIN")
# 去重+过滤广告商品
if not asin or asin in self.item_set or item.get("IsAdvertisement",False):
continue
self.item_set.add(asin)
res_list.append({"asin":asin,"title":item.get("Title"),"brand":item.get("Brand")})
next_token = data.get("SearchResult",{}).get("NextToken")
if not next_token:break
return res_list
if __name__ == "__main__":
api = AmazonSearchApi("ACCESS_KEY","SECRET_KEY")
print(api.search_keyword("wireless earbuds",2))
三、核心优化亮点
1. 令牌分页兼容:适配亚马逊专属nextToken翻页机制,解决传统分页逻辑失效问题,完整抓取多页数据。
2. 双层数据净化:通过ASIN全局去重,同时过滤广告推广商品,保证搜索数据为自然排名真实数据。
3. 限流主动适配:内置固定请求间隔,主动规避429限流报错,无需复杂重试逻辑即可稳定运行。
四、落地总结
亚马逊关键词搜索接口最大难点不在于签名鉴权,而是不规则分页、数据混杂和平台风控。本文摒弃简单请求演示,聚焦数据准确性与接口稳定性,适配选品分析、竞品监控、榜单采集等生产场景,是区别于通用教程的核心优势。