如何在Python中使用带身份验证的SOCKS5代理发送网络请求及下载文件
Python全局使用带认证SOCKS5代理实现方案
以下两种方案可按需选择,推荐方案2,和Telegram全局代理效果一致,所有网络操作都会自动走代理。
方案1:环境变量配置(适配大部分标准请求库)
绝大多数Python网络库(requests、urllib、urllib3等)会自动读取系统代理环境变量,只需在代码最开头配置对应环境变量即可:
import os # 替换为实际代理信息 PROXY_HOST = "192.168.1.100" # 你的代理主机地址 PROXY_PORT = "1080" # 代理端口 PROXY_USER = "user" # 代理用户名 PROXY_PASS = "passwd" # 代理密码 proxy_addr = f"socks5://{PROXY_USER}:{PROXY_PASS}@{PROXY_HOST}:{PROXY_PORT}" os.environ["ALL_PROXY"] = proxy_addr os.environ["HTTP_PROXY"] = proxy_addr os.environ["HTTPS_PROXY"] = proxy_addr
注意:该方案仅对读取系统环境变量的请求库生效,自定义socket实现的第三方库不会走代理。
方案2:socket全局补丁(真正全局生效,适配所有基于标准socket的请求)
该方案直接替换Python底层默认socket实现,所有基于标准socket的网络通信(包括请求库、下载工具、爬虫框架等)都会自动走代理,和Telegram的全局代理效果完全一致。
首先安装依赖:pip install PySocks
然后在所有网络请求代码执行前,添加以下配置:
import socket import socks # 替换为实际代理信息 PROXY_HOST = "192.168.1.100" # 你的代理主机地址 PROXY_PORT = 1080 # 代理端口,数字类型 PROXY_USER = "user" # 代理用户名 PROXY_PASS = "passwd" # 代理密码 socks.set_default_proxy( socks.SOCKS5, PROXY_HOST, PROXY_PORT, username=PROXY_USER, password=PROXY_PASS ) # 替换默认socket实现 socket.socket = socks.socksocket
配置验证
配置完成后可以通过IP查询接口验证代理是否生效:
import requests # 该接口返回当前访问的出口IP resp = requests.get("https://api.ipify.org") print(f"当前出口IP:{resp.text}")
如果输出IP为代理服务器的IP,说明配置生效。
注意事项
- 所有代理配置代码必须放在所有网络请求相关代码的最前面,否则提前初始化的网络连接不会走代理
- 异步网络库(如aiohttp)不兼容socket补丁方案,可在创建ClientSession时手动传入代理url参数
- 不要同时启用两种配置方案,避免出现代理冲突导致请求失败
内容的提问来源于stack exchange,提问作者a-m-h-t
相关产品推荐
相关产品推荐

