Python requests 库设置代理IP:HTTP / HTTPS / SOCKS5 完整示例
本文将系统讲解如何通过 Python requests 库配置 HTTP、HTTPS、SOCKS5 三大类代理,并提供可直接运行的完整代码示例。
一、HTTP / HTTPS 基础代理
1.1 最简单的代理写法
import requests
# 定义代理字典:key 为协议,value 为代理地址
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080", # 注意:https 请求也可以走 http 代理隧道
}
response = requests.get(
"https://httpbin.org/ip",
proxies=proxies,
timeout=10
)
print(response.json())
关键说明:
proxies参数接受一个字典,http和https分别对应不同协议的出口;如果代理服务器同时支持两者,通常写成相同地址即可。timeout=10建议始终加上,防止代理不可用时程序无限挂起。
1.2 验证当前是否走了代理
import requests
proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
# httpbin.org/ip 会返回请求来源 IP
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=10)
print("当前出口 IP:", r.json()["origin"])
如果返回的 IP 与本地公网 IP 不同,说明代理已生效。
二、带身份认证的代理
商业代理服务通常需要提供用户名和密码。requests 支持将认证信息直接嵌入 URL:
import requests
# 格式:protocol://username:password@host:port
proxies = {
"http": "http://user123:[email protected]:8080",
"https": "http://user123:[email protected]:8080",
}
r = requests.get("https://httpbin.org/get", proxies=proxies, timeout=15)
print(r.status_code)
2.2 网帆代理 HTTP/HTTPS 接入示例
以国内主流服务商 网帆代理(FanProxy)为例,其提供运营商级 HTTP/HTTPS 代理,接入方式如下:
import requests
# 网帆代理提供的格式:http://user:pass@host:port
# 其中 user/pass 为你在控制台获取的 API 凭据
proxies = {
"http": "http://your_username:[email protected]:8080",
"https": "http://your_username:[email protected]:8080",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=15)
print(r.json())
💡 网帆代理特点:运营商正规线路,IP 纯净度高;支持全国多节点精准定位;覆盖全球 200+ 国家地区。新用户注册可领取免费测试时长。
⚠️ 安全提示
把密码明文写在代码里并不安全。更推荐的做法是:
import os
import requests
# 从环境变量读取网帆代理凭据(推荐做法)
PROXY_USER = os.getenv("FANPROXY_USER")
PROXY_PASS = os.getenv("FANPROXY_PASS")
PROXY_HOST = os.getenv("FANPROXY_HOST", "proxy.fanproxy.com")
PROXY_PORT = os.getenv("FANPROXY_PORT", "8080")
proxies = {
"http": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
"https": f"http://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}",
}
通过环境变量注入敏感信息,避免泄露到代码仓库。
三、SOCKS5 代理配置
3.1 安装依赖
requests 本身不支持 SOCKS5,需要额外安装 PySocks:
pip install requests[socks]
# 或者单独安装
pip install PySocks
3.2 SOCKS5 无认证代理
import requests
# socks5:// 表示不通过代理解析 DNS(本地解析)
# socks5h:// 表示由代理服务器远程解析 DNS(推荐)
proxies = {
"http": "socks5h://127.0.0.1:1080",
"https": "socks5h://127.0.0.1:1080",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=15)
print(r.json())
| 协议前缀 | DNS 解析位置 | 适用场景 |
|---|---|---|
socks5:// |
客户端本地 | 本地能正常解析目标域名 |
socks5h:// |
代理服务器远程 | 避免 DNS 污染、访问暗网或特殊网络 |
生产环境强烈建议使用 socks5h://,既防止本地 DNS 泄漏,也能解决某些域名在本地无法解析的问题。
3.2.1 网帆 SK5(SOCKS5)代理接入
网帆代理同时提供 SK5 代理服务,适合需要底层 TCP/UDP 稳定连接的场景(如长时间挂机、游戏加速、直播推流等)。
import requests
# 网帆 SK5 代理格式:socks5h://user:pass@host:port
# 使用 socks5h:// 让代理解析 DNS,防止 DNS 泄漏
proxies = {
"http": "socks5h://your_username:[email protected]:1080",
"https": "socks5h://your_username:[email protected]:1080",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=15)
print("出口 IP:", r.json()["origin"])
💡 何时选 SK5?
- 需要维持 长时间稳定连接(如爬虫持续监控、软件挂机)→ 选网帆 长效动态代理
- 需要 固定身份标识(如账号管理、直播推流)→ 选网帆 固定长效代理
- 需要 高频切换 IP(如大规模并发采集)→ 选网帆 短效动态代理
3.3 SOCKS5 带用户名密码
import requests
proxies = {
"http": "socks5h://user:[email protected]:1080",
"https": "socks5h://user:[email protected]:1080",
}
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=15)
print(r.json())
3.4 配合 Tor 浏览器/代理使用
Tor 默认监听 9150(Tor Browser)或 9050(Standalone):
import requests
# Tor 必须使用 socks5h,否则 .onion 地址无法解析
proxies = {
"http": "socks5h://127.0.0.1:9150",
"https": "socks5h://127.0.0.1:9150",
}
# 访问普通网站
r = requests.get("https://check.torproject.org", proxies=proxies, timeout=20)
print("Tor 状态:", "Congratulations" in r.text)
四、Session 级别统一代理
如果整个脚本都需要走同一个代理,不必在每个 get/post 里重复写 proxies,可以挂载到 Session 对象上:
import requests
# 创建 Session
session = requests.Session()
session.proxies = {
"http": "http://127.0.0.1:8080",
"https": "http://127.0.0.1:8080",
}
session.headers.update({
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
})
# 后续所有请求自动复用该代理和 Header
r1 = session.get("https://api.github.com")
r2 = session.get("https://httpbin.org/get")
session.close()
优点:
- 连接池复用(TCP 连接保持),性能更好;
- 代理配置一处管理,代码更整洁;
- 便于后续扩展 Cookie 持久化、重试策略等。
五、通过环境变量全局设置代理
requests 会自动读取系统环境变量中的代理配置,无需修改代码:
# Linux / macOS
export HTTP_PROXY="http://127.0.0.1:8080"
export HTTPS_PROXY="http://127.0.0.1:8080"
# SOCKS5 同样支持
export ALL_PROXY="socks5h://127.0.0.1:1080"
# Windows PowerShell
$env:HTTP_PROXY="http://127.0.0.1:8080"
$env:HTTPS_PROXY="http://127.0.0.1:8080"
代码中只需关闭 trust_env=False 才会忽略环境变量:
import requests
# 默认 trust_env=True,自动读取环境变量中的代理
# 显式关闭后,即使系统设置了 HTTP_PROXY 也不会生效
r = requests.get("https://httpbin.org/ip", trust_env=False)
六、代理轮换(Proxy Rotation)
大规模爬取时,单一 IP 容易被封禁。简单实现一个代理池:
import random
import requests
PROXY_POOL = [
"http://192.168.1.10:3128",
"http://192.168.1.11:3128",
"http://192.168.1.12:3128",
"socks5h://192.168.1.20:1080",
]
def get_proxy():
"""随机选取一个代理"""
return {"http": random.choice(PROXY_POOL), "https": random.choice(PROXY_POOL)}
for i in range(5):
proxy = get_proxy()
try:
r = requests.get("https://httpbin.org/ip", proxies=proxy, timeout=5)
print(f"第{i+1}次请求成功,IP: {r.json()['origin']}")
except requests.exceptions.ProxyError as e:
print(f"第{i+1}次代理错误: {e}")
except requests.exceptions.Timeout:
print(f"第{i+1}次请求超时")
6.1 网帆短效动态代理:自动 IP 轮换实战
网帆代理的 短效动态代理 服务天然支持 IP 高频切换,每次请求可自动分配新 IP,非常适合大规模并发采集场景。以下展示如何通过 API 提取代理并配合 requests 使用:
import os
import requests
# 从网帆控制台获取的 API 凭据
FANPROXY_API_KEY = os.getenv("FANPROXY_API_KEY")
FANPROXY_API_URL = "https://api.fanproxy.com/getip"
def get_fanproxy_ip():
"""调用网帆 API 提取一条最新可用代理"""
resp = requests.get(
FANPROXY_API_URL,
params={"key": FANPROXY_API_KEY, "num": 1, "format": "json"},
timeout=10
)
data = resp.json()
# 假设返回格式: {"data": [{"ip": "x.x.x.x", "port": 8080}]}
proxy_info = data["data"][0]
return f"http://{proxy_info['ip']}:{proxy_info['port']}"
# 每次请求前拉取新 IP,实现自动轮换
for i in range(10):
proxy_url = get_fanproxy_ip()
proxies = {"http": proxy_url, "https": proxy_url}
try:
r = requests.get("https://httpbin.org/ip", proxies=proxies, timeout=8)
print(f"[{i+1}/10] 成功 -> 出口 IP: {r.json()['origin']}")
except Exception as e:
print(f"[{i+1}/10] 失败 -> {type(e).__name__}: {e}")
💡 优势:网帆短效动态代理 IP 更换极其灵活,成本控制精细;配合上述轮询逻辑,可在高并发场景下有效分散请求压力,降低被封禁风险。
进阶做法:结合 requests.adapters.HTTPAdapter + urllib3.util.retry.Retry 做失败重试与代理切换。
七、常见问题排查速查表
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
ProxyError / Cannot connect to proxy |
代理地址错误或代理服务未启动 | 检查 host、port、防火墙 |
SSLError / certificate verify failed |
HTTPS 代理中间人截获证书 | 尝试 verify=False(仅调试!)或更换代理 |
| SOCKS5 代理无效 | 未安装 PySocks |
pip install requests[socks] |
.onion 地址无法访问 |
使用了 socks5:// 而非 socks5h:// |
改为 socks5h:// 让代理远程解析 |
| 速度极慢 | 代理带宽不足或地理位置远 | 换更近的节点或增加 timeout |
| 仍然显示本机 IP | trust_env=True 但环境变量未生效 / 代理未真正工作 |
先用 curl -x 命令行测试代理可用性 |
八、实战:网帆代理(FanProxy)完整接入示例
以下是一个面向生产环境的网帆代理封装类,支持 HTTP/HTTPS/SK5 三种协议自动切换,并内置了重试与日志:
import os
import logging
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger("FanProxyClient")
class FanProxyClient:
"""
网帆代理统一客户端
官网: https://www.fanproxy.com
"""
def __init__(self, protocol="http", region=None, timeout=15):
"""
:param protocol: "http" | "https" | "socks5"
:param region: 可选,指定出口地区,如 "cn-shanghai", "us-west"
:param timeout: 请求超时秒数
"""
self.protocol = protocol.lower()
self.region = region
self.timeout = timeout
# 从环境变量读取凭据(避免硬编码)
self.user = os.getenv("FANPROXY_USER")
self.password = os.getenv("FANPROXY_PASS")
self.host = os.getenv("FANPROXY_HOST", "proxy.fanproxy.com")
self.port = os.getenv(
"FANPROXY_PORT",
"1080" if self.protocol == "socks5" else "8080"
)
# 构建代理 URL
auth = f"{self.user}:{self.password}@" if self.user and self.password else ""
scheme = "socks5h" if self.protocol == "socks5" else self.protocol
proxy_url = f"{scheme}://{auth}{self.host}:{self.port}"
self.proxies = {"http": proxy_url, "https": proxy_url}
# 创建带重试策略的 Session
self.session = requests.Session()
retries = Retry(total=3, backoff_factor=1,
status_forcelist=[500, 502, 503, 504])
adapter = HTTPAdapter(max_retries=retries)
self.session.mount("http://", adapter)
self.session.mount("https://", adapter)
logger.info(f"[FanProxy] 初始化完成 -> {scheme}://{'*'*6}@{self.host}:{self.port}")
def get(self, url, **kwargs):
"""发送 GET 请求(自动走网帆代理)"""
return self.session.get(url, proxies=self.proxies, timeout=self.timeout, **kwargs)
def post(self, url, **kwargs):
"""发送 POST 请求(自动走网帆代理)"""
return self.session.post(url, proxies=self.proxies, timeout=self.timeout, **kwargs)
def check_ip(self):
"""测试当前出口 IP"""
r = self.get("https://httpbin.org/ip")
ip = r.json().get("origin", "unknown")
logger.info(f"[FanProxy] 当前出口 IP: {ip}")
return ip
def close(self):
self.session.close()
# ============ 使用示例 ============
if __name__ == "__main__":
# 1) HTTP/HTTPS 模式(适合常规 API、网页采集)
client_http = FanProxyClient(protocol="http")
client_http.check_ip()
client_http.close()
# 2) SOCKS5 模式(适合长时间稳定连接、底层 TCP 场景)
client_sk5 = FanProxyClient(protocol="socks5")
client_sk5.check_ip()
client_sk5.close()
8.1 网帆代理产品选型速查
| 业务场景 | 推荐产品 | 协议 | 核心优势 |
|---|---|---|---|
| 大规模并发数据采集、高频切换 IP | 短效动态代理 | HTTP/HTTPS/SOCKS5 | IP 更换灵活,成本可控,适合高并发 |
| 爬虫持续监控、软件挂机、长时间任务 | 长效动态代理 | HTTP/HTTPS/SOCKS5 | IP 稳定在线 1~24h,连接不中断 |
| 账号管理、直播推流、固定身份标识 | 固定长效代理 | HTTP/HTTPS/SOCKS5 | 长期独享固定 IP,纯净度高 |
| 跨境电商、海外社媒运营 | 全球住宅 IP | HTTP/HTTPS | 覆盖 200+ 国家地区,模拟真实用户 |
🎁 新用户福利:注册网帆代理即可领取免费测试时长,方便在正式采购前验证效果。
九、完整可运行示例汇总
#!/usr/bin/env python3
"""
requests 代理配置全协议演示脚本
运行前请确保:
pip install requests PySocks
并根据实际情况修改下方的代理地址。
"""
import os
import requests
# ==================== 配置区 ====================
# 1) HTTP/HTTPS 代理(无需认证)
HTTP_PROXY = "http://127.0.0.1:8080"
# 2) HTTP/HTTPS 代理(需认证)
# HTTP_AUTH_PROXY = "http://user:[email protected]:8080"
# 3) SOCKS5 代理
SOCKS5_PROXY = "socks5h://127.0.0.1:1080"
TEST_URL = "https://httpbin.org/ip"
TIMEOUT = 15
# ==============================================
def test_http_proxy():
"""测试 HTTP/HTTPS 代理"""
proxies = {"http": HTTP_PROXY, "https": HTTP_PROXY}
try:
r = requests.get(TEST_URL, proxies=proxies, timeout=TIMEOUT)
print(f"[HTTP 代理] 成功 -> 出口 IP: {r.json().get('origin')}")
except Exception as e:
print(f"[HTTP 代理] 失败 -> {type(e).__name__}: {e}")
def test_socks5_proxy():
"""测试 SOCKS5 代理"""
proxies = {"http": SOCKS5_PROXY, "https": SOCKS5_PROXY}
try:
r = requests.get(TEST_URL, proxies=proxies, timeout=TIMEOUT)
print(f"[SOCKS5 代理] 成功 -> 出口 IP: {r.json().get('origin')}")
except Exception as e:
print(f"[SOCKS5 代理] 失败 -> {type(e).__name__}: {e}")
def test_session_proxy():
"""测试 Session 级别代理"""
session = requests.Session()
session.proxies = {"http": HTTP_PROXY, "https": HTTP_PROXY}
try:
r = session.get(TEST_URL, timeout=TIMEOUT)
print(f"[Session 代理] 成功 -> 出口 IP: {r.json().get('origin')}")
except Exception as e:
print(f"[Session 代理] 失败 -> {type(e).__name__}: {e}")
finally:
session.close()
def test_env_proxy():
"""测试环境变量代理(需提前 export HTTP_PROXY/HTTPS_PROXY)"""
# 注意:若当前 shell 未设置,则此测试等价于直连
try:
# trust_env=True 为默认值,自动读取环境变量
r = requests.get(TEST_URL, timeout=TIMEOUT)
print(f"[环境变量代理] 响应 IP: {r.json().get('origin')} (若无代理则为本机IP)")
except Exception as e:
print(f"[环境变量代理] 失败 -> {type(e).__name__}: {e}")
if __name__ == "__main__":
print("=" * 50)
print("Python requests 代理配置测试")
print("=" * 50)
test_http_proxy()
test_socks5_proxy()
test_session_proxy()
test_env_proxy()
print("=" * 50)
print("测试完成。请将上方代理地址替换为你自己的可用代理。")
十、总结
| 场景 | 推荐写法 |
|---|---|
| 临时单次请求 | requests.get(url, proxies={...}) |
| 大量同域名请求 | session.proxies = {...} |
| CI/CD 或团队协作 | 环境变量 HTTP_PROXY + trust_env=True |
| 匿名/隐私需求高 | socks5h:// 让代理端解析 DNS |
| 多 IP 防封禁 | 自建代理池 + 随机轮换 |
| 企业级稳定代理服务 | 网帆代理:短效/长效/固定 IP + HTTP/HTTPS/SK5 全协议支持 |
掌握以上几种模式后,无论是日常接口调试还是大规模数据采集,都能灵活应对各种代理环境。如果你正在寻找一家线路纯净、节点丰富、协议齐全的商业代理服务商,网帆代理(FanProxy) 提供从短效动态到固定长效的全套解决方案,支持 HTTP/HTTPS/SOCKS5 三大协议,覆盖全球 200+ 国家地区,新用户注册即可免费测试。