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登录流、分步骤操作,同会话同 IPConnection: keep-alive + 复用 Session
C-HTTP:Proxy-Tunnel 固定 IPHTTP 目标,自定义控制 IPProxy-Tunnel 请求头
C-HTTPS:Proxy-Tunnel 固定 IPHTTPS 目标,自定义控制 IPCONNECT 阶段注入 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。

四种场景对比

场景出口 IPTCP 连接适用场景
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 验证代理链路,再排查代码配置。

需要企业代理方案?

我们可根据目标站点、并发规模与稳定性目标提供定制方案。