在持续时间参数(# lines, seconds, #Tweets等)之后停止tweet流



我正在使用Tweepy捕捉基于#WorldCup标签的流媒体tweet,如下面的代码所示。

class StdOutListener(StreamListener):
  ''' Handles data received from the stream. '''
  def on_status(self, status):
      # Prints the text of the tweet
      print('Tweet text: ' + status.text)
      # There are many options in the status object,
      # hashtags can be very easily accessed.
      for hashtag in status.entries['hashtags']:
          print(hashtag['text'])
      return true
    def on_error(self, status_code):
        print('Got an error with status code: ' + str(status_code))
        return True # To continue listening
    def on_timeout(self):
        print('Timeout...')
        return True # To continue listening
if __name__ == '__main__':
   listener = StdOutListener()
   auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
   auth.set_access_token(access_token, access_token_secret)
   stream = Stream(auth, listener)
   stream.filter(follow=[38744894], track=['#WorldCup'])

因为这是现在的热门标签,搜索不需要太长时间就可以捕获Tweepy允许您在一次交易中获得的最大tweet数量。然而,如果我要在#StackOverflow上搜索,它可能会慢得多,因此,我想要一种方法来杀死流。我可以对几个参数执行此操作,例如在100条tweet后停止,在3分钟后停止,在文本输出文件达到150行后停止,等等。我知道套接字超时时间不是用来实现这一点的。

我看了一下这个类似的问题:

Tweepy Streaming -停止收集x数量的tweet

然而,它似乎没有使用流API。它收集的数据也非常混乱,而这个文本输出是干净的。

除了键盘中断外,有没有人建议一种方法来停止Tweepy(当在这个方法中使用流时),基于一些用户输入参数?

谢谢

我解决了这个问题,所以我要成为那些回答自己问题的网络英雄之一。

这是通过为计数器和停止值使用静态Python变量实现的(例如,在抓取20条tweet后停止)。这目前是一个地理位置搜索,但您可以通过使用getTweetsByHashtag()方法轻松地将其转换为标签搜索。

#!/usr/bin/env python
from tweepy import (Stream, OAuthHandler)
from tweepy.streaming import StreamListener
class Listener(StreamListener):
    tweet_counter = 0 # Static variable
    def login(self):
        CONSUMER_KEY =
        CONSUMER_SECRET =
        ACCESS_TOKEN =
        ACCESS_TOKEN_SECRET =
        auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
        return auth
    def on_status(self, status):
        Listener.tweet_counter += 1
        print(str(Listener.tweet_counter) + '. Screen name = "%s" Tweet = "%s"'
              %(status.author.screen_name, status.text.replace('n', ' ')))
        if Listener.tweet_counter < Listener.stop_at:
            return True
        else:
            print('Max num reached = ' + str(Listener.tweet_counter))
            return False
    def getTweetsByGPS(self, stop_at_number, latitude_start, longitude_start, latitude_finish, longitude_finish):
        try:
            Listener.stop_at = stop_at_number # Create static variable
            auth = self.login()
            streaming_api = Stream(auth, Listener(), timeout=60) # Socket timeout value
            streaming_api.filter(follow=None, locations=[latitude_start, longitude_start, latitude_finish, longitude_finish])
        except KeyboardInterrupt:
            print('Got keyboard interrupt')
    def getTweetsByHashtag(self, stop_at_number, hashtag):
        try:
            Listener.stopAt = stop_at_number
            auth = self.login()
            streaming_api = Stream(auth, Listener(), timeout=60)
            # Atlanta area.
            streaming_api.filter(track=[hashtag])
        except KeyboardInterrupt:
            print('Got keyboard interrupt')
listener = Listener()
listener.getTweetsByGPS(20, -84.395198, 33.746876, -84.385585, 33.841601) # Atlanta area.

上述解决方案有助于通过hashtag获取tweet,尽管在定义getTweetByHashtag函数时存在一个小错误。你已经使用了Listener。stopAt代替Listener.stop_at=stop_at_number.

我已经稍微调整了一下代码,所以你可以很容易地在指定的秒数内终止代码。

定义了新的函数init来帮助调整秒和"on_data"它包含比on_status函数更多的信息。

享受:

from tweepy import (Stream, OAuthHandler)
from tweepy.streaming import StreamListener
class Listener(StreamListener):
    tweet_counter = 0 # Static variable
    def login(self):
        CONSUMER_KEY =
        CONSUMER_SECRET =
        ACCESS_TOKEN =
        ACCESS_TOKEN_SECRET =
        auth = OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
        auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
        return auth
    def __init__(self, time_limit=8):
        self.start_time = time.time()
        self.limit = time_limit
        super(Listener, self).__init__()
    def on_data(self, data):
        Listener.tweet_counter += 1
        if (time.time() - self.start_time) < self.limit and Listener.tweet_counter < Listener.stop_at:
            print(str(Listener.tweet_counter)+data)
            return True
        else:
            print("Either Max number reached or time limit up at:"+ str(Listener.tweet_counter)+" outputs")
            self.saveFile.close()
            return False
    #def on_status(self, status):
        #Listener.tweet_counter += 1
        #print(str(Listener.tweet_counter) + '. Screen name = "%s" Tweet = "%s"'
              #%(status.author.screen_name, status.text.replace('n', ' ')))
        #if Listener.tweet_counter < Listener.stop_at and (time.time() - self.start_time) < self.limit:
            #return True
        
        #else:
            #print('Max num reached or time elapsed= ' + str(Listener.tweet_counter))
            #return False
    def getTweetsByGPS(self, stop_at_number, latitude_start, longitude_start, latitude_finish, longitude_finish):
        try:
            Listener.stop_at = stop_at_number # Create static variable
            auth = self.login()
            streaming_api = Stream(auth, Listener(), timeout=60) # Socket timeout value
            streaming_api.filter(follow=None, locations=[latitude_start, longitude_start, latitude_finish, longitude_finish])
        except KeyboardInterrupt:
            print('Got keyboard interrupt')
    def getTweetsByHashtag(self, stop_at_number, hashtag):
        try:
            Listener.stop_at = stop_at_number
            auth = self.login()
            streaming_api = Stream(auth, Listener(), timeout=60)
            # Atlanta area.
            streaming_api.filter(track=[hashtag])
        except KeyboardInterrupt:
            print('Got keyboard interrupt')
   
    listener = Listener()
    #listener.getTweetsByGPS(20, -84.395198, 33.746876, -84.385585, 33.841601) # Atlanta area.
    listener.getTweetsByHashtag(1000,"hi")

您可以将1000的值更改为您想要的最大推文数和"hi"到你需要找到的关键字…在init函数下,将8 time_limit更改为您想要的以秒为单位的值。所以你可以根据自己的需要来使用它。

您可以设置有限的时间并将计数调整到一个非常高的值,或者设置所需的tweet计数并给出更高的时间值,因此它可以达到计数。你的选择!

最新更新