twitter4j result.nextquery() 再次给出第一页的结果

twitter4j result.nextquery() is giving results from the first page again

我创建了一个 Twitter 爬虫,它获取推文及其属于特定主题标签的相关数据。 运行 一天多后,它开始提供我已经存储在数据库中的旧数据。现在我有 216,874 条带有#jesuischarlie 标签的推文。当然我用过 QueryResult result=twitter.search(new Query("#jesuischarlie"));
然后确定我有一个 do-while 循环永远不会退出,直到 result.nextQuery()==null

我的问题是为什么 nextQuery() 函数不只是给我一个 null,这意味着 Twitter 不会为该搜索提供更多推文?怎么又要从头再来了!?

这是我正在使用的完整功能

try {
             Query query = new Query("#jesuischarlie");
             query.setSince("2015-01-08");
             query.setCount(100);
             QueryResult result;
             do {
                 result = twitter.search(query);
                 List<Status> tweets = result.getTweets();
                 for (Status tweet : tweets) {
                     Twitter_loop_dao dao = new Twitter_loop_dao();
                    try {

                        dao.insertTwet(tweet);
                    } catch (SQLException e) {

                        e.printStackTrace();
                    }
                 }
                 Thread.sleep(15 * 1000);
             } while ((query = result.nextQuery()) != null);
             System.exit(0);
         } catch (TwitterException te) {
             te.printStackTrace();
             System.out.println("Failed to search tweets: " + te.getMessage());
             System.exit(-1);
         }

您似乎在 while 循环中使用了错误的退出条件。我的代码正在工作(对我来说)。

do {
        try {
            result = twitter.search(query);
            List<Status> tweets = result.getTweets();
            List<MyObject> myObjects = tweets.parallelStream()
                    .map(tweet -> myTweetFunction(tweet))
                    .collect(Collectors.toList());

            query = result.nextQuery();            
            checkRateLimit(result) 

        } catch (TwitterException e){
            // do what ever you want
        }
} while (result == null || result.hasNext());

checkRateLimit 函数:

private void checkRateLimit(QueryResult result) {

    if (result.getRateLimitStatus().getRemaining() <= 0){
        try {
          Thread.sleep(result.getRateLimitStatus().getSecondsUntilReset() * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }
}

希望对您有所帮助。