使用流API避免420错误?

7
我有一个Python脚本,通过基本认证连接到Twitter的Streaming API,并利用tweetstream模块。我每分钟收集大约10条tweets。我经常遇到间歇性断开连接,所以我目前记录了它们发生的频率。我已经达到了速率限制,得到了420个HTTP错误。我知道对于搜索API,使用OAuth身份验证可以获得更高的配额。但是在流API中,我找不到任何关于基本认证和OAuth之间速率限制差异的参考。无论如何,看起来我使用的Python Tweetstream不支持流API的OAuth。我注意到Tweetstream的Ruby版本支持OAuth,但我选择使用Python进行这个项目,因为我希望通过这个学习经验来提高自己的Python编程技能。

从阅读Twitter帮助的内容中,它谈到了“退避策略”,并提到:

如果收到HTTP 420响应,则必须停止进一步的连接尝试数分钟。

我不再收到错误信息,但一直在尝试改进我的代码逻辑,以避免永久性地出现这些错误。

我目前的建议如下,现在等待200秒后再尝试重新连接。

while True:
    try:
        with tweetstream.FilterStream(uname, passwd, locations=extent) as stream:
            # do stuff
    except tweetstream.ConnectionError as e:
     print e.message + " time: " + datetime.now
     time.sleep(200)
     pass
    except tweetstream.AuthenticationError as e:
     now = datetime.datetime.now()
     print e.message  + " time: " + str(now)
     pass

我的问题是 - 这是绕过从Twitter接收420错误的好方法吗?那些更熟悉Twitter API的人,你能推荐一种方法吗?
1个回答

15

420

请求频率限制。可能原因包括:

在短时间内尝试登录的次数过多。同时以同一账户名称进行认证的应用程序副本数量过多。

对于少量推文流(每分钟10条)而言,您不应该会遇到请求频率限制错误。实际上,推特不会给您比您能够接收的更多推文,最有可能的原因是因为您在短时间内尝试登录的次数过多。因此,等待一段时间是个好主意(我在每次断开连接之间等待10秒钟,这种情况相当罕见)。确保您的推文流没有因为内部编程异常而中断,而不是Twitter异常。另外,您应该查看以下建议:

请检查是否只有一个推文流在同一IP上运行。Twitter允许每个IP和每个基本认证运行一个流。因此,请确保从特定IP运行唯一的流,并且您提供给oauth认证的凭据仅用于此流。然后,您就不会遇到420错误。

但是,如果您的推文流由于Twitter异常或内部编程异常而被中断,请等待一段时间再重新连接,以防止出现更多异常。Twitter还会在响应代码标头中返回您需要等待多长时间才能重新连接的信息(下面的代码是针对搜索的,但也应该包含在流中)。

超过搜索API限制频率的应用程序将收到HTTP 420响应代码。最佳做法是查看此错误条件并遵守“重试-后”标头,其中包含了您的应用程序再次请求数据之前应等待的秒数。


关于“Retry-After”头部 - 在流式传输时不存在,因为客户端不断接收数据块,它只接收来自原始流设置响应的头部。我维护当前的Node Twitter库,让流式传输遵守未记录的速率限制一直是一个持续的挑战。 - Dan Dascalescu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接