2016-08-06 1 views
0

TwitteRとforループの概念は全く新しいです。私はフォロワーとプロファイルを取得するために、このコードに出くわしました。効率的なforループを作成してtwitteRのレート制限の問題を解決するにはどうすればよいですか?

このコードは正常に動作します。このような長い時間、レート制限を再試行する必要があるかどうかは十分にはわかりません。

#This extracts all or most followers. 
followers<-getUser("twitter_handle_here")$getFollowerIDs(retryOnRateLimit=9999999) 

このコードは、プロファイルを取得するためのforループです。

しかし、私は長さ(フォロワー)とgetCurRateLimitInfo()を使ってループをよりうまく構築する方法があると思います。

私の質問は、長さ(フォロワー)= 40000とratelimit = 180の場合、正しい時間でスリープするループを構築し、すべての40000 twitterプロファイルを取得する方法ですか?

ご協力いただければ幸いです。ここで

#This is the for loop to sleep for 5 seconds. 
#Problem with this is it simply sleeps for X seconds 
for (follower in followers){ 
    Sys.sleep(5) 
    followers_info<-lookupUsers(followers) 
    followers_full<-twListToDF(followers_info) 
    } 

答えて

1

私は同様の目的のために書かれていたいくつかのコードは、まずあなたがこの機能stall_rate_limit定義する必要があり、次のとおりです。

stall_rate_limit <- function(limit) { 

    # Store the record of all the rate limits into rate 
    rate = getCurRateLimitInfo() 
    message("Checking Rate Limit") 

    if(any(as.numeric(rate[,3]) == 0)) { 

    # Get the locations of API Calls that are used up 
    index = which(as.numeric(rate[,3]) == 0) 

    # get the time till when rates limits Reset 
    wait = as.POSIXct(min(rate[index,4]),  ## Reset times in the 4th col 
         origin = "1970-01-01", ## Origin of Unix Time 
         tz = "US/Mountain")  ## Replace with your Timezone 

    message(paste("Waiting until", wait,"for Godot to reset rate limit")) 
    # Tell the computer to sleep until the rates reset 
    Sys.sleep(difftime(wait, Sys.time(), units = "secs")) 

    # Set J = to 0 
    J = 0 
    # Return J as a counter 
    return(J) 

    } else { 

    # Count was off, Try again 
    J = limit - 1 
    return(J) 

    } 
} 

を次に、あなたのコードを実行することができ、このような何か:

callsMade = 0 ## This is your counter to count how many calls were made 
limit = 180  ## the Limit of how many calls you can make 
for(i in 1:length(followers)){ 

    # Check to see if you have exceeded your limit 
    if(callsMade >= limit){ 

    # If you have exceeded your limit, wait and set calls made to 0 
    callsMade = stall_rate_limit(limit) 

    } 

    ### Execute your Code Here ... ### 

    callsMade = callsMade + 1 # or however many calls you have made 
} 
+0

ありがとうございます。コードをもう少し理解するためには時間が必要です。 私はそれをテストするためにコピーし貼り付けました。 残念ながら、私はこのエラーが発生しています。 > curl :: curl_fetch_memory(url、handle = handle)のエラー >ピアからデータを受け取ったときにエラーが発生しました。 – Samuel

+0

K、どうしたらいいか教えてください。私はコードを修正して小さな誤植を修正し、さらに情報を追加しました。 –

関連する問題