【问题标题】:Tweepy. Make stream run forever呸呸呸。让流永远运行
【发布时间】:2015-06-17 09:23:36
【问题描述】:

我对 tweepy python 库比较陌生。 我想确保我的流 python 脚本总是在远程服务器上运行。因此,如果有人能分享如何实现它的最佳实践,那就太好了。

现在我是这样做的:

if __name__ == '__main__':

while True:

    try:

        # create instance of the tweepy tweet stream listener
        listener = TweetStreamListener()

        # set twitter keys/tokens
        auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

        # create instance of the tweepy stream
        stream = Stream(auth, listener)

        stream.userstream()
    except Exception as e:
        print "Error. Restarting Stream.... Error: "
        print e.__doc__
        print e.message
        time.sleep(5)

我在每个方法上返回Falseon_error(), on_disconnect(), on_timeout()。 因此,通过返回False,流将停止,然后在无限循环中重新连接。

【问题讨论】:

    标签: python twitter tweepy


    【解决方案1】:

    这是我的做法,它已经运行了将近一年,在两台计算机上处​​理导致流在这里和那里停止流的错误。

    #They don't need to be in the loop.
    auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
    
    while True:
        listener = TweetStreamListener()
        stream = Stream(auth, listener, timeout=60)
    
        try:
            stream.userstream()
    
        except Exception, e:
            print "Error. Restarting Stream.... Error: "
            print e.__doc__
            print e.message
    

    为确保它永远运行,您应该重新定义on_error 方法来处理重新连接尝试之间的时间。你的 5 秒睡眠会阻碍你成功重新连接的机会,因为 Twitter 会看到你过于频繁地尝试这样做。但这是另一个问题。

    【讨论】:

      【解决方案2】:

      只要我的两分钱。

      我收到很多错误 420,这很奇怪,因为我没有向流 API 要求太多关键字。

      所以我发现流监听器类的on_data()方法必须总是返回True

      我的有时会返回False,所以 tweepy 切断了连接,并直接重新创建它,因为它在循环中,twitter 不太喜欢它......

      【讨论】:

        【解决方案3】:

        我还通过在异常上递归创建新流来解决问题。

        这是我的完整代码。只需更改mytrack 变量,输入您的密钥并使用pm2python 运行它。

        from tweepy import OAuthHandler, Stream, StreamListener
        import json
        
        
        mytrack = ['netmine', 'bitkhar', 'bitcoin']
        
        consumer_key = ""
        consumer_secret = ""
        access_token = ""
        access_token_secret = ""
        
        auth = OAuthHandler(consumer_key, consumer_secret)
        auth.set_access_token(access_token, access_token_secret)
        
        
        class StdOutListener(StreamListener):
            def __init__(self, listener, track_list, repeat_times):
                self.repeat_times = repeat_times
                self.track_list = track_list
                print('************** initialized : #', self.repeat_times)
        
            def on_data(self, data):
                print(self.repeat_times, 'tweet id : ', json.loads(data)['id'])
        
            def on_exception(self, exception):
                print('exception', exception)
                new_stream(auth, self.track_list, self.repeat_times+1)
        
            def on_error(self, status):
                print('err', status)
                if status == 420:
                    # returning False in on_data disconnects the stream
                    return False
        
        
        def new_stream(auth, track_list, repeat_times):
            listener = StdOutListener(StreamListener, track_list, repeat_times)
            stream = Stream(auth, listener).filter(track=track_list, is_async=True)
        
        
        new_stream(auth, mytrack, repeat_times=0)
        

        【讨论】:

        • 它对你有用吗?
        • 是的,它在我们使用 PM2 的 linux 服务器上运行了一个多月,没有任何问题。我自己停止了这个项目。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-13
        • 1970-01-01
        • 2018-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多