Amazon API限制显然是每秒1 req或每小时3600。所以我这样实现了它:
while True:
#sql stuff
time.sleep(1)
result = api.item_lookup(row[0], ResponseGroup='Images,ItemAttributes,Offers,OfferSummary', IdType='EAN', SearchIndex='All')
#sql stuff
错误:
amazonproduct.errors.TooManyRequests:RequestThrottled:AWS Access密钥ID:ACCESS_KEY_REDACTED。您提交的请求太快了。请以较慢的速度重试您的请求。
任何想法为什么?
答案 0 :(得分:1)
此代码看起来正确,看起来1个请求/秒限制仍然是实际的: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/TroubleshootingApplications.html#efficiency-guidelines
您希望确保没有其他进程使用相同的关联帐户。根据您运行代码的位置和方式,可能有旧版本的VM,或者您的应用程序的另一个实例正在运行,或者云上有一个版本,笔记本电脑上有另一个版本,或者如果您使用的是线程Web服务器,可能有多个线程都运行相同的代码。
如果仍然达到查询限制,则只需要重试,可能使用类似TCP的“加法增加/乘法减少”退避。首先设置extra_delay = 0
。如果请求失败,请设置extra_delay += 1
和sleep(1 + extra_delay)
,然后重试。当它最终成功时,设置extra_delay = extra_delay * 0.9
。
答案 1 :(得分:0)
这篇文章在说&#34时是正确的;它以不确定的方式变化" (https://stackoverflow.com/a/1133888/5044893)。根据许多因素,处理器测量的时间可能非常不可靠。
亚马逊的API具有与您的程序不同的时钟,这更加复杂。他们当然不是同步的,他们的" 1秒"之间可能会有一些重叠。时间测量和你的程序。亚马逊可能会尝试平衡这种不一致性,并且他们可能也会允许一点点错误,可能是+/- 5%。即便如此,您的时钟与他们的时钟之间的差异可能会触发ACCESS_KEY_REDACTED信号。
以下是一些需要考虑的问题。
你真的需要每一秒点击亚马逊API吗?你的程序会以5秒的间隔工作吗?即使是2秒间隔,触发锁定的可能性也会降低200%。此外,亚马逊可能会向您收取每次服务电话的费用,因此将它们隔开可以为您节省资金。
这实际上是一个优化问题"现在。如果您使用常量变量来控制API调用率(例如,SLEEP = 2
),那么您可以轻松调整该速率。摆弄它,增加和减少它,看看你的程序如何运作。
有时,每秒点击一次API意味着您为新数据轮询。众所周知,轮询是浪费,这就是为什么Amazon API具有速率限制的原因。
相反,您可以切换到基于队列的方法吗? Amazon SQS可以为您的程序启动事件。如果您使用Amazon Lambda托管它们,这将特别容易。