【问题标题】:Extracting tweets of a specific hashtag using twitter4j使用 twitter4j 提取特定主题标签的推文
【发布时间】:2014-06-14 00:10:04
【问题描述】:

我可以使用 search 方法提取特定主题标签的推文,如下所示

        twitter4j.Twitter twitter =  TwitterFactory.getSingleton();
        Query query = new Query("ipl7");
        QueryResult result = twitter.search(query);
        for (Status status : result.getTweets()) {
            System.out.println("@" + status.getUser().getScreenName() + " : " + status.getText() + " : " + status.getGeoLocation());
        }

但是,我使用上述方法获得的推文数量非常有限。我应该改变什么来获取特定主题标签的所有推文?

【问题讨论】:

标签: java twitter twitter4j tweets


【解决方案1】:

您可以使用流式 API 通过一组给定的关键字获取最近的推文。在您的情况下,您只有一个关键字是标签,对吗?我发布了一个简短的示例代码,通过 Streaming API 的关键字搜索推文。您可以将 Streaming 和 Search API 用于不同的目的。大多数情况下,您可以在有限的时间内将 Search API 用于主机推文。它允许您给出日期间隔。但是,您可以使用 Streamin API 将最近发布的推文捕获为包含您提供的关键字的推文流。

以下示例代码:

private static void GetTweetStreamForKeywords()
        {
        TwitterStream twitterStream = new TwitterStreamFactory(config).getInstance();

        StatusListener statusListener = new StatusListener() {

         @Override
         public void onStatus(Status status) {
           // The main section that you get the tweet. You can access it by status object.
           // You can save it in a database table.
         }


                @Override
                public void onDeletionNotice(StatusDeletionNotice sdn) {
                    throw new UnsupportedOperationException("Not supported yet."); 
                }

                @Override
                public void onTrackLimitationNotice(int i) {
                    throw new UnsupportedOperationException("Not supported yet."); 
                }

                @Override
                public void onScrubGeo(long l, long l1) {
                    throw new UnsupportedOperationException("Not supported yet."); 
                }

                @Override
                public void onStallWarning(StallWarning sw) {
                    throw new UnsupportedOperationException("Not supported yet.");
                }

                @Override
                public void onException(Exception ex) {
                    logWriter.WriteErrorLog(ex, "onException()");
                }
            };

            FilterQuery fq = new FilterQuery();        

            String keywords[] = {"sport", "politics", "health"};

            fq.track(keywords);        

            twitterStream.addListener(statusListener);
            twitterStream.filter(fq);          
      }  

【讨论】:

    【解决方案2】:
    package twiter;
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.List;
    import twitter4j.GeoLocation;
    import twitter4j.Query;
    import twitter4j.QueryResult;
    import twitter4j.Status;
    import twitter4j.Twitter;
    import twitter4j.TwitterException;
    import twitter4j.TwitterFactory;
    import twitter4j.conf.ConfigurationBuilder;
    
    public class tweets
    {
      public static void main(String[] args) throws Exception 
      {
    
        ConfigurationBuilder cb = new ConfigurationBuilder();
        cb.setDebugEnabled(true)
          .setOAuthConsumerKey("")
          .setOAuthConsumerSecret("")
          .setOAuthAccessToken("")
          .setOAuthAccessTokenSecret("");
        Twitter twitter = new TwitterFactory(cb.build()).getInstance();
        Query query = new Query("#world");
        int numberOfTweets = 5000;
        long lastID = Long.MAX_VALUE;
        ArrayList<Status> tweets = new ArrayList<Status>();
        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());
            System.out.println("Gathered " + tweets.size() + " tweets"+"\n");
            for (Status t: tweets) 
              if(t.getId() < lastID) 
                  lastID = t.getId();
    
          }
    
          catch (TwitterException te) {
            System.out.println("Couldn't connect: " + te);
          }; 
          query.setMaxId(lastID-1);
        }
    
        for (int i = 0; i < tweets.size(); i++) {
          Status t = (Status) tweets.get(i);
    
         // GeoLocation loc = t.getGeoLocation();
    
          String user = t.getUser().getScreenName();
          String msg = t.getText();
          //String time = "";
          //if (loc!=null) {
            //Double lat = t.getGeoLocation().getLatitude();
            //Double lon = t.getGeoLocation().getLongitude();*/
           System.out. println(i + " USER: " + user + " wrote: " + msg + "\n");
          } 
          //else 
            //System.out.println(i + " USER: " + user + " wrote: " + msg+"\n");
        }
      }
    

    【讨论】:

      【解决方案3】:

      使用count(int resultCount) 方法:

          Query query = new Query("ipl7");
          query.count(100); //100 is the max allowed
          QueryResult result = twitter.search(query);
      

      【讨论】:

      • 如果我使用 maxId(long maxId) 或 sinceId(long sinceId) 方法,我可以获得更多推文吗?
      • 我不需要传递#ipl7 作为查询吗?
      猜你喜欢
      • 2014-06-26
      • 2013-06-02
      • 1970-01-01
      • 2013-09-24
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      相关资源
      最近更新 更多