获取大量随机推文

时间:2014-01-23 17:34:33

标签: java twitter twitter4j twitter-hbc

我必须收集随机选择的大集(3000-5000)推文进行手动注释,但我有一些限制:

  1. 所有推文都必须附有图片;
  2. 不允许重复的推文;
  3. 我需要像评论这样的信息,所以在他们的发布时间后几秒钟拿它们是没有用的,
  4. 我必须用Java处理我的数据,所以我打算使用Twitter4J或Hosebird Client。
  5. 可能必须随机选择推文,而不指定任何标签(如“食物”或“运动”)。
  6. 我使用Hosebird Client管理创建一个Stream并使用推文填充BlockingQueue,但这样我就不会尊重限制3和5.

    另一方面,使用Twitter4J,使用类Query,我无法找到同时尊重1到5的解决方案。

    我觉得使用Queue会帮助我解决重复推文的问题,但是我没有成功完成所有先决条件。

    我的问题是:是否可以通过twitter4j或HBC尊重我的所有限制?如果是,有人可以给我一些代码或建议吗?

    由于

1 个答案:

答案 0 :(得分:2)

我认为twitter4j足以满足您的所有条件。你可以在twitter4J中使用流媒体。如果您没有为其提供过滤参数,它会为您提供推文流。例如;

条件-1)当您从流媒体获取推文时,您可以查看media_entity部分以检查是否至少有一个媒体对象,其类型是图像。如果是这样,您可以将其保存在任何数据库的表中。

例如:

 MediaEntity[] mediaEntities = status.getMediaEntities();

       for (MediaEntity mediaEntity : mediaEntities)
               if (mediaEntity.getType() == "photo")
               {
                  // Save status object which has the tweet and its metadata

                break;
               }

条件-2) 每条推文都有一个独特的推文ID,另一件事是流媒体应用程序不能为同一条推文打两次。但是,如果您独立运行两个不同的流媒体应用程序,则可能会通过这两个应用程序发出相同的推文。即使您运行了两个应用程序,也可以在保存之前检查数据库表中的tweet id。

条件-3)(详细说明你的意思!) 据我所知,Twitter上没有评论机制,就像Facebook那样。如果您的意思是转推,您可以通过Twitter4J的另一个应用程序同时搜索特定推文的转推。

条件-4) 我不知道Hosebird客户端系统,但我知道并且经常使用Twitter4J。我可以说Twitter4J是一个纯Java的系统。你需要使用的只是添加jar文件作为你的java应用程序的引用,它就可以使用了。这很简单。

条件-5) 我已经为流媒体应用程序提供了一组关键字来捕获包含特定关键字或主题标签的推文。在您的情况下,您可能不会给出任何参数,这意味着流应用程序将无条件地捕获所有推文。为此,您可以查看我的过滤机制作为示例:

 FilterQuery fq = new FilterQuery();
  String keywords[] = {"sport", "politics", "health"}; //etc..

  fq.track(keywords);

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

最后,我粘贴了一个完整的java方法,关于如何使用它作为示例。我希望它对你有所帮助。 :d

  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);          
      }