R 从关注者列表中查找用户推文的所有回复
R Find all replies to a user's tweets from their follower list
我正在尝试找出用户对所有给定推文的回复数量。这不是直接从 Twitter API 获得的东西。我决定只关注用户的关注者的回复,以帮助提取生成的数据并作为一个很好的近似值(我相信对推文的回复的 msot 将直接来自该用户的关注者。
我相信我已经取得了很大的进步,我只是需要最后一部分的帮助。我正在努力实现我为所有关注者创建的 运行 功能。
相比 Python,我更希望这个解决方案在 R 中,尽管我知道它存在并且将是一个选项。我还为唐纳德·特朗普添加了推特标签;我不想为他做这件事,我知道他的大量追随者将使这成为一个挑战。我想要一个可用于任何用户输入的通用版本。
library(rtweet)
library(plyr)
library(dplyr)
##set name of tweeter to look at (this can be changed)
targettwittername <- "realDonaldTrump"
##get this tweeter's timeline
tmls <- get_timeline(targettwittername, n=3200, retryonratelimit=TRUE)
##get their user id
targettwitteruserid <- as.numeric(select(lookup_users(targettwittername), user_id))
##get ids of their tweets
tweetids <- select(tmls, status_id)
tweetids <- transform(tweetids, status_id_num=as.numeric(status_id))
##get list of followers (who are most likely to reply)
targetfollowers <- data.frame(get_followers(targettwittername))
##clean up follower list to exclude those that have never tweeted and restricted access
user_lookup <- lookup_users(targetfollowers)
users_with_tweets_and_unprotected <- filter(user_lookup, statuses_count != 0)
users_with_tweets_and_unprotected <- select(filter(users_with_tweets_and_unprotected, protected != "TRUE"), user_id)
targetfollowers <- filter(targetfollowers, user_id %in% users_with_tweets_and_unprotected$user_id)
##custom function to search all followers timelines one by one
getfollowersreplies <- function(x){
follower <- as.numeric(x[1])
followertl <- data.frame(get_timeline(follower, n=3200, retryonratelimit=TRUE))
followertl <- filter(followertl, in_reply_to_status_user_id == targettwitteruserid)
followertl <- transform(followertl, reply_to_status_id_num=as.numeric(in_reply_to_status_status_id))
join <- inner_join(followertl, tweetids, by=c("reply_to_status_id_num"="status_id_num"))
replycounts <- data.frame(
join %>%
group_by(user_id, reply_to_status_id_num) %>%
summarise(n=n())
)
return(replycounts)
}
tweet_replies <- do.call("rbind", lapply(targetfollowers$user_id, getfollowersreplies))
最大的障碍是收集 @realDonaldTrump.
超过 4200 万粉丝发布的多达 3200 条最新推文所花费的时间。
> djt <- lookup_users(targettwittername)
> djt[, c("screen_name", "followers_count", "friends_count", "statuses_count")]
# A tibble: 1 x 4
screen_name followers_count friends_count statuses_count
<chr> <int> <int> <int>
1 realDonaldTrump 42793758 45 36398
Twitter 将每 15 分钟收集的关注者用户 ID 数量限制为 75,000 个。
flw <- get_followers("realDonaldTrump", n = 75000)
> flw
# A tibble: 75,000 x 1
user_id
<chr>
1 928808378
2 926186565231136768
3 931237514253426688
4 930584682701475842
5 902580952165216256
6 931236663950372864
7 931237367024820224
8 922140807024578560
9 931235142047211520
10 931235653412708352
# ... with 74,990 more rows
假设您有可靠的互联网连接和时间,那么您可以使用以下代码获取所有 4200 万关注者 ID。
flw <- get_followers(
"realDonaldTrump", n = 42793758, retryonratelimit = TRUE
)
那么您可能想要构造一个使用 get_timeline()
并处理 API 速率限制的 for 循环。在下面的示例代码中,我让循环休眠,直到每 56 次调用后速率限制重置。
flw_tml <- vector("list", length(flw$user_id))
for (i in seq_along(flw$user_id)) {
flw_tml[[i]] <- get_timeline(
flw$user_id[i], n = 3200
)
if (i %% 56 == 0L) {
rl <- rate_limit("get_timeline")
Sys.sleep(as.numeric(rl$reset, "secs"))
}
cat(i, " ")
}
如您所见,这需要很长时间。您最好尝试收集过去 6-9 天内的所有回复。下面的代码在过去 9 天内获得了对特朗普推文的多达 500 万条回复。警告:如果过去 9 天内实际上有那么多回复(老实说我不知道),则此搜索将需要不到三天的时间才能完成。
at_rdt <- search_tweets(
"to:realdonaldtrump",
n = 5e6,
retryonratelimit = TRUE
)
我正在尝试找出用户对所有给定推文的回复数量。这不是直接从 Twitter API 获得的东西。我决定只关注用户的关注者的回复,以帮助提取生成的数据并作为一个很好的近似值(我相信对推文的回复的 msot 将直接来自该用户的关注者。
我相信我已经取得了很大的进步,我只是需要最后一部分的帮助。我正在努力实现我为所有关注者创建的 运行 功能。
相比 Python,我更希望这个解决方案在 R 中,尽管我知道它存在并且将是一个选项。我还为唐纳德·特朗普添加了推特标签;我不想为他做这件事,我知道他的大量追随者将使这成为一个挑战。我想要一个可用于任何用户输入的通用版本。
library(rtweet)
library(plyr)
library(dplyr)
##set name of tweeter to look at (this can be changed)
targettwittername <- "realDonaldTrump"
##get this tweeter's timeline
tmls <- get_timeline(targettwittername, n=3200, retryonratelimit=TRUE)
##get their user id
targettwitteruserid <- as.numeric(select(lookup_users(targettwittername), user_id))
##get ids of their tweets
tweetids <- select(tmls, status_id)
tweetids <- transform(tweetids, status_id_num=as.numeric(status_id))
##get list of followers (who are most likely to reply)
targetfollowers <- data.frame(get_followers(targettwittername))
##clean up follower list to exclude those that have never tweeted and restricted access
user_lookup <- lookup_users(targetfollowers)
users_with_tweets_and_unprotected <- filter(user_lookup, statuses_count != 0)
users_with_tweets_and_unprotected <- select(filter(users_with_tweets_and_unprotected, protected != "TRUE"), user_id)
targetfollowers <- filter(targetfollowers, user_id %in% users_with_tweets_and_unprotected$user_id)
##custom function to search all followers timelines one by one
getfollowersreplies <- function(x){
follower <- as.numeric(x[1])
followertl <- data.frame(get_timeline(follower, n=3200, retryonratelimit=TRUE))
followertl <- filter(followertl, in_reply_to_status_user_id == targettwitteruserid)
followertl <- transform(followertl, reply_to_status_id_num=as.numeric(in_reply_to_status_status_id))
join <- inner_join(followertl, tweetids, by=c("reply_to_status_id_num"="status_id_num"))
replycounts <- data.frame(
join %>%
group_by(user_id, reply_to_status_id_num) %>%
summarise(n=n())
)
return(replycounts)
}
tweet_replies <- do.call("rbind", lapply(targetfollowers$user_id, getfollowersreplies))
最大的障碍是收集 @realDonaldTrump.
超过 4200 万粉丝发布的多达 3200 条最新推文所花费的时间。> djt <- lookup_users(targettwittername)
> djt[, c("screen_name", "followers_count", "friends_count", "statuses_count")]
# A tibble: 1 x 4
screen_name followers_count friends_count statuses_count
<chr> <int> <int> <int>
1 realDonaldTrump 42793758 45 36398
Twitter 将每 15 分钟收集的关注者用户 ID 数量限制为 75,000 个。
flw <- get_followers("realDonaldTrump", n = 75000)
> flw
# A tibble: 75,000 x 1
user_id
<chr>
1 928808378
2 926186565231136768
3 931237514253426688
4 930584682701475842
5 902580952165216256
6 931236663950372864
7 931237367024820224
8 922140807024578560
9 931235142047211520
10 931235653412708352
# ... with 74,990 more rows
假设您有可靠的互联网连接和时间,那么您可以使用以下代码获取所有 4200 万关注者 ID。
flw <- get_followers(
"realDonaldTrump", n = 42793758, retryonratelimit = TRUE
)
那么您可能想要构造一个使用 get_timeline()
并处理 API 速率限制的 for 循环。在下面的示例代码中,我让循环休眠,直到每 56 次调用后速率限制重置。
flw_tml <- vector("list", length(flw$user_id))
for (i in seq_along(flw$user_id)) {
flw_tml[[i]] <- get_timeline(
flw$user_id[i], n = 3200
)
if (i %% 56 == 0L) {
rl <- rate_limit("get_timeline")
Sys.sleep(as.numeric(rl$reset, "secs"))
}
cat(i, " ")
}
如您所见,这需要很长时间。您最好尝试收集过去 6-9 天内的所有回复。下面的代码在过去 9 天内获得了对特朗普推文的多达 500 万条回复。警告:如果过去 9 天内实际上有那么多回复(老实说我不知道),则此搜索将需要不到三天的时间才能完成。
at_rdt <- search_tweets(
"to:realdonaldtrump",
n = 5e6,
retryonratelimit = TRUE
)