簡體   English   中英

一分鍾后無法在tweety中停止流式傳輸

[英]Unable to stop Streaming in tweepy after one minute

我試圖使用Stream.filter()方法將Twitter數據流式傳輸一段時間,比如5分鍾。 我將檢索到的推文存儲在JSON文件中。 問題是我無法從程序中停止filter()方法。 我需要手動停止執行。 我嘗試使用時間包根據系統時間停止數據。 我能夠停止向JSON文件編寫推文,但是流方法仍在繼續,但它無法繼續下一行代碼。 我正在使用IPython筆記本來編寫和執行代碼。 這是代碼:

auth = OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_secret)
api = tweepy.API(auth)

from tweepy import Stream
from tweepy.streaming import StreamListener

class MyListener(StreamListener):

    def __init__(self, start_time, time_limit=60):
        self.time = start_time
        self.limit = time_limit

    def on_data(self, data):
        while (time.time() - self.time) < self.limit:
            try:
                saveFile = open('abcd.json', 'a')
                saveFile.write(data)
                saveFile.write('\n')
                saveFile.close()
                return True
            except BaseException as e:
                print 'failed ondata,', str(e)
                time.sleep(5)
        return True

    def on_status(self, status):
        if (time.time() - self.time) >= self.limit:
            print 'time is over'
            return false

    def on_error(self, status):
        if (time.time() - self.time) >= self.limit:
            print 'time is over'
            return false
        else:
            print(status)
            return True

start_time = time.time()
stream_data = Stream(auth, MyListener(start_time,20))
stream_data.filter(track=['name1','name2',...list ...,'name n'])#list of the strings I want to track

這些鏈接類似,但我沒有直接回答我的問題

Tweepy:流數據X分鍾?

在持續時間參數(#lines,seconds,#Tweets等)之后停止Tweepy蒸汽

Tweepy Streaming - 停止以x金額收集推文

我使用此鏈接作為參考, http://stats.seandolinar.com/collecting-twitter-data-using-a-python-stream-listener/

  1. 要關閉流,您需要從on_data()on_status()返回False

  2. 由於tweepy.Stream()運行一段時間循環本身,你不需要在while循環on_data()

  3. 初始化MyListener ,您沒有調用父類的__init__方法,因此未正確初始化。

所以對於你想要做的事情,代碼應該是這樣的:

class MyStreamListener(tweepy.StreamListener):
    def __init__(self, time_limit=60):
        self.start_time = time.time()
        self.limit = time_limit
        self.saveFile = open('abcd.json', 'a')
        super(MyStreamListener, self).__init__()

    def on_data(self, data):
        if (time.time() - self.start_time) < self.limit:
            self.saveFile.write(data)
            self.saveFile.write('\n')
            return True
        else:
            self.saveFile.close()
            return False

myStream = tweepy.Stream(auth=api.auth, listener=MyStreamListener(time_limit=20))
myStream.filter(track=['test'])

訪問變量myListener.running但不是直接將MyListener傳遞給Stream創建變量,如下所示:

myListener = MyListener()
timeout code here... suchas time.sleep(20)
myListener.running = False 

所以,我也遇到了這個問題。 幸運的是Tweepy是開源的,因此很容易深入研究這個問題。

基本上重要的部分是這里:

def _data(self, data):
    if self.listener.on_data(data) is False:
        self.running = False

在streaming.py中的Stream類

這意味着,要關閉連接,您只需要在偵聽器的on_data()方法上返回false。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM