如何让Python的所有流量通过SOCKS代理?
如何让Python所有流量通过SOCKS代理(基于SSH隧道)
首先通过SSH命令建立本地SOCKS5代理隧道,在终端执行:
ssh -D 5005 user@server
如果需要让SSH在后台运行,避免关闭终端后代理断开,可以添加参数:
ssh -fN -D 5005 user@server
以上命令会在本地127.0.0.1:5005创建一个SOCKS5代理,所有发往该端口的流量都会通过SSH隧道转发到目标服务器。
下面提供几种让Python流量走该SOCKS代理的方法:
1. 全局代理设置(所有Python网络请求自动走代理)
这种方式会让所有基于socket的Python网络库(urllib、requests等)自动使用SOCKS代理,无需单独配置。
首先安装依赖库:
pip install python-socks
然后在代码中配置:
import python_socks import socket # 配置默认SOCKS代理 python_socks.set_default_proxy( proxy_type=python_socks.ProxyType.SOCKS5, host='127.0.0.1', port=5005 ) # 替换系统socket,让所有网络请求走代理 socket.socket = python_socks.socksocket # 测试示例:用urllib获取当前IP from urllib.request import urlopen response = urlopen('https://httpbin.org/ip') print(response.read().decode())
2. 仅让requests库使用代理
如果不想全局修改,只想让requests请求走代理,可按以下步骤操作:
先安装支持SOCKS的requests扩展:
pip install requests[socks]
然后在请求时指定代理:
import requests proxies = { 'http': 'socks5://127.0.0.1:5005', 'https': 'socks5://127.0.0.1:5005' } # 发送请求 response = requests.get('https://httpbin.org/ip', proxies=proxies) print(response.json())
3. 仅让urllib库使用代理
针对urllib单独配置代理,无需全局修改:
from urllib.request import build_opener, ProxyHandler, urlopen, install_opener # 创建代理处理器 proxy_handler = ProxyHandler({ 'http': 'socks5://127.0.0.1:5005', 'https': 'socks5://127.0.0.1:5005' }) # 构建带代理的opener opener = build_opener(proxy_handler) # 可选:将该opener设为全局,后续urllib请求默认使用 install_opener(opener) # 测试请求 response = urlopen('https://httpbin.org/ip') print(response.read().decode())
内容的提问来源于stack exchange,提问作者Win Myo Htet
相关产品推荐
相关产品推荐

