Java twitter4j result.nextquery()再次给出第一页的结果
我已经创建了一个twitter爬虫程序,它可以获取tweet及其属于某些hashtag的相关数据。在运行了一天多之后,它开始提供已经存储在数据库中的旧数据。现在我有216874条推特,上面有“jesuischarlie”标签。我当然用过Java twitter4j result.nextquery()再次给出第一页的结果,java,twitter,twitter4j,Java,Twitter,Twitter4j,我已经创建了一个twitter爬虫程序,它可以获取tweet及其属于某些hashtag的相关数据。在运行了一天多之后,它开始提供已经存储在数据库中的旧数据。现在我有216874条推特,上面有“jesuischarlie”标签。我当然用过 QueryResult result=twitter.search(新查询(“#jesuischarlie”) 然后,确保在result.nextQuery()==null 我的问题是为什么函数nextQuery()不只是给我一个空值,这意味着Twitter不会
QueryResult result=twitter.search(新查询(“#jesuischarlie”)代码>
然后,确保在result.nextQuery()==null
我的问题是为什么函数nextQuery()
不只是给我一个空值,这意味着Twitter不会为这个搜索提供更多的tweet?为什么要从头再来
这是我正在使用的全部函数
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);
}
试试看{
Query Query=新查询(“#jesuischarlie”);
查询设置自(“2015-01-08”);
query.setCount(100);
查询结果;
做{
结果=twitter.search(查询);
List tweets=result.getTweets();
用于(状态推文:推文){
Twitter_loop_dao=新Twitter_loop_dao();
试一试{
插入tweet(tweet);
}捕获(SQLE异常){
e、 printStackTrace();
}
}
线程。睡眠(15*1000);
}while((query=result.nextQuery())!=null);
系统出口(0);
}捕获(twitter异常){
te.printStackTrace();
System.out.println(“未能搜索tweets:+te.getMessage());
系统退出(-1);
}
看起来您在while循环中使用了错误的退出条件。我的代码正在(为我)工作
do{
试一试{
结果=twitter.search(查询);
List tweets=result.getTweets();
List myObjects=tweets.parallelStream()
.map(tweet->mytweet函数(tweet))
.collect(Collectors.toList());
query=result.nextQuery();
检查比率限制(结果)
}捕获(twitter异常){
//你想干什么就干什么
}
}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);
}
}
}
private void checkrate limit(查询结果){
如果(result.getRateLimitStatus().getLeving())在(result.hasNext());
作为循环的退出条件时尝试了(result.getRateLimitStatus().getLeving()
您可以通过线程.sleep(result.getRateLimitStatus().getSecondsUntilReset()*1000)获得窗口内剩余请求的数量;
您可以等到您的窗口被重置。我非常感谢您的解释。那是我的错误,而不是Twitter的限制政策。@mmx73
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);
}
}
}