使用Streaming API避免使用420s?

Sim*_*mon 6 python twitter tweetstream twitter-streaming-api

我有一个python脚本,使用基本身份验证和使用tweetstream模块挂钩到Twitter Streaming API.

我每分钟收集10条推文.
我正在断断续续地断开连接,因此目前正在记录它们发生的频率.

我一直在达到我的速率限制并获得420个HTTP错误.

我知道,对于搜索API,您可以使用OAuth身份验证获得更高的配额.对于流媒体,我找不到任何关于基本和OAuth之间的速率限制差异的参考.无论如何,看起来我正在使用的python Tweetstream不支持使用流API.

我注意到Tweetstream的Ruby版本支持OAuth,但我正在做这个项目作为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
Run Code Online (Sandbox Code Playgroud)

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

cub*_*buk 13

420

Rate Limited.可能的原因是:

在很短的时间内登录尝试次数过多.运行使用相同帐户名进行身份验证的同一应用程序的太多副本.

对于如此低的推文流速率(每分钟10条推文),你不应该得到速率限制错误,实际上速率限制不适用于流媒体,因为推特不会给你提供比你更多的推文,很可能你是由于在短时间内登录尝试次数过多而导致此错误.所以等待一段时间是个好主意(我在每次断开连接之间等待10秒钟,这很少发生).确保您的流媒体不会因为内部编程异常而不是Twitter异常而中断.您还应该看看下面的建议.

您应该只检查一个流正在通过相同的IP运行.Twitter允许一个流媒体按ip和每个基本身份验证运行.因此,请确保您正在运行来自特定IP的唯一流,并且您为oauth身份验证提供的凭据仅用于此流.然后你不会得到420错误.

但由于某种原因,如果您的流媒体通过Twitter异常或内部编程异常中断,您应该等待一段时间再重新连接以防止获得更多异常.Twitter还会返回在响应代码标题中再次重新连接之前需要等待多长时间(下面的一个用于搜索,但它也应包含在流式传输中).

超出Search API速率限制的应用程序将收到HTTP 420响应代码.最佳做法是观察此错误情况并遵循返回的Retry-After标头.Retry-After标头的值是应用程序在再次从Search API请求日期之前应等待的秒数.