2017-02-20 10 views
0

Twitterのフォロワーをアカウントのリストからダウンロードしようとしています。私の関数(twythonを使用する)は短いアカウントリストではうまく機能しますが、長いリストではエラーが発生します。レート制限が当たった場合、私の関数が次の時間ビンまでスリープするので、RateLimitの問題ではありません。 (「接続が中断されました」、エラー(10054、「」))Twitter APIの接続がTwythonで打ち切られました

他の人が同じ問題と提案された解決策を持っているように見える異なるREST間の機能の睡眠を作ることです: エラーは、この

twythonerrorがありますAPI呼び出しのため、次のコードを実装しました。

del twapi 
    sleep(nap[afternoon]) 
    afternoon = afternoon + 1 
    twapi = Twython(app_key=app_key, app_secret=app_secret, 
       oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 

napは秒単位の間隔のリストで、午後はインデックスです。この提案にもかかわらず 私はまだまったく同じ問題があります。睡眠は問題を解決しないようです。 誰でも助けてくれますか?

が、ここでコメントで述べたように、全体finction

def download_follower(serie_lst): 
    """Creates account named txt files containing followers ids. Uses for loop on accounts names list.""" 
    nap = [1, 2, 4, 8, 16, 32, 64, 128]  
    afternoon = 0 

    for exemplar in serie_lst: 

     #username from serie_lst entries 
     account_name = exemplar 

     twapi = Twython(app_key=app_key, app_secret=app_secret, 
         oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 

     try: 
      #initializations 
      del twapi 
      if afternoon >= 7: 
       afternoon =0 

      sleep(nap[afternoon]) 
      afternoon = afternoon + 1 
      twapi = Twython(app_key=app_key, app_secret=app_secret, 
         oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 
      next_cursor = -1 
      result = {} 
      result["screen_name"] = "" 
      result["followers"] = [] 
      iteration = 0 
      file_name = "" 

      #user info 
      user = twapi.lookup_user(screen_name = account_name) 

      #store user name 
      result['screen_name'] = account_name 

      #loop until all cursored results are stored 
      while (next_cursor != 0): 
       sleep(random.randrange(start = 1, stop = 15, step = 1)) 
       call_result = twapi.get_followers_ids(screen_name = account_name, cursor = next_cursor) 
       #loop over each entry of followers id and append each  entry to results_follower  
       for i in call_result["ids"]: 
        result["followers"].append(i) 
       next_cursor = call_result["next_cursor"] #new next_cursor 
       iteration = iteration + 1 
       if (iteration > 13): #skip sleep if all cursored pages are processed 
        error_msg = localtime() 
        error_msg = "".join([str(error_msg.tm_mon), "/", str(error_msg.tm_mday), "/", str(error_msg.tm_year), " at ", str(error_msg.tm_hour), ":", str(error_msg.tm_min)]) 
        error_msg ="".join(["Twitter API Request Rate Limit hit on ", error_msg, ", wait..."]) 
        print(error_msg) 
        del error_msg 
        sleep(901) #15min + 1sec 
        iteration = 0 

      #output file 
      file_name = "".join([account_name, ".txt"]) 

      #print output 
      out_file = open(file_name, "w") #open file "account_name.txt" 
      #out_file.write(str(result["followers"])) #standard format 
      for i in result["followers"]: #R friendly table format 
       out_file.write(str(i)) 
       out_file.write("\n") 
      out_file.close() 

     except twython.TwythonRateLimitError: 
      #wait 
      error_msg = localtime() 
      error_msg = "".join([str(error_msg.tm_mon), "/", str(error_msg.tm_mday), "/", str(error_msg.tm_year), " at ", str(error_msg.tm_hour), ":", str(error_msg.tm_min)]) 
      error_msg ="".join(["Twitter API Request Rate Limit hit on ", error_msg, ", wait..."]) 
      print(error_msg) 
      del error_msg 
      del twapi 
      sleep(901) #15min + 1sec 

      #initializations 
      if afternoon >= 7: 
       afternoon =0 

      sleep(nap[afternoon]) 
      afternoon = afternoon + 1 
      twapi = Twython(app_key=app_key, app_secret=app_secret, 
         oauth_token=oauth_token, oauth_token_secret=oauth_token_secret) 
      next_cursor = -1 
      result = {} 
      result["screen_name"] = "" 
      result["followers"] = [] 
      iteration = 0 
      file_name = "" 

      #user info 
      user = twapi.lookup_user(screen_name = account_name) 

      #store user name 
      result['screen_name'] = account_name 

      #loop until all cursored results are stored 
      while (next_cursor != 0): 
       sleep(random.randrange(start = 1, stop = 15, step = 1)) 
       call_result = twapi.get_followers_ids(screen_name = account_name, cursor = next_cursor) 
       #loop over each entry of followers id and append each entry to results_follower  
       for i in call_result["ids"]: 
        result["followers"].append(i) 
       next_cursor = call_result["next_cursor"] #new next_cursor 
       iteration = iteration + 1 
       if (iteration > 13): #skip sleep if all cursored pages are processed 
        error_msg = localtime() 
        error_msg = "".join([str(error_msg.tm_mon), "/", str(error_msg.tm_mday), "/", str(error_msg.tm_year), " at ", str(error_msg.tm_hour), ":", str(error_msg.tm_min)]) 
        error_msg = "".join(["Twitter API Request Rate Limit hit on ", error_msg, ", wait..."]) 
        print(error_msg) 
        del error_msg 
        sleep(901) #15min + 1sec 
        iteration = 0 

      #output file 
      file_name = "".join([account_name, ".txt"]) 

      #print output 
      out_file = open(file_name, "w") #open file "account_name.txt" 
      #out_file.write(str(result["followers"])) #standard format 
      for i in result["followers"]: #R friendly table format 
       out_file.write(str(i)) 
       out_file.write("\n") 
      out_file.close() 
+0

'nap'の値は何ですか? 「午後」の初期値は何ですか?これを理解するためには、もう少し文脈を提供する必要があります。 – asongtoruin

+0

nap = [1,2,4,8,16,32,64,128]、午後は0で初期化され、必要に応じて0に戻されます。その部分がチェックされ、問題は、プログラムが各呼び出しの間にスリープしても、サーバーが接続を閉じずに続けることです。 – mbiella

+0

なぜこのような短い休憩を使用していますか?レート制限の問題であれば、これらの値はおそらく、次のウィンドウに入るのに十分な長さではないでしょう(https://dev.twitter.com/rest/public/rate-limits)。制限は15分ごとです。 – asongtoruin

答えて

0

あり、現時点ではあなたのコードを持ついくつかの問題があります。接続が正常に機能するには、接続を削除する必要はありません。レート制限を守るためのキャッチなしに2回目を初期化するため、問題が発生していると思います。ここでは、必要な情報を得ることができる方法のTweepyを使用した例です。

import tweepy 
from datetime import datetime 


def download_followers(user, api): 
    all_followers = [] 
    try: 
     for page in tweepy.Cursor(api.followers_ids, screen_name=user).pages(): 
      all_followers.extend(map(str, page)) 
     return all_followers 
    except tweepy.TweepError: 
     print('Could not access user {}. Skipping...'.format(user)) 

# Include your keys below: 
consumer_key = 'YOUR_KEY' 
consumer_secret = 'YOUR_KEY' 
access_token = 'YOUR_KEY' 
access_token_secret = 'YOUR_KEY' 

# Set up tweepy API, with handling of rate limits 
auth = tweepy.OAuthHandler(consumer_key, consumer_secret) 
auth.set_access_token(access_token, access_token_secret) 
main_api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) 

# List of usernames to get followers for 
lookup_users = ['asongtoruin', 'mbiella'] 

for username in lookup_users: 
    user_followers = download_followers(username, main_api) 
    if user_followers: 
     with open(username + '.txt', 'w') as outfile: 
      outfile.write('\n'.join(user_followers)) 
     print('Finished outputting: {} at {}'.format(username, datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) 

Tweepyは、それがために睡眠する必要がどのくらい我々はwait_on_rate_limit=Trueを使用する場合、それはそのレート制限を打ったときに知ってくれている、とチェックそれが再び始まる前に。 wait_on_rate_limit_notify=Trueを使用することで、次のフォロワーのページを取得できるまで待機する時間をペーストできます(このIDベースの方法では、あたかも5000 IDs per pageがあるようです)。

さらに、TweepError例外を検出しました。これは、提供されたユーザー名が、認証されたユーザーに表示権限がない保護されたアカウントに関連する場合に発生する可能性があります。この場合、ユーザーをスキップして他の情報をダウンロードできるようにしますが、ユーザーにアクセスできないという警告を表示します。

これを実行すると、アクセスできるすべてのユーザーのフォロワーIDのテキストファイルが保存されます。私にとって、これは次のように出力されますasongtoruinのフォロワーIDと

Rate limit reached. Sleeping for: 593 
Finished outputting: asongtoruin at 2017/02/22 11:43:12 
Could not access user mbiella. Skipping... 

は(私の別名)asongtoruin.txt

として保存された信者の私達のページは、最新の最初から開始することで一つの可能​​な問題は、あります。このになる可能性があります(私はAPIを十分に理解しているとは言えませんが)。間に新しいユーザーが追加された場合、出力データセットに問題が発生します。データセット。重複が問題になる場合は、return all_followersreturn set(all_followers)に変更します。

+0

ああ、あなたが期待している通り、 'pip install tweepy'で' tweepy'をインストールできます。 – asongtoruin

+0

それは素晴らしいです!私はあなたの答え(と説明)から多くを学んだ!そんなに大変ありがとうございました! – mbiella

+0

@mbiella心配なし!私もこれを見て多くを拾ったので、それは私たちの両方を助けた:) – asongtoruin

関連する問題