7

我有一个 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

我的问题是 - 这是避免从 Twitter 接收 420 错误的好方法吗?对 Twitter API 比较熟悉的朋友,能推荐一个方法吗?

4

1 回答 1

15

420

费率有限。可能的原因有:

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

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

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

但是由于某种原因,如果您的流媒体因 Twitter 异常或内部编程异常而中断,您应该等待一段时间再重新连接,以防止出现更多异常。Twitter 还会在响应代码标头中返回您在重新连接之前需要等待多长时间(下面的用于搜索,但也应包含在流中)。

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

于 2013-01-04T08:26:18.167 回答