处理 For 循环中的连接中断,错误行为
Dealing With Connection Break in For Loop, Wrong Behaviour
我有以下 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...'
这主要是由于连接问题,推特 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
因此对每个用户只迭代一次。
我做错了什么吗?
return
语句在for
循环内,所以程序在第一次迭代后退出for
循环。
我有以下 For 循环,它使用 Tweepy
:
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...'
这主要是由于连接问题,推特 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
因此对每个用户只迭代一次。
我做错了什么吗?
return
语句在for
循环内,所以程序在第一次迭代后退出for
循环。