【问题标题】:Dealing With Connection Break in For Loop, Wrong Behaviour处理 For 循环中的连接中断,错误行为
【发布时间】:2017-12-05 04:41:28
【问题描述】:

我有以下 For 循环,它使用 Tweepy 获取一系列用户的关注者 ID:

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

函数调用方式如下:

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": today})

        new_followers_df = new_followers_df.append(new_followers)


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

根据每个user 可能拥有的关注者数量,Twitter's API 可能需要调用两次或三次才能获取所有user's followers。

因此,在再次调用 api 之前有 15 分钟的休息时间。这是通过将以下参数添加到Tweepy 来处理的:

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

结果是这样的:

Rate limit reached. Sleeping for: 895
Rate limit reached. Sleeping for: 895
Finished outputting: @barackobama at 2017/07/01 10:36:07

在这种情况下,API 两次达到了极限。每次等待 15 分钟,然后才能抓住 @barackobama 的所有关注者。

但是,有时for loop 会失败。打印出消息:

    'Could not access user @barackobama. Skipping...'

这主要是由于连接问题,twitter api 没有发送正确的请求,或者有很多关注者的帐户和 Tweepy 的包无法相应地处理它。

为了解决可能的连接失败,我尝试将 api 包装在 While True 参数中,如下所示:

 def download_followers(user, api):
    all_followers = []
    while True:

        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 {}. Trying Again...'.format(user))
            continue
        break

但是,通过这种方式包装函数,for 循环无法正常工作。 Iterating 在每个 user 上只处理一次,而不是抓住所有关注者,然后转到`lookup_user 列表中的下一个 user。

例如,instead 的行为方式如下:

Rate limit reached. Sleeping for: 895
'Could not access user @barackobama. Trying again...'
Rate limit reached. Sleeping for: 895
Finished outputting: @barackobama at 2017/07/01 10:36:07
Rate limit reached. Sleeping for: 895
Rate limit reached. Sleeping for: 895
Rate limit reached. Sleeping for: 895
Finished outputting: @donaldtrump at 2017/07/01 10:36:07

它的作用如下:

Finished outputting: @barackobama at 2017/07/01 10:36:07
Finished outputting: @donaldtrump at 2017/07/01 10:36:07
Finished outputting: @georgebush at 2017/07/01 10:36:07
Rate limit reached. Sleeping for: 895
Finished outputting: @richardnixon at 2017/07/01 10:41:08

因此对每个用户只迭代一次。

是不是我做错了什么?

【问题讨论】:

    标签: python function for-loop while-loop tweepy


    【解决方案1】:

    return 语句在for 循环内,因此程序在第一次迭代后退出for 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      相关资源
      最近更新 更多