网关每次返回的都是同一个 IP
检查 是不是复用了同一个 Session,或者代理生成时选了粘性模式?
处理 每个请求新开一个 Session;或重新生成一个「每个连接新 IP」的代理,已生成的代理不会随模式切换而改变。
停止条件 新 Session 还是同一个 IP,就用 curl -x 单独测,区分是代码问题还是代理问题。
两种轮换方式各适合什么场景,以及遇到账号错误不白白烧流量的重试代码。
IP 池就是你自己保管、自己轮换的一份代理清单:每一条是一个 IP,有各自的地址、端口和账号密码。每个请求用哪一条由你的代码决定,哪一条出了问题你也清楚。
网关则只有一个入口:所有请求都发往同一个地址,由服务端决定出口 IP。你不用维护清单,怎么轮换取决于生成代理时选的模式。
| 项目 | 代码里的 IP 池 | 网关入口 |
|---|---|---|
| 谁决定出口 IP | 你的代码,从列表里挑 | 服务端,按生成时选的模式 |
| 常见产品 | 静态 ISP,一条对应一个 IP,每单最多 100 个 | 动态住宅,按 GB 计费 |
| 某个 IP 出问题时 | 自己跳过,换列表里的下一条 | 在会轮换的模式下,新连接通常拿到另一个 IP |
| 多个请求用同一个 IP | 继续用同一条;租期内 IP 不轮换 | 粘性模式,或一个 Session 保持一个连接 |
| 你要维护什么 | 列表、续费和到期日 | 一个入口;国家属于你生成的那条代理 |
来源:Proxy302 产品事实文件和下单页,2026-11-15。两种方式都不代表目标网站会怎样对待请求。
# 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='') 编码。
# 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]")。
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,手写循环更方便。
用网关:打开动态住宅页,选出口模式:互不相关的页面选「指定地区 / 每个连接新 IP」,一个完整流程选粘性。用 IP 池:打开静态 ISP 页,把数量设成你想放进列表的 IP 个数。
协议保持 HTTP(端口 2222)或选 SOCKS5(端口 3333),点「确认费用并生成」。静态 IP 的协议在购买时就固定,每个 IP 一种。
到「我的资产」复制 HOST、PORT、USERNAME 和 PASSWORD,填进上面的代码。
运行脚本。IP 池应能看到各条依次出现;网关在按连接换 IP 的模式下,打印的五个 IP 应该逐次变化。
预期结果 ipinfo.io 返回的一串出口 IP。
检查 是不是复用了同一个 Session,或者代理生成时选了粘性模式?
处理 每个请求新开一个 Session;或重新生成一个「每个连接新 IP」的代理,已生成的代理不会随模式切换而改变。
停止条件 新 Session 还是同一个 IP,就用 curl -x 单独测,区分是代码问题还是代理问题。
检查 LOGIN 和 PASSWORD 是否完整复制,特殊字符有没有编码?
处理 从「我的资产」重新复制,密码用 urllib.parse.quote 编码;不要放进循环里反复重试。
停止条件 确认复制无误还是失败,带订单号提交工单。
检查 HOST、PORT 和协议对不对(网关 HTTP 是 2222,SOCKS5 是 3333)?
处理 改正端口或协议,连接超时设短一点,再加上面的退避循环。
停止条件 池里某一条反复超时:先跳过它,到「我的资产」查看它的到期日。
检查 你每秒发多少请求?
处理 降低频率并加停顿;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 一天。
要么自己维护一份代理列表,在代码里为每个请求挑一个;要么把请求发到一个选了「每个连接新 IP」模式的网关,并为每个请求新开一个 Session。
Session 会复用到同一主机的 TCP 连接,而按连接换 IP 的网关只在新连接建立时才换。每个请求新开一个 Session,或使用生成时选了按连接模式的代理。
不要。407 表示代理拒绝了登录,重试得到的是同一个答案。先改正 LOGIN 和 PASSWORD。
每次失败后把停顿拉长。urllib3 的 Retry 按 backoff_factor * 2 ** (已重试次数)秒计算,backoff_factor 取 0.5 时依次等 0.5 秒、1 秒、2 秒。
需要。用 pip install "requests[socks]" 安装,并使用 socks5h:// 开头的 URL,让代理端解析域名。
官方文档 · 确认日期:
2026-11-15 阅读:Session 用 urllib3 连接池,同一主机的请求复用 TCP 连接;proxies 参数的写法,以及 session.proxies 可能被环境变量里的代理覆盖;账号密码写成 http://user:pass@host 形式;socks5h 在代理端解析域名;不设置就没有超时;重试用 urllib3 的 Retry 挂到 HTTPAdapter。
官方文档 · 确认日期:
2026-11-15 阅读:Retry 有 total、backoff_factor 和 status_forcelist;等待时间为 backoff_factor * 2 ** (已重试次数);默认只重试幂等方法;对 413、429、503 会遵守 Retry-After 响应头。
产品观察 · 确认日期:
2026-11-15 查看「出口模式」字段:全球轮换、指定地区 / 粘性 IP、指定地区 / 每个连接新 IP;表单默认停在粘性选项;换 IP 的单位是连接,不是请求。
产品观察 · 确认日期:
站点产品事实文件,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,几分钟配进你的浏览器。