2017-06-27 11 views
1

I usernamesのシリーズのうち、extract idsに次のコードを持っているとパンダのデータフレームがnew_followers_dfと呼ばれるに追加:user x75,000 usersを持っていた場合Tweepy IDを抽出するために、適切ではない何か

twitter_handles = ["x", "y"]  

## Import New Twitter Followers 

new_follower_ids = [] 
handles = [] 

for user in twitter_handles: 

    while True: 

     try: 

      for page in tweepy.Cursor(api.followers_ids, screen_name= user).pages(): 
       new_follower_ids.extend(page) 
       for ids in page: 
        handles.append(user) 
     except tweepy.TweepError: 
      time.sleep(60 * 15) 
      continue 

     except StopIteration: 
      pass 
     break 

new_followers_df = pd.DataFrame({ 
    "Handles": handles, 
    "Follower_ID": new_follower_ids}) 

user y75,000を私はuser X and Y's followersのすべてをかき集めるために私が30 minutesを取るべきであると計算した。

これは、APIには5000 ids per Cursor,15 calls per session、および15 minute wait in betweenの制限があるためです。

ただし、何らかの理由により、スクリプトが完了するまでに時間がかかります。私のforループに何か問題があるとすればどんな考えですか?それは何かを持っている可能性がありますか:StopIteration

ありがとうございました

答えて

0
import tweepy 
from datetime import datetime 
import pandas as pd 

new_followers_df = pd.DataFrame() 

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 = '' 
consumer_secret = '' 
access_token = '' 
access_token_secret = '' 

# 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 = ['x', 
'y', 
'z', 
'a', 
'b'] 

for username in lookup_users: 
    user_followers = download_followers(username, main_api) 
    if user_followers: 
     new_followers = pd.DataFrame({ 
      "Handles": username, 
      "Follower_ID": user_followers, 
      "Start_Date": datetime.now().strftime('%Y/%m/%d')}) 

     new_followers_df = new_followers_df.append(new_followers) 


     print('Finished outputting: {} at {}'.format(username, datetime.now().strftime('%Y/%m/%d %H:%M:%S'))) 
1

何か起こっていることがあります。

  1. プログラムをテストしている場合は、15分のウィンドウでこれらの呼び出しの一部をテストしている可能性があります。
  2. pandasは、Dataframeに150,000の値を追加するのに多分時間がかかります。
  3. pageを2回使用すると、pageを2回(extend(page)for ids in page)使用している可能性があります。これは少しの推測ですが、私は全く間違っているかもしれません。

しかし、このコードをもう少しエレガントにするためにコードを再コードして、うまくいけば遅い時間を減らすことができます。

まず、レート制限を自分で処理する必要はありません。 tweepyは、APIを初期化するときにこれを行うことができます。我々はこれを変更した場合

api = tweepy.API(auth) 

:おそらくあなたのコードの中でいくつかの点で、あなたはラインを持っているあなたはレート制限を打ったとき

api = tweepy.API(auth, wait_on_rate_limit=True, wait_on_rate_limit_notify=True) 

tweepyが待機すると、メッセージはあなたを伝えるために印刷されますそれは待っている。

あなたの場所に、のは、少しコードをrejig聞かせすることを持ったら:

twitter_handles = ["x", "y"]  

new_follower_ids = [] 
handles = [] 

for user in twitter_handles: 
    current_user_followers = [] 
    for page in tweepy.Cursor(api.followers_ids, screen_name=user).pages(): 
     current_user_followers.extend(page) 

    new_follower_ids.extend(current_user_followers) 
    handles.extend([user for _ in current_user_followers]) 

new_followers_df = pd.DataFrame({ 
    "Handles": handles, 
    "Follower_ID": new_follower_ids}) 

forループ内で、現在のユーザーのためのフォロワーを追跡することによって、我々は一度だけhandlesリストを拡張する必要があります最後に、我々は新しい信者のすべてを一度獲得した。このユーザーがどれだけの信者を知っているかのように、userhandlesに追記することができます。

+0

こんにちは、ありがとう、私は以下のコードでそれを解決しました。しかし、スーパーはあなたの助けに感謝します –

関連する問題