跳到正文

Python 动态代理换 IP:requests/httpx

为什么 Session 一直是同一个 IP,怎样拿到新 IP,怎样在一个短任务里保持同一个 IP。

为什么 Session 一直是同一个 IP

动态机房代理的出口 IP 在建立连接时决定。如果代码把连接保持着反复用,IP 就不会变。

Requests 文档写明:Session 使用 urllib3 连接池,同一主机的多次请求会复用底层 TCP 连接。HTTPX 对 Client 的说法一样,而它的顶层函数(如 httpx.get)每个请求都新建连接。IP 什么时候换,就取决于这一点。

按目的选写法

按目的选写法
项目requestshttpx
每个请求换 IP每个请求新建 Session(或直接 requests.get)每个请求新建 Client(或直接 httpx.get)
几个请求用同一个 IP同一个 Session,或粘性模式的代理同一个 Client,或粘性模式的代理
SOCKS5pip install "requests[socks]",用 socks5h://pip install "httpx[socks]",用 socks5://
默认超时没有,要自己设网络无响应 5 秒

来源:Requests 与 HTTPX 官方文档,2026-11-12 阅读。requests.get() 每次调用都会临时建一个 Session。

Python requests:每次新连接 与 同一个 Session

# pip install requests
import requests

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

def ip_on_new_connection():
    # A fresh Session has an empty connection pool, so it opens a new connection.
    with requests.Session() as s:
        return s.get(URL, proxies=PROXIES, timeout=(5, 20)).text.strip()

print("new connection each time:", [ip_on_new_connection() for _ in range(5)])

with requests.Session() as s:
    print("one Session:", [s.get(URL, proxies=PROXIES, timeout=(5, 20)).text.strip() for _ in range(5)])

仅为示例:把 HOST、PORT、LOGIN、PASSWORD 换成“我的资产”里的值。轮换模式下首个列表应逐次变化;第二个列表通常重复,因为 Session 复用了同一条连接。

Python httpx:新 Client 与同一个 Client

# pip install httpx
import httpx

PROXY = "http://LOGIN:PASSWORD@HOST:PORT"   # from My assets
URL = "https://ipinfo.io/ip"
TIMEOUT = httpx.Timeout(20.0, connect=10.0)

def ip_on_new_connection():
    # A new Client has its own empty connection pool.
    with httpx.Client(proxy=PROXY, timeout=TIMEOUT) as client:
        return client.get(URL).text.strip()

print("new connection each time:", [ip_on_new_connection() for _ in range(5)])

with httpx.Client(proxy=PROXY, timeout=TIMEOUT) as client:
    print("one Client:", [client.get(URL).text.strip() for _ in range(5)])

仅为示例,逻辑同上:新 Client 开新连接,同一个 Client 复用连接。

短任务里保持同一个 IP

有的服务商把会话写进用户名。Proxy302 是在生成代理时选:在动态机房页选“保持同一个 IP 约 10 分钟”,而不是“每个新连接换 IP”。这样 IP 会保持约 10 分钟,之后或空闲约 60 秒后换新。

登录、多页流程、必须同一地址的下载,用粘性模式。已经生成的代理不会随模式切换而改变,需要另一种行为就再生成一个。

requests 与 httpx 使用 SOCKS5

# pip install "requests[socks]" "httpx[socks]"
import requests, httpx

PROXY = "socks5h://LOGIN:PASSWORD@HOST:PORT"      # requests: socks5h resolves names on the proxy
print(requests.get("https://ipinfo.io/ip", proxies={"http": PROXY, "https": PROXY}, timeout=(5, 20)).text)

PROXY_HTTPX = "socks5://LOGIN:PASSWORD@HOST:PORT"  # httpx accepts a socks5:// URL
with httpx.Client(proxy=PROXY_HTTPX, timeout=20.0) as client:
    print(client.get("https://ipinfo.io/ip").text)

仅为示例。先把代理生成为 SOCKS5,每个 IP 资产只有一种协议。requests 里 socks5 在本机解析域名,socks5h 在代理端解析。

重试和超时

import time
import httpx
import requests
from requests.adapters import HTTPAdapter
from urllib3.util import Retry

# requests: retry on a Session, as in the Requests documentation
s = requests.Session()
retries = Retry(total=3, backoff_factor=0.5, status_forcelist=[429, 502, 503, 504])
s.mount("https://", HTTPAdapter(max_retries=retries))

# httpx: a plain retry loop with a growing pause
def get_with_retry(client, url, tries=3):
    for n in range(tries):
        try:
            r = client.get(url)
            if r.status_code not in (429, 502, 503, 504):
                return r
        except httpx.TransportError:
            pass
        time.sleep(2 ** n)
    raise RuntimeError("gave up after %d tries" % tries)

仅为示例。只重试可以安全重复的请求,两次之间要停一下。轮换代理上的重试可能从另一个 IP 出去。

生成并测试代理

  1. 第 1 步:打开动态机房页

    出口只有美国。选模式(每个新连接换 IP,或同一 IP 约 10 分钟)和协议 HTTP / SOCKS5。

  2. 第 2 步:生成并复制

    按流量从钱包扣费,US$0.40/GB,没有流量包。在“我的资产”里复制地址、端口、账号、密码。

  3. 第 3 步:跑示例

    把信息填进 requests 或 httpx 示例并运行。

    预期结果 轮换模式下,“新连接”那一行会出现不同的美国 IP;“同一个 Session”那一行可能重复同一个。

机房 IP 适合做什么

这条线路只有美国出口,网站能识别出这些地址是机房地址。适合遵守目标网站条款的数据采集、监控和接口调用。注册账号、开店、投放广告这类账号任务,请改用住宅或静态 ISP IP。

排查

每次都是同一个 IP

检查 你用的是同一个 Session / Client,还是生成代理时选了粘性模式?

处理 每个请求新开 Session / Client,或重新生成“每个新连接换 IP”的代理。

停止条件 新 Client 仍是同一个 IP,就用 curl -x 单独测一下,分清是代码还是代理的问题。

超时报错

检查 看是连接超时还是读取超时,以及目标网站本身的速度。

处理 把读取超时适当调大,连接超时保持较短,并加上带间隔的重试。

停止条件 代理一直连不上:回“我的资产”核对地址、端口、账号、密码。

SOCKS 报缺少依赖之类的错

检查 确认装了 requests[socks] 或 httpx[socks],且代理是按 SOCKS5 生成的。

处理 安装对应的额外依赖、用对 URL 协议头,或改用 HTTP 代理。

常见问题

Python 里怎么让动态代理每个请求都换 IP?

每次都用新连接:每个请求新建 requests.Session 或 httpx.Client,或直接用 requests.get / httpx.get(不复用连接池)。在循环里用同一个 Session 或 Client,会复用连接、IP 不变。

为什么我的 Session 返回的 IP 总是一样?

因为 Session 复用了到同一主机的 TCP 连接。每个请求新建 Session,或用“每个新连接换 IP”的代理并让每次调用用新连接。

能让一个 IP 保持几分钟吗?

可以。生成代理时选“保持同一个 IP 约 10 分钟”,约 10 分钟后或空闲约 60 秒后会换。

这个代理在 Python 里能用 SOCKS5 吗?

能,前提是生成时选了 SOCKS5。安装 requests[socks] 或 httpx[socks],用 socks5:// 或 socks5h:// 地址。

多少钱?

钱包按流量扣,US$0.40/GB,没有流量包,没有免费试用。

参考资料

5
  1. Proxy302 产品事实与价格表

    产品观察 · 确认日期:

    站内产品事实表,2026-11-12 核对:动态机房线路只有美国出口,钱包按 GB 扣费 US$0.40/GB,支持 HTTP 或 SOCKS5,默认每个新连接换 IP,或同一 IP 保持约 10 分钟(超过约 10 分钟或空闲约 60 秒会换),无免费试用。

  2. Requests:高级用法

    官方文档 · 确认日期:

    2026-11-12 阅读:Session 用 urllib3 连接池,同一主机的请求复用 TCP 连接;SOCKS 需安装 requests[socks];socks5 在本机解析域名、socks5h 在代理端解析;不设置就没有超时;重试用 urllib3 的 Retry 挂到 HTTPAdapter。

  3. HTTPX:代理

    官方文档 · 确认日期:

    2026-11-12 阅读:proxy 参数可用于 Client 和顶层函数;账号密码写在 URL 里;SOCKS 需安装 httpx[socks] 并用 socks5:// 地址。

  4. HTTPX:Client

    官方文档 · 确认日期:

    2026-11-12 阅读:顶层 API 每个请求都新建连接;Client 使用连接池,可以复用同一条 TCP 连接。

  5. HTTPX:超时

    官方文档 · 确认日期:

    2026-11-12 阅读:默认网络无响应 5 秒后抛出 TimeoutException;有 connect、read、write、pool 四种超时;写法 httpx.Timeout(10.0, connect=60.0)。

准备好试试了吗?

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