Tweepy:现在可以通过 Twitter 搜索获取旧推文 api?
Tweepy: get old tweets now possible with Twitter search api?
根据http://www.theverge.com/2014/11/18/7242477/twitter-search-now-lets-you-find-any-tweet-ever-sent
Twitter 搜索现在可以让您找到曾经发送过的任何推文。
但是当我尝试使用 tweepy 获取 2014 年至 2015 年的推文时,它只获取最近的推文:
query = 'Nivea'
max_tweets = 1000
searched_tweets = [json.loads(status.json) for status in tweepy.Cursor(api.search,
q=query,
count=100,
#since_id="24012619984051000",
since="2014-02-01",
until="2015-02-01",
result_type="mixed",
lang="en"
).items(max_tweets)]
我试过 since="2014-02-01",since_id 但没关系。
很遗憾,您无法从 Twitter 访问过去的数据。不是您使用的库的问题:Tweepy、Twitter4J 等等,只是 Twitter 不会提供任何早于或少于 2 周的数据。
要获取历史数据,您需要直接通过 Twitter 或 GNIP 等第三方经销商访问 firehose。
我使用自己的一段代码,它使用 HttpURLConnection
和 Twitter 搜索 url。然后,我使用正则表达式提取出最后 20 条匹配的推文……幸运的是,当我删除推文时,我可以简单地再次搜索,直到找不到更多推文。我包含了代码,尽管它在 Java 中,但同样适用于任何语言。首先,我使用 class 实际搜索推文并记录其详细信息:
public class ReadSearch{
private String startURL = "https://twitter.com/search?f=realtime&q=from%3A";
private String middleURL = "%20%40";
private String endURL = "&src=typd";
public ArrayList<Tweet> getTweets(String user, String troll) {
ArrayList<Tweet> tweets = new ArrayList<Tweet>();
String expr = "small.class=\"time\".*?href=\"/"
+ "([^/]+)"
+ ".*?status/"
+ "([^\"]+)"
+ ".*?title=\""
+ "([^\"]+)";
Pattern patt = Pattern.compile(expr, Pattern.DOTALL | Pattern.UNIX_LINES);
try {
Matcher m = patt.matcher(getData(startURL+user+middleURL+troll+endURL));
while (m.find()) {
if(user.equals(m.group(1).trim())){
Tweet tw = new Tweet();
tw.setUser(m.group(1).trim());
tw.setTweetid(Long.parseLong(m.group(2).trim()));
tw.setDate(m.group(3).trim());
tweets.add(tw);
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception " + e);
}
return tweets;
}
private StringBuilder getData(String dataurl) throws MalformedURLException, IOException{
URL url = new URL(dataurl);
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
httpcon.addRequestProperty("User-Agent", "Mozilla/4.76");
StringBuilder sb = new StringBuilder(16384);
BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(), "ISO-8859-1"));
String line;
while ((line = br.readLine()) != null){
sb.append(line);
sb.append('\n');
}
httpcon.disconnect();
br.close();
return sb;
}
public static void main(String [] args){
//testing
ReadSearch rs = new ReadSearch();
ArrayList<Tweet> tweets = rs.getTweets("Tony_Kennah", "PickLuckier");
for(Tweet t : tweets){
System.out.println("TWEET: " + t.toString());
}
}
}
然后我们需要 Tweet class 本身,这样我们就可以将 Tweet 分组并使用它们进行操作,它只是一个像这样的 bean:
public class Tweet{
private String user;
private long tweetid;
private String date;
public String getUser(){
return user;
}
public void setUser(String user){
this.user = user;
}
public long getTweetid(){
return tweetid;
}
public void setTweetid(long tweetid){
this.tweetid = tweetid;
}
public String getDate(){
return date;
}
public void setDate(String date){
this.date = date;
}
public String toString(){
return this.tweetid + " " + this.user + " " + this.date;
}
}
... 所以这只是标准 java。要使用上面的代码,我使用 Twitter4J API 并执行此操作:
public class DeleteTweets
{
public static void main(String args[]) throws Exception
{
Twitter twitter = TwitterFactory.getSingleton();
ArrayList<Tweet> tweets = new ArrayList<Tweet>();
String [] people = { "PickLuckier" };
for(String s : people){
do{
ReadSearch rs = new ReadSearch();
tweets = rs.getTweets(twitter.getScreenName(), s);
for(Tweet tw : tweets){
twitter.destroyStatus(tw.getTweetid());
}
} while(tweets.size()!=0);
}
}
}
就是这样。我不使用评论,但我希望它很容易看到发生了什么,这对你有帮助。
根据http://www.theverge.com/2014/11/18/7242477/twitter-search-now-lets-you-find-any-tweet-ever-sent Twitter 搜索现在可以让您找到曾经发送过的任何推文。
但是当我尝试使用 tweepy 获取 2014 年至 2015 年的推文时,它只获取最近的推文:
query = 'Nivea'
max_tweets = 1000
searched_tweets = [json.loads(status.json) for status in tweepy.Cursor(api.search,
q=query,
count=100,
#since_id="24012619984051000",
since="2014-02-01",
until="2015-02-01",
result_type="mixed",
lang="en"
).items(max_tweets)]
我试过 since="2014-02-01",since_id 但没关系。
很遗憾,您无法从 Twitter 访问过去的数据。不是您使用的库的问题:Tweepy、Twitter4J 等等,只是 Twitter 不会提供任何早于或少于 2 周的数据。
要获取历史数据,您需要直接通过 Twitter 或 GNIP 等第三方经销商访问 firehose。
我使用自己的一段代码,它使用 HttpURLConnection
和 Twitter 搜索 url。然后,我使用正则表达式提取出最后 20 条匹配的推文……幸运的是,当我删除推文时,我可以简单地再次搜索,直到找不到更多推文。我包含了代码,尽管它在 Java 中,但同样适用于任何语言。首先,我使用 class 实际搜索推文并记录其详细信息:
public class ReadSearch{
private String startURL = "https://twitter.com/search?f=realtime&q=from%3A";
private String middleURL = "%20%40";
private String endURL = "&src=typd";
public ArrayList<Tweet> getTweets(String user, String troll) {
ArrayList<Tweet> tweets = new ArrayList<Tweet>();
String expr = "small.class=\"time\".*?href=\"/"
+ "([^/]+)"
+ ".*?status/"
+ "([^\"]+)"
+ ".*?title=\""
+ "([^\"]+)";
Pattern patt = Pattern.compile(expr, Pattern.DOTALL | Pattern.UNIX_LINES);
try {
Matcher m = patt.matcher(getData(startURL+user+middleURL+troll+endURL));
while (m.find()) {
if(user.equals(m.group(1).trim())){
Tweet tw = new Tweet();
tw.setUser(m.group(1).trim());
tw.setTweetid(Long.parseLong(m.group(2).trim()));
tw.setDate(m.group(3).trim());
tweets.add(tw);
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("Exception " + e);
}
return tweets;
}
private StringBuilder getData(String dataurl) throws MalformedURLException, IOException{
URL url = new URL(dataurl);
HttpURLConnection httpcon = (HttpURLConnection) url.openConnection();
httpcon.addRequestProperty("User-Agent", "Mozilla/4.76");
StringBuilder sb = new StringBuilder(16384);
BufferedReader br = new BufferedReader(new InputStreamReader(httpcon.getInputStream(), "ISO-8859-1"));
String line;
while ((line = br.readLine()) != null){
sb.append(line);
sb.append('\n');
}
httpcon.disconnect();
br.close();
return sb;
}
public static void main(String [] args){
//testing
ReadSearch rs = new ReadSearch();
ArrayList<Tweet> tweets = rs.getTweets("Tony_Kennah", "PickLuckier");
for(Tweet t : tweets){
System.out.println("TWEET: " + t.toString());
}
}
}
然后我们需要 Tweet class 本身,这样我们就可以将 Tweet 分组并使用它们进行操作,它只是一个像这样的 bean:
public class Tweet{
private String user;
private long tweetid;
private String date;
public String getUser(){
return user;
}
public void setUser(String user){
this.user = user;
}
public long getTweetid(){
return tweetid;
}
public void setTweetid(long tweetid){
this.tweetid = tweetid;
}
public String getDate(){
return date;
}
public void setDate(String date){
this.date = date;
}
public String toString(){
return this.tweetid + " " + this.user + " " + this.date;
}
}
... 所以这只是标准 java。要使用上面的代码,我使用 Twitter4J API 并执行此操作:
public class DeleteTweets
{
public static void main(String args[]) throws Exception
{
Twitter twitter = TwitterFactory.getSingleton();
ArrayList<Tweet> tweets = new ArrayList<Tweet>();
String [] people = { "PickLuckier" };
for(String s : people){
do{
ReadSearch rs = new ReadSearch();
tweets = rs.getTweets(twitter.getScreenName(), s);
for(Tweet tw : tweets){
twitter.destroyStatus(tw.getTweetid());
}
} while(tweets.size()!=0);
}
}
}
就是这样。我不使用评论,但我希望它很容易看到发生了什么,这对你有帮助。