关于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)来发送请求,你需要按照相应库的说明来设置代理。