Python爬虫脚本如何跳过循环最后一次迭代的time.sleep延时
方案合理性评估
你当前的实现方案在user_list无重复元素的场景下可以正常运行,但存在明显缺陷:如果列表内存在和末尾元素相同的重复值,判断user == user_list[-1]会误判提前跳过sleep,导致API请求频率过高触发限制。
更优实现方案
推荐两种更通用的实现思路:
方案1:通过索引判断(可读性高)
用enumerate同时获取迭代的索引和元素,直接判断当前是否为最后一次迭代,不受元素值重复的影响:
# First part, downloading. for idx, user in enumerate(user_list): print(user) scraper() # 非最后一次迭代才执行sleep if idx != len(user_list) - 1: sleep_seconds = random.randint(300*1000, 600*1000)/1000 print('Sleeping for {} seconds...'.format(sleep_seconds)) time.sleep(sleep_seconds) # Second part, parsing. parser()
方案2:调整sleep逻辑位置(更简洁)
两次爬取操作之间才需要间隔等待,所以可以把sleep放到下一次爬取之前执行,完全不需要判断是否为末尾元素:
# First part, downloading. if user_list: # 第一次爬取不需要前置等待 user = user_list[0] print(user) scraper() # 后续每次爬取前先等待 for user in user_list[1:]: sleep_seconds = random.randint(300*1000, 600*1000)/1000 print('Sleeping for {} seconds...'.format(sleep_seconds)) time.sleep(sleep_seconds) print(user) scraper() # Second part, parsing. parser()
注意你原有代码里存在单位输出错误,sleep计算的是秒,但打印写的是
minutes,使用时需要修正。
内容的提问来源于stack exchange,提问作者Jonathan
相关产品推荐
相关产品推荐

