R Найти все ответы на твиты пользователя из списка подписчиков.

Я пытаюсь выяснить количество ответов на все заданные твиты пользователя. Это не что-то доступное непосредственно из API Twitter. Я решил использовать только ответы от подписчиков пользователя, чтобы помочь разобраться в сгенерированных данных и, как хорошее приближение (я полагаю, что большинство ответов на твит будет приходить непосредственно от подписчиков пользователей).

Я считаю, что я уже прошел долгий путь, но мне нужна помощь с последним разделом. Я изо всех сил стараюсь, чтобы созданная мною функция охватила всех подписчиков.

Я бы предпочел, чтобы это решение было в R поверх Python, хотя я знаю, что оно существует и будет вариантом. Я также добавил в твиттер тег Дональда Трампа; Я не пытаюсь сделать это для него и знаю, что его огромная поддержка сделает это вызовом. Я хочу универсальную версию, пригодную для использования любым пользователем.

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))

1 ответ

Решение

Самым большим препятствием будет время, необходимое для сбора до 3200 самых последних твитов, опубликованных более 42 миллионами последователей https://twitter.com/realDonaldTrump.

> 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 ограничивает количество идентификаторов подписчиков, собираемых до 75 000 каждые 15 минут.

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

Если у вас есть надежное интернет-соединение и время, то вы можете использовать следующий код, чтобы получить все 42 миллиона идентификаторов подписчиков.

flw <- get_followers(
  "realDonaldTrump", n = 42793758, retryonratelimit = TRUE
)

Тогда вы, вероятно, захотите построить цикл, который использует get_timeline() и обрабатывает ограничения скорости API. В приведенном ниже примере кода я отключил цикл до тех пор, пока ограничение скорости не будет сброшено после каждых 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 дней. Код ниже получает до 5 миллионов ответов на твиты Трампа за последние 9 дней. Предупреждение: если за последние 9 дней было так много ответов (честно говоря, я понятия не имею), этот поиск может занять чуть менее трех дней.

at_rdt <- search_tweets(
  "to:realdonaldtrump", 
  n = 5e6,
   retryonratelimit = TRUE
)
Другие вопросы по тегам