You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 20:09:03