
在Python中实现SOCKS代理,核心依赖是 pysocks 库(通常简称socks库,非标准库,需手动安装)。该库支持SOCKS4、SOCKS5协议,可实现TCP/UDP流量转发、身份认证等功能,适配网页请求、SSH连接、网络爬虫等多种场景。本文将从环境准备、基础用法、进阶场景到问题排查,逐步讲解其使用方法。

一、环境准备:安装pysocks库
首先需安装 pysocks 库(注意:标准库中无内置socks模块,直接导入会报错,需安装第三方库),通过pip命令快速安装:
# 基础安装(适用于Python3)
pip install pysocks
# 若需指定版本(推荐稳定版1.7.1)
pip install pysocks==1.7.1验证安装:在Python交互环境中输入 import socks,无报错则安装成功。
socks库的核心是通过 socks.set_default_proxy() 配置全局代理,或通过 socks.socksocket() 创建带代理的套接字,两种方式适配不同场景。
配置代理时需明确以下关键参数,对应SOCKS协议特性:
socks.PROXY_TYPE_SOCKS4(SOCKS4)、socks.PROXY_TYPE_SOCKS5(SOCKS5)指定,SOCKS5支持UDP、身份认证,推荐优先使用。username 和 password 参数(SOCKS4不支持)。rdns=True,表示通过代理服务器解析DNS(避免本地DNS泄露,增强隐私性)。通过 socks.set_default_proxy() 配置全局代理后,脚本中所有基于套接字的网络请求都会自动走代理,适合简单场景(如全量流量转发)。
import socks
import socket
import requests
# 1. 配置全局SOCKS5代理(带身份认证)
socks.set_default_proxy(
proxy_type=socks.PROXY_TYPE_SOCKS5, # 代理类型:SOCKS5
addr="127.0.0.1", # 代理IP
port=1080, # 代理端口
username="your_username", # 代理用户名(无认证可省略)
password="your_password", # 代理密码(无认证可省略)
rdns=True # 通过代理解析DNS,增强隐私
)
# 2. 替换默认套接字,使请求走代理
socket.socket = socks.socksocket
# 3. 测试:通过代理访问网页
try:
response = requests.get("https://www.example.com", timeout=5)
print(f"请求成功,状态码:{response.status_code}")
print(f"页面内容片段:{response.text[:200]}")
except Exception as e:
print(f"请求失败:{str(e)}")注意:全局代理会影响脚本中所有网络请求(包括第三方库),若需部分请求走代理、部分直连,不建议使用此方式。
通过 socks.socksocket() 创建独立代理套接字,仅作用于指定请求,灵活性更强,适合复杂场景(如多代理切换、部分流量转发)。
import socks
import socket
def request_via_socks(url, proxy_addr, proxy_port, username=None, password=None):
# 创建SOCKS5代理套接字
sock = socks.socksocket()
try:
# 连接代理服务器
sock.set_proxy(
socks.PROXY_TYPE_SOCKS5,
addr=proxy_addr,
port=proxy_port,
username=username,
password=password,
rdns=True
)
# 解析目标地址并连接
host, port = url.split("//")[-1].split("/")[0], 80 # 简化处理HTTP请求
sock.connect((host, port))
# 发送HTTP请求
request = f"GET {url} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n"
sock.sendall(request.encode("utf-8"))
# 接收响应
response = sock.recv(4096).decode("utf-8")
return response
except Exception as e:
return f"请求失败:{str(e)}"
finally:
sock.close()
# 测试:局部代理访问HTTP网页
if __name__ == "__main__":
proxy_info = {
"addr": "127.0.0.1",
"port": 1080,
"username": "your_username",
"password": "your_password"
}
result = request_via_socks("http://www.example.com", **proxy_info)
print(result)SOCKS4仅支持TCP协议,不支持身份认证,配置时需指定对应代理类型,参数简化:
import socks
import socket
import requests
# 配置SOCKS4代理(无认证)
socks.set_default_proxy(
proxy_type=socks.PROXY_TYPE_SOCKS4,
addr="127.0.0.1",
port=1081 # SOCKS4常用端口(可自定义)
)
socket.socket = socks.socksocket
# 测试请求
try:
response = requests.get("http://www.example.com", timeout=5)
print(f"SOCKS4代理请求成功,状态码:{response.status_code}")
except Exception as e:
print(f"请求失败:{str(e)}")SOCKS5支持UDP转发,可用于UDP协议场景(如DNS查询、实时通信),需通过 sock.bind() 绑定本地端口实现:
import socks
import socket
# 创建SOCKS5代理的UDP套接字
udp_sock = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM)
udp_sock.set_proxy(
socks.PROXY_TYPE_SOCKS5,
addr="127.0.0.1",
port=1080,
rdns=True
)
# 测试:通过代理发送UDP数据(示例:DNS查询)
dns_server = ("8.8.8.8", 53) # 谷歌DNS服务器
dns_query = b"\x00\x12\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03\x77\x77\x77\x06\x67\x6f\x6f\x67\x6c\x65\x03\x63\x6f\x6d\x00\x00\x01\x00\x01"
try:
# 发送UDP查询
udp_sock.sendto(dns_query, dns_server)
# 接收响应
response, addr = udp_sock.recvfrom(1024)
print(f"UDP响应长度:{len(response)} 字节")
print(f"响应数据:{response.hex()}")
except Exception as e:
print(f"UDP请求失败:{str(e)}")
finally:
udp_sock.close()实际开发中常用requests库发起HTTP/HTTPS请求,可通过自定义适配器将socks代理集成,实现局部请求走代理:
import requests
from requests.adapters import HTTPAdapter
from urllib3.connection import HTTPConnection
import socks
# 自定义带SOCKS代理的连接类
class SocksHTTPConnection(HTTPConnection):
def __init__(self, *args, **kwargs):
proxy_info = kwargs.pop("proxy_info") # 提取代理信息
super().__init__(*args, **kwargs)
# 配置SOCKS代理
self.sock = socks.socksocket()
self.sock.set_proxy(
socks.PROXY_TYPE_SOCKS5,
addr=proxy_info["addr"],
port=proxy_info["port"],
username=proxy_info.get("username"),
password=proxy_info.get("password"),
rdns=True
)
# 自定义适配器
class SocksAdapter(HTTPAdapter):
def __init__(self, proxy_info):
self.proxy_info = proxy_info
super().__init__()
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = requests.packages.urllib3.poolmanager.PoolManager(
num_pools=connections,
maxsize=maxsize,
block=block,
connection_class=SocksHTTPConnection,
proxy_info=self.proxy_info # 传递代理信息
)
# 测试:局部请求走代理
if __name__ == "__main__":
proxy_info = {
"addr": "127.0.0.1",
"port": 1080,
"username": "your_username",
"password": "your_password"
}
# 创建会话并绑定适配器
session = requests.Session()
session.mount("http://", SocksAdapter(proxy_info))
session.mount("https://", SocksAdapter(proxy_info))
try:
response = session.get("https://www.example.com", timeout=5)
print(f"请求成功,状态码:{response.status_code}")
except Exception as e:
print(f"请求失败:{str(e)}")pip install pysocks 即可。rdns=True,通过代理服务器解析DNS,避免本地DNS泄露(隐私场景必备)。Python中通过pysocks库实现SOCKS代理,核心是通过 set_default_proxy()(全局)或 socksocket()(局部)配置代理参数,根据场景选择SOCKS4/SOCKS5协议及认证方式。实际开发中,结合requests、socket等库,可适配网页请求、UDP通信、SSH隧道等多种需求,注意参数匹配和异常处理,即可稳定实现代理功能。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。