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);
}
}
}
希望对您有所帮助。
我创建了一个 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);
}
}
}
希望对您有所帮助。