1

在发送多个请求时,由于请求过多,我收到了这个烦人的错误 429。更令人作呕的是,它似乎将每个请求的产品数量限制为 10 个。

因此,我有一个代码将我的 asin 数组分解为 10 组并将其链接到多个请求中,但是,当我在每个请求开始后设置 1 秒等待然后再创建一个新请求时,它不能可靠地工作并且仍然返回一个错误,将每个请求的时间增加到 2 秒可以解决此问题,但速度太慢。(因为通常每个请求需要 0.5 秒并等待剩余的 1.5 秒)。

亚马逊没有任何关于这些限制如何运作的文档,所以我们只能猜测。

有没有办法进一步改进它或使排队有所不同?

$all_posts = get_posts(array(
    'posts_per_page'   => -1
));
$serialized = serialize($all_posts);
preg_match_all ( "/]([^\]]*?)\[\/asa\]/" , $serialized , $matches);
$amazon_items=$matches[1];  //here we get an array of asins

$time_end=microtime(true);
$time_start=0;

$out=array();
for ($i=0;$i<count($amazon_items);$i+=10){
    $arr=array();
    for ($j=0;$j<10&&$i+$j<count($amazon_items);$j++){
        $arr[]=$amazon_items[$i+$j];
    }
    if ($time_end-$time_start<2) {
        echo 'sleeping '.(2-($time_end-$time_start)). 'sec; ';
        sleep (2-($time_end-$time_start));
    }
    $time_start = microtime(true);
    $list = GetItems($arr);
    $time_end = microtime(true);
    echo $time_end-$time_start.' sec, ',PHP_EOL;

    $out = array_merge($out, $list); 
}
4

2 回答 2

1

我在这里找到了产品广告 API 5.0 文档。此页面解释了您在使用允许的费率时遇到的问题。

有一个合理的每日限制,但如果每次访问您的网站都会触发多次调用,您将很快用完您的 qouta 或拨打过于频繁的电话。节流是必要的,否则第三方的一些不良代码可能会破坏 api 提供程序。

在不了解您打算使用此 api 的方式的情况下,我建议您设置一个微服务后端,该后端缓存来自 api 的数据并与原始队列有一个队列。然后您可以根据需要查询自己的api。

于 2020-01-29T14:43:09.707 回答
0

我想我得到了解决方案,似乎 paapi 5 对第一个 #1 和 #2 请求特别敏感。应该保持良好的暂停,之后请求速度可以提高到标称的每秒 1 次。

所以循环应该是这样的:第一个请求,自请求开始以来暂停总共 2 秒,第二个请求,自请求开始以来暂停总共 1 秒,第三个请求,暂停总共 1自请求开始以来的秒数,第 4 个请求,...等

我怀疑它也可以在第一个请求结束后保持 1 秒而不是总共 2 秒,然后切换到从请求开始计算的 1 秒总等待循环,但我还没有按顺序尝试核实。显然,如果第一个请求超过 1 秒并引发错误,那么我就会知道是这种情况。

编辑:它工作了一个小时然后又停止工作,为了确定,我将在每次请求后更改为 1 秒。这真的很迟钝,因为没有办法知道它在他们的服务器端记录的确切时间,它既不是请求的开始时间,也不是请求的结束时间。似乎它可以在两者之间任意波动,并且每当违反 1 秒规则(随机发生)时,它就会开始抛出无数 429 错误。好的,我将简单地等待 1 秒,并希望我的请求本身比 1 秒快一点,这应该给我一些小的优势和可靠性,而不是每次等待整整 2 秒,就像在我最初发布的示例中一样。

于 2020-02-15T10:51:42.147 回答