Python中pysock使用设定默认代理导致无法上网问题如何解决
import socket import socks import requests
ip = '127.0.0.1' # change your proxy's ip port = 1080 # change your proxy's port socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, ip, port) socket.socket = socks.socksocket url = u'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&q=inurl%E8%A2%8B' print(requests.get(url).text)
使用 setdefaultproxy 方法导致无法使用 chrome 访问 google.com,见下图 http://wx2.sinaimg.cn/large/006pxShMly1feqo1kjem2j31100l4aco.jpg
Python中pysock使用设定默认代理导致无法上网问题如何解决
2 回复
我遇到过类似问题。pysocks设置代理后导致无法上网,通常是因为代理配置不当或库版本问题。下面是一个完整的解决方案:
import socket
import socks
import requests
from urllib.request import urlopen
# 方法1:正确设置全局代理(推荐)
def setup_proper_proxy():
# 设置SOCKS5代理
socks.set_default_proxy(
socks.SOCKS5, # 代理类型:SOCKS5/SOCKS4/HTTP
"127.0.0.1", # 代理服务器地址
1080, # 代理端口
username=None, # 如果需要认证
password=None
)
# 关键步骤:必须调用此方法让socket使用代理
socket.socket = socks.socksocket
# 测试连接
try:
response = urlopen("http://httpbin.org/ip", timeout=10)
print("代理设置成功,当前IP:", response.read().decode())
except Exception as e:
print(f"连接失败: {e}")
# 方法2:为requests库单独设置代理(更安全)
def setup_requests_proxy():
proxies = {
'http': 'socks5://127.0.0.1:1080',
'https': 'socks5://127.0.0.1:1080'
}
try:
response = requests.get(
"http://httpbin.org/ip",
proxies=proxies,
timeout=10
)
print("Requests代理成功:", response.json())
except Exception as e:
print(f"Requests代理失败: {e}")
# 方法3:清理代理设置(解决"无法上网"问题)
def reset_proxy():
# 恢复原始socket
socks.set_default_proxy()
socket.socket = socket._socketobject or socket.socket
# 或者直接重新导入socket模块
import importlib
importlib.reload(socket)
print("代理设置已重置")
# 使用示例
if __name__ == "__main__":
# 先尝试方法1
setup_proper_proxy()
# 如果还有问题,使用方法2
setup_requests_proxy()
# 最后记得重置(如果需要)
reset_proxy()
常见问题及解决:
- 代理类型错误:确认你的代理是SOCKS5还是HTTP,用错类型会导致连接失败
- 端口被占用:检查1080端口是否被其他程序占用
- 代理服务器未运行:确保代理服务(如Shadowsocks、Clash)正在运行
- 库版本问题:
pip install pysocks安装最新版
如果还是不行,可以尝试这个诊断脚本:
import socks
print(f"PySocks版本: {socks.__version__}")
# 测试直接socket连接
test_socket = socks.socksocket()
test_socket.settimeout(5)
try:
test_socket.connect(("8.8.8.8", 53))
print("基础网络连接正常")
except:
print("基础网络有问题,可能不是代理的问题")
建议先用方法2,它不会影响全局网络。


