×

亚马逊SP-API关键词搜索接口:分页去重与风控适配实战方案

Ace Ace 发表于2026-08-12 17:39:41 浏览5 评论0

抢沙发发表评论

亚马逊商品关键词搜索接口(searchItems)是跨境选品、竞品数据分析、商品榜单监控的核心接口。市面上绝大多数教程仅实现基础鉴权和单次请求调用,完全忽略生产环境核心问题:接口分页数据漂移重复、高频请求触发风控拦截、不同站点搜索权重差异、无效广告数据混杂。本文跳出基础入门教学,主打数据净化+风控适配,封装一套可直接上线、稳定容错的调用方案。
该接口区别于普通电商接口,无传统page分页逻辑,依靠nextToken翻页,也是开发者批量采集数据时漏数据、重复数据的核心原因。本文针对性解决该行业通用痛点。


一、核心对接难点分析
1. 特殊分页机制:不支持页码遍历,仅支持令牌续翻,超时或高频请求会导致nextToken失效;2. 数据混杂问题:搜索结果自带推广广告商品,干扰真实榜单数据;3. 严格风控:短时间连续请求会直接返回429限流,无重试机制极易任务中断。

点击获取key和secret
二、生产级完整封装代码

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限流报错,无需复杂重试逻辑即可稳定运行。


四、落地总结
亚马逊关键词搜索接口最大难点不在于签名鉴权,而是不规则分页、数据混杂和平台风控。本文摒弃简单请求演示,聚焦数据准确性与接口稳定性,适配选品分析、竞品监控、榜单采集等生产场景,是区别于通用教程的核心优势。

群贤毕至

访客