使用 twitter4j 获取给定位置周围的所有推文
Fetching all tweets using twitter4j around a given location
我想使用 Twitter4j 从 Twitter API 中获取所有推文。这是我使用 geoCode
获取推文的代码,但我无法获取所有推文,它只显示了大约 100 条推文。有什么办法可以把它们全部取下来。我认为我可以接收的推文数量有速率限制,但我不确定。
有人能帮忙吗?
import java.util.List;
import twitter4j.*;
import twitter4j.auth.AccessToken;
public class Main {
public static void main(String[] args) {
final Twitter twitter = new TwitterFactory().getInstance();
final AccessToken accessToken = new AccessToken("XXX", "YYY");
twitter.setOAuthConsumer("AAA", "BBB");
twitter.setOAuthAccessToken(accessToken);
try {
Query query = new Query();
query.geoCode(new GeoLocation(37.781157,-122.398720),1000.0,"mi");
QueryResult result;
System.out.println("Searching...");
int Count=0;
do {
result = twitter.search(query);
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
if(tweet.getGeoLocation()!=null)
System.out.println(tweet.getGeoLocation());
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while ((query = result.nextQuery()) != null);
System.out.println(Count);
System.exit(0);
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
System.exit(-1);
}
}
}
您在解决问题的过程中遇到了一些问题。
你的代码没问题
你要求 Twitter 在过去几天在给定位置获取一些推文,这就是 Twitter 给你的(目前大约 400 条推文),所以......为什么推文这么少?为什么其他网站有 so many tweets?主要问题是搜索api.
搜索 Api
您需要知道 search API is focused on relevance and not completeness,因此您只会收到最近几天(大约一周)的一些推文,正如文档所述:
If you want to match for completeness you should consider using a Streaming API instead
这引导我们进入下一步...
流媒体 Api
在流式传输 api 中,您无法搜索推文,您可以实时获取它们。如果你想要一个月的本地化推文,你需要在流媒体上设置界限 api 并让它 运行 一个月。在 Twitter4j 上,您需要设置本地化过滤器,然后 运行 流式传输,如下所示:
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true).setOAuthConsumerKey("---")
.setOAuthConsumerSecret("---")
.setOAuthAccessToken("---")
.setOAuthAccessTokenSecret("---");
TwitterStream twitterStream = new TwitterStreamFactory(cb.build())
.getInstance();
StatusListener listener = new StatusListener() {
@Override
public void onStatus(Status status) {
//here you do whatever you want with the tweet
System.out.println(status.getText());
}
@Override
public void onException(Exception ex) {
ex.printStackTrace();
}
@Override
public void onDeletionNotice(StatusDeletionNotice arg0) {
// TODO Auto-generated method stub
}
@Override
public void onScrubGeo(long arg0, long arg1) {
}
@Override
public void onStallWarning(StallWarning arg0) {
// TODO Auto-generated method stub
System.out.println(arg0);
}
@Override
public void onTrackLimitationNotice(int arg0) {
// TODO Auto-generated method stub
System.out.println(arg0);
}
};
twitterStream.addListener(listener);
FilterQuery filterQuery = new FilterQuery();
double[][] locations = {{-74,40}, {-73,41}}; //those are the boundary from New York City
filterQuery.locations(locations);
twitterStream.filter(filterQuery);
twitterStream.filter(filterQuery);
如果您收到的推文太多,流媒体 Api 会剪切它们,因此请尽量不要将边界框设置得过大。
但是...如果我想要过去的推文并且我现在想要它们?
这是 Twitter 获得额外收入的地方,您可以通过 Gnip
获得它们
我想使用 Twitter4j 从 Twitter API 中获取所有推文。这是我使用 geoCode
获取推文的代码,但我无法获取所有推文,它只显示了大约 100 条推文。有什么办法可以把它们全部取下来。我认为我可以接收的推文数量有速率限制,但我不确定。
有人能帮忙吗?
import java.util.List;
import twitter4j.*;
import twitter4j.auth.AccessToken;
public class Main {
public static void main(String[] args) {
final Twitter twitter = new TwitterFactory().getInstance();
final AccessToken accessToken = new AccessToken("XXX", "YYY");
twitter.setOAuthConsumer("AAA", "BBB");
twitter.setOAuthAccessToken(accessToken);
try {
Query query = new Query();
query.geoCode(new GeoLocation(37.781157,-122.398720),1000.0,"mi");
QueryResult result;
System.out.println("Searching...");
int Count=0;
do {
result = twitter.search(query);
List<Status> tweets = result.getTweets();
for (Status tweet : tweets) {
if(tweet.getGeoLocation()!=null)
System.out.println(tweet.getGeoLocation());
}
try {
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
while ((query = result.nextQuery()) != null);
System.out.println(Count);
System.exit(0);
} catch (TwitterException te) {
te.printStackTrace();
System.out.println("Failed to search tweets: " + te.getMessage());
System.exit(-1);
}
}
}
您在解决问题的过程中遇到了一些问题。
你的代码没问题
你要求 Twitter 在过去几天在给定位置获取一些推文,这就是 Twitter 给你的(目前大约 400 条推文),所以......为什么推文这么少?为什么其他网站有 so many tweets?主要问题是搜索api.
搜索 Api
您需要知道 search API is focused on relevance and not completeness,因此您只会收到最近几天(大约一周)的一些推文,正如文档所述:
If you want to match for completeness you should consider using a Streaming API instead
这引导我们进入下一步...
流媒体 Api
在流式传输 api 中,您无法搜索推文,您可以实时获取它们。如果你想要一个月的本地化推文,你需要在流媒体上设置界限 api 并让它 运行 一个月。在 Twitter4j 上,您需要设置本地化过滤器,然后 运行 流式传输,如下所示:
ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true).setOAuthConsumerKey("---")
.setOAuthConsumerSecret("---")
.setOAuthAccessToken("---")
.setOAuthAccessTokenSecret("---");
TwitterStream twitterStream = new TwitterStreamFactory(cb.build())
.getInstance();
StatusListener listener = new StatusListener() {
@Override
public void onStatus(Status status) {
//here you do whatever you want with the tweet
System.out.println(status.getText());
}
@Override
public void onException(Exception ex) {
ex.printStackTrace();
}
@Override
public void onDeletionNotice(StatusDeletionNotice arg0) {
// TODO Auto-generated method stub
}
@Override
public void onScrubGeo(long arg0, long arg1) {
}
@Override
public void onStallWarning(StallWarning arg0) {
// TODO Auto-generated method stub
System.out.println(arg0);
}
@Override
public void onTrackLimitationNotice(int arg0) {
// TODO Auto-generated method stub
System.out.println(arg0);
}
};
twitterStream.addListener(listener);
FilterQuery filterQuery = new FilterQuery();
double[][] locations = {{-74,40}, {-73,41}}; //those are the boundary from New York City
filterQuery.locations(locations);
twitterStream.filter(filterQuery);
twitterStream.filter(filterQuery);
如果您收到的推文太多,流媒体 Api 会剪切它们,因此请尽量不要将边界框设置得过大。
但是...如果我想要过去的推文并且我现在想要它们?
这是 Twitter 获得额外收入的地方,您可以通过 Gnip