如何避免使用Selenium访问Instagram时触发临时请求封禁?
规避限流的具体方案
- 砍掉冗余请求:你当前逻辑存在重复请求问题,用instaloader拉取粉丝列表时,返回的粉丝对象本身就包含粉丝数属性,完全不需要额外用selenium逐个请求粉丝主页,直接移除这部分逻辑就能减少90%的请求量,是性价比最高的优化。
- 新增随机请求间隔:在每两次接口请求之间插入2-5秒的随机延迟,模拟真人操作的非固定频率,避免被平台的反爬规则识别为机器请求。
- 配置指数退避重试:遇到限流报错时不要立刻重试,按照10秒、20秒、40秒的递增间隔重试,最多重试3次后跳过当前账号,避免持续触发封禁规则。
- 增加客户端伪装:给instaloader配置真实浏览器的User-Agent,避免被识别为爬虫客户端。
- 代理与账号轮换:如果需要高频次爬取,可以准备2-3个备用账号搭配代理IP池,每爬取20-30个账号就切换一次账号或IP,进一步降低被封禁的概率。
- 分批次爬取:如果你的粉丝量超过1000,建议拆分任务分天爬取,不要一次性拉取全量数据。
优化后代码(已移除冗余selenium逻辑,大幅降低限流概率)
""" 脚本功能:提取Instagram账号中粉丝数最高的关注者列表 优化点:移除冗余selenium请求,新增限流规避逻辑 """ import instaloader import time import random from rich.console import Console from rich.table import Table # 配置参数 MIN_DELAY = 2 # 最小请求间隔秒 MAX_DELAY = 4 # 最大请求间隔秒 MAX_RETRY = 3 # 单账号最大重试次数 # 替换为你自己的浏览器UA,可通过浏览器访问UA检测网站获取 USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36" console = Console() def get_top_followers(): # 初始化instaloader,配置自定义UA L = instaloader.Instaloader(user_agent=USER_AGENT) # 登录逻辑 while True: try: print("\n"+"*-=-*"*5) username = input("> 输入你的账号: ") password = input("> 输入你的密码: ") L.login(username, password) print("\n"+"-"*28+"\n> 登录成功!") print("> 请保持程序后台运行,直到出现FINISHED提示"+"\n"+"-"*28) break except Exception as e: print(f"\n"+"-"*28+f"\n> 登录失败:{str(e)}"+"\n"+"-"*28) # 获取当前账号的profile profile = instaloader.Profile.from_username(L.context, username) follower_data = {} # 遍历粉丝 for follower in profile.get_followers(): retry_count = 0 follower_count = 0 while retry_count < MAX_RETRY: try: # 直接从粉丝对象取粉丝数,无需额外请求 follower_count = follower.followers # 随机延迟 time.sleep(random.uniform(MIN_DELAY, MAX_DELAY)) break except Exception as e: retry_count += 1 wait_time = 10 * retry_count print(f"> 获取账号【{follower.username}】数据失败,第{retry_count}次重试,等待{wait_time}秒") time.sleep(wait_time) follower_data[follower.username] = follower_count # 按粉丝数倒序排序 sorted_data = dict(sorted(follower_data.items(), key=lambda x: x[1], reverse=True)) print("\n> FINISHED") # 输出结果 while True: try: print("\n"+"*-=-*"*10) n_input = int(input("> 你想查看前多少名粉丝的粉丝数?例如输入5查看Top5\n> ")) if n_input > len(sorted_data) or n_input < 1: print(f"\n"+"-"*28+f"\n> 输入无效,数字需在1到{len(sorted_data)}之间"+"\n"+"-"*28) continue break except: print("\n"+"-"*28+"\n> 输入无效,请输入有效数字"+"\n"+"-"*28) table = Table(show_header=True, header_style="bold magenta") table.add_column("粉丝账号", style="dim", width=20) table.add_column("粉丝的粉丝数") for idx, (user, cnt) in enumerate(sorted_data.items()): if idx >= n_input: break table.add_row(user, str(cnt)) console.print(table) if __name__ == "__main__": get_top_followers() exit(0)
内容的提问来源于stack exchange,提问作者mathewsjoyy
相关产品推荐
相关产品推荐

