我正在尝试使用twitteR软件包来抓取一系列公共Twitter个人资料,然后将这些推文收集到数据库中。我遇到的问题是API似乎没有收集可用推文的全部内容。
这是我的代码:
library(RColorBrewer)
library(NLP)
library(twitteR)
library(foreign)
library(wordcloud)
library(tm)
library(base64enc)
library(httr)
access_token<-"" #not including these, but the oauth works for me
access_secret<-""
consumer_key<-""
consumer_secret<-""
###Scrapes Twitter Account
setup_twitter_oauth(consumer_key, consumer_secret, access_token, access_secret)
set.seed(123)
user.tweets<-userTimeline('@HillaryClinton', n=3200)
df<-twListToDF(user.tweets)
此代码从希拉里克林顿的推特页面获取340条推文。但她有超过8,000条推文,所以我很困惑,为什么它只是抓住这些。我检查了最早的推文的日期,这是今年的4月27日。这是API的一个问题,只收回到那个日期吗?
我不认为 是这种情况,因为我也在朋友的推特个人资料中使用了此代码。这只收集了他的451条推文中的106条,但它一直追溯到2013年。但在那种情况下,它正在跳过他撰写的一些推文(它们不是转推)。
我的代码中是否遗漏了某些内容,我缺少的userTimeline函数是否存在限制,或者是什么?
感谢。
答案 0 :(得分:0)
您的代码似乎是正确的,因为它对我也有用,实际上,我之前使用过这个软件包并处理过类似的问题。
在努力了解为什么会发生这种情况后,我发现这是由于API限制,请检查here。我确信这可以避免,所以你可以得到更多的推文。然而,这意味着要抓取Twitter和一些代码行。
对此进行排序的一种方法可能是在for循环中使用一些计时器,例如:
user.tweets<-userTimeline('@HillaryClinton', n=3200)
df<-twListToDF(user.tweets)
for(i in 1:100){
user.tweets<-userTimeline('@HillaryClinton', n=3200)
df<-rbind(user.tweets)
Sys.sleep(900)
}
这种方式每900秒,15分钟,您运行一个查询,但您可以将此计时器更改为您考虑的任何内容。 或者建议here的另一个选项,您可以在给定计时器的情况下运行脚本。我猜这种方式你会得到一些重复的推文,但你可以通过以下方式轻松摆脱它们:
df[duplicated(df), ]
这种解决方案很可能不是理想的,但这对我来说非常合适。关键是要有点创意! :)
我希望它有所帮助,如果有人对如何改进它提出任何建议,我将很高兴听到。