发送多个请求时,我收到太多请求的烦人错误429。更令人讨厌的是,它似乎将每个请求的产品数量限制为10个。
因此,我有一个代码将asin数组分解为10s组并将其链接到多个请求中,但是,当我在每个请求开始后设置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);
}
我想我找到了解决方案,看来paapi 5对第一个#1和#2请求特别敏感。应该保持良好的暂停,然后可以将请求速度提高到标称的每秒1个速度。
因此,循环应如下所示:第一个请求,自请求开始以来暂停,总共需要2秒;第二个请求,自请求开始以来暂停,总共需要1秒,第三次请求,暂停,总计需要1秒从请求开始到第4个请求等的秒数
我怀疑在从请求开始算起切换到总等待周期为1秒之前,在第一个请求结束后保持整整1秒(而不是总共2秒)也可以工作,但是我尚未按顺序尝试核实。显然,如果第一个请求超过1秒并且引发错误,那么我会知道是这种情况。
编辑:它工作了一个小时,然后又停止工作了,为了确保每次请求后我都将更改为1秒。这确实很困难,因为无法知道在服务器端确切记录了什么时间,它既不是请求的开始时间,也不是请求的结束时间。似乎它可以在两者之间任意波动,每当违反1秒规则(随机发生)时,它就会引发429次错误。好的,我只需要等待1秒钟,希望我的请求本身比1秒稍快一点,这与每次等待2秒钟相比,应该会给我带来一些好处和可靠性,就像我最初发布的示例中那样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句