python - 使用 Streaming API 避免 420?

标签 python twitter tweetstream twitter-streaming-api

我有一个 Hook 到 Twitter Streaming API 的 python 脚本使用基本身份验证并利用 tweetstream模块。

我每分钟收集大约 10 条推文。
我遇到了断断续续的情况,因此目前正在记录它们发生的频率。

我一直在达到我的速率限制并收到 420 个 HTTP 错误。

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

我注意到 Ruby version of Tweetstream支持 OAuth,但我正在做这个项目作为 python 的学习经验。

来自阅读Twitter help ,它谈到“退避策略”并提到:

it is essential to stop further connection attempts for a few minutes if a HTTP 420 response is received.

我不再收到错误,但一直在尝试在我的代码中制定更好的逻辑以避免永久出现这些错误。

我当前的建议如下,现在等待 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 的人,你能推荐一种方法吗?

最佳答案

420

Rate Limited. Possible reasons are:

Too many login attempts in a short period of time. Running too many copies of the same application authenticating with the same account name.

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

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

但出于某种原因,如果您的主播因 Twitter 异常或内部编程异常而中断,您应该等待一段时间再重新连接,以防止出现更多异常。 Twitter 还会在响应代码 header 中返回您需要等待多少时间才能再次重新连接(下面的用于搜索,但也应包含在流式传输中)。

An application that exceeds the rate limitations of the Search API will receive an HTTP 420 response code. It is best practice to watch for this error condition and honor the Retry-After header which is returned. The Retry-After header's value is the number of seconds your application should wait before requesting date from the Search API again.

关于python - 使用 Streaming API 避免 420?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13438965/

相关文章:

python - 将键值对读入 Pandas

json - 将包Elastic(嵌套列表?)的R输出转换为data.frame或JSON

java - 按位置过滤时使用 hbc 的 fatal error 代码 406

ruby-on-rails - ruby - 未定义的方法 `extract_options!' : Array

python - 在网络上的另一台计算机上启动进程

python - OSX 上的 Docker 应用程序连接被拒绝

Python Import No Module Named 错误

java - Twitter4j,未知主机异常

ruby-on-rails - Heroku 上的 Rails 如何监控工作进程

python - 过滤从状态/过滤器(流式 API)收到的推文