2012-11-18 135 views
3

我有一个python脚本,它使用基本身份验证和使用tweetstream模块挂钩到Twitter Streaming API避免420流媒体API?

我每分钟收集约10条推文。
我得到间歇性断开连接,所以目前正在记录它们发生的频率。

我一直打我的速度限制,并获得420 HTTP错误。

我知道,对于搜索API,使用OAuth身份验证可以获得更高的配额。对于流式传输,我无法找到任何有关基本和OAuth之间速率限制差异的参考。无论如何,它似乎是我使用的蟒蛇Tweetstream,不支持流媒体API。

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

从阅读Twitter help,它谈论的“后退策略”,并提到:

它是必不可少的,如果接收到一个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的人,你能推荐一种方法吗?

回答

9

速率的限制。可能的原因有:

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

你不应该得到一个限速错误鸣叫流的这样一个不太率(每分钟10个鸣叫),居然限速,不能用于飘带,因为比你的Twitter不给你更多的鸣叫有,很可能你得到这个错误,因为在短时间内登录尝试过多。因此,等待一段时间是一个好主意(我会在每个断开连接之间等待10秒钟,这很少发生)。确保您的流光拖曳不会因为内部编程异常而不是Twitter异常而中断。您还应该查看下面的建议。

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

但由于某些原因,如果流式传输器通过Twitter异常或内部编程异常中断,您应该等待一段时间再重新连接以防止出现更多异常。 Twitter还会返回需要等待多少时间,然后再次重新连接以响应代码标题(下面的代码用于搜索,但它应该也包含在流中)。

超过搜索API 的速率限制的应用程序将收到HTTP 420响应代码。对于此错误情况,最好练习 ,并遵循返回的 Retry-After标题。 Retry-After标题的值是您的 应用程序在再次从搜索API 请求日期之前应该等待的秒数。