【问题标题】:Tweepy For Loop For IDs Extract, Something Not RightTweepy For Loop For IDs 提取,有些不对劲
【发布时间】:2017-11-30 15:18:12
【问题描述】:

我在一系列usernames 中有以下代码extract ids 并附加到名为new_followers_df 的熊猫数据框:

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 x75,000 usersuser y 另一个75,000 我计算出我应该需要30 minutes 才能刮掉所有user X and Y's followers

这是因为 API 的限制为 5000 ids per Cursor15 calls per session15 minute wait in between

但是,由于某种原因,脚本需要更长的时间才能完成。知道我的 for 循环是否有问题吗?有没有可能与:StopIteration有关?

谢谢

【问题讨论】:

    标签: python pandas for-loop twitter tweepy


    【解决方案1】:

    可能会发生一些事情。

    1. 如果您一直在测试您的程序,您可能已经在 15 分钟的测试窗口中使用了其中一些调用。
    2. pandas 可能需要一些时间才能将 150,000 个值附加到 Dataframe。
    3. 对此并不完全确定,但如果page 是一个生成器,您可能会使用两次pageextend(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 将在您达到速率限制时等待,并打印一条消息告诉您它正在等待。

    一旦你准备好了,让我们稍微修改一下你的代码:

    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 列表,一旦我们获得了所有新的关注者。由于我们知道该用户有多少关注者,我们可以为每个关注者将user 附加到handles 一次。

    【讨论】:

    • 您好,非常感谢,我设法用下面的代码解决了这个问题。但是非常感谢您的帮助
    【解决方案2】:
    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')))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多