使用Twitter API和twitteR-package,我试图检索一长串名称的用户对象(介于50.000和100.000之间).
我一直收到以下错误:
Error in twInterfaceObj$doAPICall(paste("users", "lookup", sep = "/"), :
client error: (403) Forbidden
Run Code Online (Sandbox Code Playgroud)
错误代码据说提示"更新限制".但是用户查找的速率限制是180,并且查找是以100个用户名的批量执行的.因此,多达18.000个用户应该不是问题.但是,即使每15分钟时间窗口将数量减少到6000(以通过仅应用程序身份验证来限制请求的限制),也会导致相同的错误.
这是一个MWE(但是你需要自己的API密钥):
library(plyr)
# install the latest versions from github:
# devtools::install_github("twitteR", username="geoffjentry")
# devtools::install_github("hadley/httr")
library(twitteR)
library(httr)
source("TwitterKeys.R") # Your own API-Keys
setup_twitter_oauth(consumerKey, consumerSecret, accessToken, accessSecret)
# The following is just to generate a large enough list of user names:
searchTerms <- c("worldcup", "economy", "climate", "wimbledon",
"apple", "android", "news", "politics")
# This might take a while
sample <- llply(searchTerms, function(term) {
tweets <- twListToDF(searchTwitter(term, n=3200))
users <- unique(tweets$screenName)
return(users)
})
userNames <- unique(unlist(sample))
# This function is supposed to perform the lookups in batches
# and mind the rate limit:
getUserObjects <- function(users) {
groups <- split(users, ceiling(seq_along(users)/6000))
userObjects <- ldply(groups, function(group) {
objects <- lookupUsers(group)
out <- twListToDF(objects)
print("Waiting for 15 Minutes...")
Sys.sleep(900)
return(out)
})
return(userObjects)
}
# Putting it into action:
userObjects <- getUserObjects(userNames)
Run Code Online (Sandbox Code Playgroud)
有时手动查找较小的子集,例如通过lookupUsers(userNames[1:3000])工作; 但是,当我尝试自动化该过程时,会抛出错误.
有谁知道这可能是什么原因?
根据这个答案,即使从第一个请求开始,我就达到了 twitteR 的速率限制,不仅对用户总数有限制,而且对每 15 分钟间隔的呼叫数量也有限制。如果每个呼叫有 100 个用户,而您尝试查找 6000 个用户,则您应该进行 60 个呼叫,这超过了允许的 15 个呼叫。尝试让程序进入睡眠状态,并让它在 15 分钟后再次发出呼叫。