您的位置:

关于urllib3的ValueError(f"Unable to determine SOCKS version from {proxy_url}")

  发布时间:2023-02-19 14:39:49
报错的原因urllib在使用SOCKS代理时,如果无法从代理URL中确定SOCKS版本,会引发这通常是由于代理URL格式不正确导致的。如何解决解决这个问题的方法是确保代理URL格式正确。为了使用SOCKS代理,URL应该包含代理服务器的主机名和端口号,并且应该以"socks5://"或"socks5h://"开头。

报错的原因

urllib3在使用SOCKS代理时,如果无法从代理URL中确定SOCKS版本,会引发ValueError("Unable to determine SOCKS version from {proxy_url}")。这通常是由于代理URL格式不正确导致的。

如何解决

解决这个问题的方法是确保代理URL格式正确。为了使用SOCKS代理,URL应该包含代理服务器的主机名和端口号,并且应该以"socks5://"或"socks5h://"开头。

如果你已经确定了代理URL格式正确,你可以试试使用socks.SOCKSProxyManager()来设置代理,这样就不需要判断SOCKS版本了。


from urllib3.contrib.socks import SOCKSProxyManager
http = SOCKSProxyManager('socks5://user:pass@host:port')
r = http.request('GET', 'http://httpbin.org/ip')
print(r.data)

如果你已经确定了代理账户密码,你可以把代理URL构造成socks5h://user:pass@host:port的格式,这样可以避免上面的错误。


import urllib3
http = urllib3.ProxyManager('socks5h://user:pass@host:port')
r = http.request('GET', 'http://httpbin.org/ip')
print(r.data)

使用例子

当然有!

这是一个使用SOCKS5代理访问网页的示例:


import urllib3

# 设置代理
proxy = urllib3.ProxyManager("socks5://user:pass@host:port")

# 发送请求
response = proxy.request('GET', 'http://httpbin.org/ip')

# 打印结果
print(response.data)

上面的例子中, 你需要把user,pass,host,port替换成你自己的值

或者使用SOCKS5h代理(SOCKS5代理带用户名密码)


import urllib3

# 设置代理
proxy = urllib3.ProxyManager("socks5h://user:pass@host:port")

# 发送请求
response = proxy.request('GET', 'http://httpbin.org/ip')

# 打印结果
print(response.data)

使用SOCKSProxyManager


from urllib3.contrib.socks import SOCKSProxyManager

http = SOCKSProxyManager('socks5://user:pass@host:port')
r = http.request('GET', 'http://httpbin.org/ip')
print(r.data)

这些示例都是使用urllib3库来发送请求。如果你使用其他库(如requests)来发送请求,你需要按照相应库的说明来设置代理。