requests配隧道代理需将代理地址设为http://host:port(不含认证),再手动构造Proxy-Authorization头(Basic+base64编码的user:pass);务必用Session管理连接,每次请求显式更新headers,控制并发、添加随机延时,并模拟真实用户行为。

requests 里怎么配隧道代理
隧道代理不是直接填个 http://user:pass@host:port 就能用的,多数商用隧道(比如芝麻、站大爷)要求你把认证信息塞进 Proxy-Authorization 请求头,而不是 URL 里。否则会返回 407 Proxy Authentication Required 或直接超时。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
requests.Session()管理连接,避免每次新建连接触发隧道重拨 - 代理地址写成
http://tunnel.example.com:port(不带账号密码) - 手动构造
Proxy-Authorization头:用base64.b64encode(b"user:pass").decode()生成值,拼成"Basic xxx" - 别漏掉
http://前缀,https://代理地址在 requests 里基本不生效
import requests
import base64
auth = base64.b64encode(b"myuser:mypass").decode()
proxies = {"http": "http://tunnel.example.com:8080", "https": "http://tunnel.example.com:8080"}
headers = {"Proxy-Authorization": f"Basic {auth}"}
r = requests.get("https://httpbin.org/ip", proxies=proxies, headers=headers)
User-Agent 和 Referer 轮换为什么总失效
不是轮得不够勤,而是轮换逻辑和请求生命周期没对齐。requests 默认复用 TCP 连接,如果 Session 没关、又没强制更新 headers,下一次请求可能沿用上一次的 User-Agent,尤其在重试或重定向后更隐蔽。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 每次发请求前,显式覆盖
headers字典,不要依赖 Session 的默认 headers -
Referer必须和目标页面真实来源一致——比如爬商品页,Referer应该是对应搜索列表页的 URL,乱填https://baidu.com反而触发风控 - 从公开 UA 池(如
fake-useragent)取值时,注意避开明显测试特征的 UA,比如含HeadlessChrome或python-requests - 别只轮换 UA,配合
Accept-Language、Accept-Encoding一起变,否则单点突兀
为什么加了代理还被封 IP
根本原因:隧道代理分配的出口 IP 已被大量滥用,你拿到的不是“新 IP”,而是“热 IP”。服务商不会告诉你这个 IP 刚被 200 个爬虫用过,但目标站一看请求频次+行为模式就直接拦截。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 优先选支持「地域+运营商」指定的隧道(如指定广东移动),避开全国混用的共享池
- 控制单 IP 并发数 ≤1,哪怕隧道宣称支持 5 并发——高并发等于告诉对方“我在扫”
- 加随机延时(
time.sleep(random.uniform(1.5, 4.5))),但别用固定值,固定间隔比无延时更容易被识别 - 别依赖
X-Forwarded-For伪造源 IP,现代 WAF 直接忽略该头,且可能记为异常信号
requests + tunnel 遇到 ConnectionResetError 怎么办
典型现象:跑十几二十次后突然报 ConnectionResetError: [WinError 10054](Windows)或 Connection reset by peer(Linux)。这不是代码错,是隧道主动断开了“可疑连接”——比如你连续请求同一个接口路径、响应体大小高度一致、TLS 指纹太干净。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 捕获
requests.exceptions.ConnectionError,遇到就换 Session 实例(重置连接池),别 retry 原 session - 对关键请求加
verify=False有时反而更稳——某些隧道中间件会篡改证书链,严格校验证书导致握手失败 - 禁用 HTTP/2:
pip install httpx[http2]不要用,requests 当前不原生支持 h2,强行启用底层库容易触发隧道协议不兼容 - 检查是否开了
stream=True却没读完响应体,未消费完的 stream 会让连接卡在 pending 状态,隧道侧视为异常连接
真正难的不是换 IP 或换头,是让每一次请求看起来像一个真实、犹豫、有上下文的人类操作。IP 和 UA 都只是表皮,行为节奏、路径跳转、响应处理方式才是风控盯死的地方。


















