Python requests 隧道代理:爬虫代理四种 IP 控制场景
requests 实现强制切换 IP、Keep-Alive 保持 IP、Proxy-Tunnel 固定 IP(HTTP/HTTPS)四种代理使用模式。
亿牛云技术团队2026年5月15日3 分钟阅读
爬虫代理的四种 IP 控制场景
亿牛云爬虫代理(隧道代理)提供四种 IP 使用模式,覆盖从"每个请求换 IP"到"固定 IP 长期复用"的全部需求。
| 场景 | 用途 | 实现方式 |
|---|---|---|
| A:强制切换 IP | 大批量匿名采集,每个请求不同出口 | Connection: close + 每次新建连接 |
| B:保持相同 IP | 登录流、分步骤操作,同会话同 IP | Connection: keep-alive + 复用 Session |
| C-HTTP:Proxy-Tunnel 固定 IP | HTTP 目标,自定义控制 IP | Proxy-Tunnel 请求头 |
| C-HTTPS:Proxy-Tunnel 固定 IP | HTTPS 目标,自定义控制 IP | CONNECT 阶段注入 Proxy-Tunnel 头 |
环境准备
export PROXY_HOST=t.16yun.cn
export PROXY_PORT=31111
export PROXY_USERNAME=your-username
export PROXY_PASSWORD=your-password
export TARGET_URL=https://httpbin.org/ip
验证代理链路
curl -x http://$PROXY_USERNAME:$PROXY_PASSWORD@$PROXY_HOST:$PROXY_PORT https://httpbin.org/ip
场景 A:强制切换 IP
每次请求强制断开 TCP 连接,代理自动分配新出口 IP。适合大批量页面采集。
import os
import requests
host = os.getenv("PROXY_HOST", "t.16yun.cn")
port = os.getenv("PROXY_PORT", "31111")
user = os.getenv("PROXY_USERNAME", "user")
pwd = os.getenv("PROXY_PASSWORD", "password")
proxies = {
"http": f"http://{user}:{pwd}@{host}:{port}",
"https": f"http://{user}:{pwd}@{host}:{port}",
}
headers = {
"Connection": "close",
"Proxy-Connection": "close",
}
for i in range(1, 4):
resp = requests.get(
"https://httpbin.org/ip",
proxies=proxies,
headers=headers,
timeout=15,
)
print(f"请求 {i}: {resp.json()['origin']}")
每次请求创建新连接,Connection: close 确保 TCP 不复用,出口 IP 各不相同。
场景 B:Keep-Alive 保持相同 IP
复用同一个 requests.Session,在代理有效期内保持相同出口 IP。适合需要连续操作的登录流程。
import os
import requests
host = os.getenv("PROXY_HOST", "t.16yun.cn")
port = os.getenv("PROXY_PORT", "31111")
user = os.getenv("PROXY_USERNAME", "user")
pwd = os.getenv("PROXY_PASSWORD", "password")
proxies = {
"http": f"http://{user}:{pwd}@{host}:{port}",
"https": f"http://{user}:{pwd}@{host}:{port}",
}
session = requests.Session()
headers = {"Connection": "keep-alive", "Proxy-Connection": "keep-alive"}
for i in range(1, 4):
resp = session.get(
"https://httpbin.org/ip",
proxies=proxies,
headers=headers,
timeout=15,
)
print(f"请求 {i}: {resp.json()['origin']}")
session.close()
三次请求的 IP 应该相同——因为它们在同一个 TCP 会话中完成。
场景 C-HTTP:Proxy-Tunnel 固定 IP(HTTP 目标)
在请求头中添加 Proxy-Tunnel,相同值在代理有效期内分配相同出口 IP,不同值则分配不同 IP。
import os
import random
import requests
tunnel_value = os.getenv("PROXY_TUNNEL") or str(random.randint(1, 10000))
print(f"Proxy-Tunnel: {tunnel_value}")
session = requests.Session()
headers = {"Proxy-Tunnel": tunnel_value, "Connection": "keep-alive"}
for i in range(1, 4):
resp = session.get(
"http://httpbin.org/ip",
proxies=proxies,
headers=headers,
timeout=15,
)
print(f"请求 {i}: {resp.json()['origin']} (Proxy-Tunnel)")
Proxy-Tunnel 对 HTTP 目标直接在请求头发送即可。对 HTTPS 目标,需要在 CONNECT 阶段携带该头——见场景 C-HTTPS。
场景 C-HTTPS:Proxy-Tunnel 固定 IP(HTTPS 目标)
requests 默认不在 CONNECT 阶段携带自定义头。需要自定义 HTTPAdapter 重写 proxy_headers() 方法:
import os
import random
import requests
from requests.adapters import HTTPAdapter
tunnel_value = os.getenv("PROXY_TUNNEL") or str(random.randint(1, 10000))
class TunnelAdapter(HTTPAdapter):
def __init__(self, tunnel_value=None, *args, **kwargs):
self.tunnel_value = tunnel_value
super().__init__(*args, **kwargs)
def proxy_headers(self, proxy):
headers = super().proxy_headers(proxy)
if self.tunnel_value:
headers["Proxy-Tunnel"] = self.tunnel_value
return headers
session = requests.Session()
adapter = TunnelAdapter(tunnel_value=tunnel_value)
session.mount("https://", adapter)
for i in range(1, 4):
resp = session.get(
"https://httpbin.org/ip",
proxies=proxies,
timeout=15,
)
print(f"请求 {i}: {resp.json()['origin']} (HTTPS Proxy-Tunnel)")
proxy_headers() 返回的头会在 HTTPS CONNECT 握手阶段发送给代理服务器,代理据此分配固定 IP。
四种场景对比
| 场景 | 出口 IP | TCP 连接 | 适用场景 |
|---|---|---|---|
| A:强制切换 | 每次不同 | 每次新建 | 大批量匿名采集 |
| B:Keep-Alive | 保持相同 | 复用连接 | 登录、分步操作 |
| C-HTTP:Proxy-Tunnel | 按值固定 | 可复用 | HTTP API 调用 |
| C-HTTPS:Proxy-Tunnel | 按值固定 | CONNECT 注入 | HTTPS API 调用 |
错误排查
参照亿牛云帮助文档中的错误码说明:
| 状态码 | 原因 | 解决 |
|---|---|---|
| 407 | 代理认证失败 | 核对 PROXY_USERNAME / PROXY_PASSWORD |
| 429 | 请求频率超限 | 降低并发,增加间隔 |
| 504 | 目标站超时 | 重试 2-3 次,跳过持续失败页面 |
先用 curl 验证代理链路,再排查代码配置。
需要企业代理方案?
我们可根据目标站点、并发规模与稳定性目标提供定制方案。