我已经创建了一个Twitter爬虫,该爬虫可获取属于某些主题标签的推文及其关联数据。运行超过一天后,它开始提供我已经存储在数据库中的旧数据。现在我有216874条带有#jesuischarlie主题标签的推文。确定我使用过,QueryResult result=twitter.search(new Query("#jesuischarlie"));
并且确定然后我会执行do-while循环,直到退出result.nextQuery()==null
我的问题是,为什么函数nextQuery()
不只是给我一个空值,这意味着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);
}
}
}
希望能有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句