跳到正文

Python requests 轮换代理:IP 池或网关

两种轮换方式各适合什么场景,以及遇到账号错误不白白烧流量的重试代码。

IP 池还是网关:到底在选什么

IP 池就是你自己保管、自己轮换的一份代理清单:每一条是一个 IP,有各自的地址、端口和账号密码。每个请求用哪一条由你的代码决定,哪一条出了问题你也清楚。

网关则只有一个入口:所有请求都发往同一个地址,由服务端决定出口 IP。你不用维护清单,怎么轮换取决于生成代理时选的模式。

IP 池与网关:各适合什么

IP 池与网关:各适合什么
项目代码里的 IP 池网关入口
谁决定出口 IP你的代码,从列表里挑服务端,按生成时选的模式
常见产品静态 ISP,一条对应一个 IP,每单最多 100 个动态住宅,按 GB 计费
某个 IP 出问题时自己跳过,换列表里的下一条在会轮换的模式下,新连接通常拿到另一个 IP
多个请求用同一个 IP继续用同一条;租期内 IP 不轮换粘性模式,或一个 Session 保持一个连接
你要维护什么列表、续费和到期日一个入口;国家属于你生成的那条代理

来源:Proxy302 产品事实文件和下单页,2026-11-15。两种方式都不代表目标网站会怎样对待请求。

IP 池:轮流使用,失败就换下一个 IP 重试

# pip install requests
import itertools
import time
import requests

# One entry per static IP, copied from My assets (LOGIN:PASSWORD@HOST:PORT)
POOL = [
    "http://LOGIN1:PASSWORD1@HOST1:PORT1",
    "http://LOGIN2:PASSWORD2@HOST2:PORT2",
    "http://LOGIN3:PASSWORD3@HOST3:PORT3",
]
URL = "https://ipinfo.io/ip"
ring = itertools.cycle(POOL)  # round robin; random.choice(POOL) also works

def fetch(url, tries=3):
    last = None
    for attempt in range(tries):
        proxy = next(ring)  # a failed try moves on to the next IP in the pool
        try:
            r = requests.get(url, proxies={"http": proxy, "https": proxy}, timeout=(5, 20))
            if r.status_code not in (429, 502, 503, 504):
                return r
        except (requests.exceptions.ProxyError,
                requests.exceptions.Timeout,
                requests.exceptions.ConnectionError) as exc:
            last = exc
        time.sleep(0.5 * 2 ** attempt)  # 0.5 s, 1 s, 2 s
    raise RuntimeError("gave up after %d tries: %s" % (tries, last))

for _ in range(6):
    print(fetch(URL).text.strip())

仅为示例:把每个 IP 的 HOST、PORT、LOGIN、PASSWORD 从「我的资产」里填进去。密码里如果有 @、: 这类字符,放进 URL 前先用 urllib.parse.quote(password, safe='') 编码。

网关:想换 IP 就新开 Session,遇到 407 不重试

# pip install requests
import time
import requests

GATEWAY = "http://LOGIN:PASSWORD@HOST:PORT"  # one gateway entry from My assets
PROXIES = {"http": GATEWAY, "https": GATEWAY}
URL = "https://ipinfo.io/ip"

def fetch(url, tries=3):
    last = None
    for attempt in range(tries):
        # A new Session starts with an empty connection pool, so it opens a new connection.
        # In "new IP per connection" mode that is what gives you a new exit IP.
        with requests.Session() as s:
            try:
                r = s.get(url, proxies=PROXIES, timeout=(5, 20))
            except requests.exceptions.ProxyError as exc:
                if "407" in str(exc):
                    raise  # wrong login: a retry only repeats the refusal
                last = exc
            except (requests.exceptions.Timeout, requests.exceptions.ConnectionError) as exc:
                last = exc
            else:
                if r.status_code not in (429, 502, 503, 504):
                    return r
        time.sleep(0.5 * 2 ** attempt)
    raise RuntimeError("gave up after %d tries: %s" % (tries, last))

print([fetch(URL).text.strip() for _ in range(5)])

仅为示例。先生成「每个连接新 IP」模式的代理,再从「我的资产」复制 HOST、PORT、LOGIN、PASSWORD。动态住宅 HTTP 端口是 2222;SOCKS5 是 3333,URL 前缀改成 socks5h://(需 pip install "requests[socks]")。

Session、连接,以及 IP 为什么重复

Requests 文档说明:Session 使用 urllib3 连接池,同一主机的多个请求会复用同一个 TCP 连接。在按连接换 IP 的网关模式下,复用连接就是两次调用 IP 不变的原因。Session 之外的 requests.get() 每次都会临时建一个 Session,所以会新开连接。

还有一个坑:文档提醒,session.proxies 的值可能被环境变量里的代理覆盖。像示例那样在每次调用里直接传 proxies,就能保证用的是你指定的那个代理。

如果登录或多步流程需要同一个 IP,不要和连接较劲:用粘性模式或一个静态 IP,整个流程用同一个 Session。

哪些该重试,哪些不该

超时、连接被重置、429、502、503、504 值得重试。每次失败后等得更久:urllib3 的 Retry 把等待时间算成 backoff_factor * 2 ** (已重试次数),对 429 和 503 还会遵守 Retry-After。要限制重试次数。

407 不要重试:代理拒绝了你的登录,下一次得到的还是同一个答案。目标网站连续返回 429 时,也不要靠换更多 IP 去应付,应该放慢请求,因为限制针对的是请求频率。只重试重复发送也安全的请求,urllib3 默认就只重试幂等方法。

想用库自带的方式,可以像 Requests 文档那样,把 Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 502, 503, 504]) 挂到 HTTPAdapter 上。如果还想在两次尝试之间换 IP,手写循环更方便。

用 Proxy302 搭起来

  1. 第 1 步:选模型

    用网关:打开动态住宅页,选出口模式:互不相关的页面选「指定地区 / 每个连接新 IP」,一个完整流程选粘性。用 IP 池:打开静态 ISP 页,把数量设成你想放进列表的 IP 个数。

  2. 第 2 步:协议并生成

    协议保持 HTTP(端口 2222)或选 SOCKS5(端口 3333),点「确认费用并生成」。静态 IP 的协议在购买时就固定,每个 IP 一种。

  3. 第 3 步:复制信息

    到「我的资产」复制 HOST、PORT、USERNAME 和 PASSWORD,填进上面的代码。

  4. 第 4 步:运行并看输出

    运行脚本。IP 池应能看到各条依次出现;网关在按连接换 IP 的模式下,打印的五个 IP 应该逐次变化。

    预期结果 ipinfo.io 返回的一串出口 IP。

常见问题排查

网关每次返回的都是同一个 IP

检查 是不是复用了同一个 Session,或者代理生成时选了粘性模式?

处理 每个请求新开一个 Session;或重新生成一个「每个连接新 IP」的代理,已生成的代理不会随模式切换而改变。

停止条件 新 Session 还是同一个 IP,就用 curl -x 单独测,区分是代码问题还是代理问题。

ProxyError,信息里有 407

检查 LOGIN 和 PASSWORD 是否完整复制,特殊字符有没有编码?

处理 从「我的资产」重新复制,密码用 urllib.parse.quote 编码;不要放进循环里反复重试。

停止条件 确认复制无误还是失败,带订单号提交工单。

每个请求都超时

检查 HOST、PORT 和协议对不对(网关 HTTP 是 2222,SOCKS5 是 3333)?

处理 改正端口或协议,连接超时设短一点,再加上面的退避循环。

停止条件 池里某一条反复超时:先跳过它,到「我的资产」查看它的到期日。

目标网站连续返回 429

检查 你每秒发多少请求?

处理 降低频率并加停顿;Retry 对 429 会遵守 Retry-After。

停止条件 请求频率过高,加 IP 解决不了。

价格与限制

动态住宅按 GB 计费:低价线路 US$1.50/GB(100 GB 套餐 US$1.35/GB),优质线路 US$5.00/GB。静态 ISP 一个 IP 一天 US$0.50、30 天 US$7.99,折合约 US$0.27 一天(7.99 ÷ 30)。没有免费试用,最小购买量是 1 GB 或一个 IP 一天。

常见问题

Python requests 怎么轮换代理?

要么自己维护一份代理列表,在代码里为每个请求挑一个;要么把请求发到一个选了「每个连接新 IP」模式的网关,并为每个请求新开一个 Session。

为什么我的 requests.Session 一直是同一个 IP?

Session 会复用到同一主机的 TCP 连接,而按连接换 IP 的网关只在新连接建立时才换。每个请求新开一个 Session,或使用生成时选了按连接模式的代理。

遇到 407 要不要重试?

不要。407 表示代理拒绝了登录,重试得到的是同一个答案。先改正 LOGIN 和 PASSWORD。

重试之间等多久合适?

每次失败后把停顿拉长。urllib3 的 Retry 按 backoff_factor * 2 ** (已重试次数)秒计算,backoff_factor 取 0.5 时依次等 0.5 秒、1 秒、2 秒。

用 SOCKS5 需要装 requests[socks] 吗?

需要。用 pip install "requests[socks]" 安装,并使用 socks5h:// 开头的 URL,让代理端解析域名。

参考资料

4
  1. Requests:高级用法

    官方文档 · 确认日期:

    2026-11-15 阅读:Session 用 urllib3 连接池,同一主机的请求复用 TCP 连接;proxies 参数的写法,以及 session.proxies 可能被环境变量里的代理覆盖;账号密码写成 http://user:pass@host 形式;socks5h 在代理端解析域名;不设置就没有超时;重试用 urllib3 的 Retry 挂到 HTTPAdapter。

  2. urllib3:Retry

    官方文档 · 确认日期:

    2026-11-15 阅读:Retry 有 total、backoff_factor 和 status_forcelist;等待时间为 backoff_factor * 2 ** (已重试次数);默认只重试幂等方法;对 413、429、503 会遵守 Retry-After 响应头。

  3. Proxy302 动态住宅下单页

    产品观察 · 确认日期:

    2026-11-15 查看「出口模式」字段:全球轮换、指定地区 / 粘性 IP、指定地区 / 每个连接新 IP;表单默认停在粘性选项;换 IP 的单位是连接,不是请求。

  4. Proxy302 产品事实与价目表

    产品观察 · 确认日期:

    站点产品事实文件,2026-11-15 核对:动态住宅低价线路 US$1.50/GB(100 GB 套餐 US$1.35/GB)、优质线路 US$5.00/GB;静态 ISP 单 IP 1 天 US$0.50、30 天 US$7.99;网关端口 HTTP 2222、SOCKS5 3333;静态 IP 每单 1 到 100 个;没有免费试用。

准备好试试了吗?

注册账号、充值一次,就能选动态住宅、静态 ISP 或数据中心 IP,几分钟配进你的浏览器。