【问题标题】:twitter4j - Count the number of tweets within 24 hours, return an integertwitter4j - 统计 24 小时内的推文数量,返回一个整数
【发布时间】:2014-12-13 07:53:49
【问题描述】:

我试图在 24 小时内检索某个关键字的推文数量的单个整数。 所以说关键字是“交通”我想统计过去 24 条中带有“交通”这个词的推文的数量,并将其存储为一个数字,用于生成其他内容。

现在我可以使用 query.setCount 提供一个特定数字并检索过去 24 小时内的任意数字(1024)条推文,但我无法判断这是否是 24 小时内的所有推文,我真的want 是一个数字,我不需要推文的实际文本或其他信息。此外,随着新推文的出现,请更新该数字。

我该怎么做呢?

到目前为止,这是我的 getNewTweets 方法:

    void getNewTweets(){
    SimpleDateFormat sdf = new SimpleDateFormat("y-M-d");

  Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR_OF_DAY, -24);

  String yesterday = sdf.format(calendar.getTime());

Query query = new Query("traffic"); 
  query.setSince(yesterday);
  int numberOfTweets = 1024;
  long lastID = Long.MAX_VALUE;
  while (tweets.size () < numberOfTweets) {
    if (numberOfTweets - tweets.size() > 100)
      query.setCount(100);
    else 
      query.setCount(numberOfTweets - tweets.size());
    try {
      QueryResult result = twitter.search(query);
      tweets.addAll(result.getTweets());
      println("Gathered " + tweets.size() + " tweets");
      for (Status t: tweets) 
        if(t.getId() < lastID) lastID = t.getId();

    }

    catch (TwitterException te) {
      println("Couldn't connect: " + te);
    }; 
    query.setMaxId(lastID-1);
  }

}

【问题讨论】:

    标签: java twitter processing twitter4j twitter-search


    【解决方案1】:

    您无法确定特定过滤器/搜索查询的推文的确切数量, 这两个 API 都有速率限制。 你必须使用 firehose 来获取所有的推文数据,并且是付费的。

    以下是 twitter dev 的摘录-

    Before getting involved, it’s important to know that the Search API is focused on relevance and notcompleteness. This means that some Tweets and users may be missing from search results. If you want tomatch for completeness you should consider using a Streaming API instead

    请阅读以下链接以进一步了解 Streaming API 的速率限制 - https://twittercommunity.com/t/how-much-data-returned-when-using-streaming-api/8407

    【讨论】:

      【解决方案2】:

      也就是说(@mbaxi 回答)我认为对于一个不太流行的词,Stream API 将适合该任务。我使用非常流行的“爱”运行此代码 5 分钟,到目前为止没有收到任何警告,还收到了大约 25000 条爱的推文...... 我只是为了示例而制作了这个非常简单且不精确的计时器......虽然你说你不想要文本,但它正在被打印到控制台......

      这里是一个例子

      import twitter4j.util.*;
      import twitter4j.*;
      import twitter4j.management.*;
      import twitter4j.api.*;
      import twitter4j.conf.*;
      import twitter4j.json.*;
      import twitter4j.auth.*;
      int startTime;
      int tweetNumber;
      PFont f ;
      String theWord = "love";
      
      
      TwitterStream twitterStream;
      
      void setup() {     
        size(800, 100);    
        background(0); 
        f  = createFont("SourceCodePro-Regular", 25);
        textFont(f);
        openTwitterStream();
        startTime = minute();
      }  
      
      
      void draw() {     
        background(0);
        int passedTime = minute() - startTime;
        text("Received " + nf(tweetNumber, 5) + " tweets with the word: " + theWord, 30, height - 50); 
        text("in last " +  nf(passedTime, 3) + " minutes", 30, height - 25);
      }  
      
      
      
      // Stream it
      void openTwitterStream() {  
      
        ConfigurationBuilder cb = new ConfigurationBuilder();  
        cb.setOAuthConsumerKey("-----FILL-----");
        cb.setOAuthConsumerSecret("-----FILL-----");
        cb.setOAuthAccessToken("-----FILL-----");
        cb.setOAuthAccessTokenSecret("-----FILL-----"); 
      
        TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
      
        FilterQuery filtered = new FilterQuery();
      
        // if you enter keywords here it will filter, otherwise it will sample
        String keywords[] = {
          theWord
        };
      
        filtered.track(keywords);
      
        twitterStream.addListener(listener);
      
        if (keywords.length==0) {
          // sample() method internally creates a thread which manipulates TwitterStream 
          twitterStream.sample(); // and calls these adequate listener methods continuously.
        } else { 
          twitterStream.filter(filtered);
        }
        println("connected");
      } 
      
      
      // Implementing StatusListener interface
      StatusListener listener = new StatusListener() {
      
        //@Override
        public void onStatus(Status status) {
          tweetNumber++;
          System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText());
        }
      
        //@Override
        public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
          System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
        }
      
        //@Override
        public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
          System.out.println("Got track limitation notice:" + numberOfLimitedStatuses);
        }
      
        //@Override
        public void onScrubGeo(long userId, long upToStatusId) {
          System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
        }
      
        //@Override
        public void onStallWarning(StallWarning warning) {
          System.out.println("Got stall warning:" + warning);
        }
      
        //@Override
        public void onException(Exception ex) {
          ex.printStackTrace();
        }
      };
      

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-11
        相关资源
        最近更新 更多