提示ValueError(f"Invalid proxy scheme for tunneling: {scheme!r}, must be either 'http' or 'https'")的解决方案
问题原因
urllib3出现ValueError(f"Invalid proxy scheme for tunneling: {scheme!r}, must be either 'http' or 'https'")的原因是由于在代理设置中使用了不支持的代理协议。urllib3在处理代理服务器时,需要明确指定代理协议为'http'或者'https',如果代理协议不是这两者之一,则会抛出该错误。
解决方案
出现ValueError("Invalid proxy scheme for tunneling: {scheme!r}, must be either 'http' or 'https'")的原因是代理方案(scheme)不合法,urllib3只支持' http'或' https'代理方案用于隧道。解决这个问题的方法是确保设置的代理方案是' http'或' https'。 解决方法: 1. 检查代码中设置代理的地方,确保代理方案的设定是合法的。例如:
import requests
proxies = {
'http': 'http://your_proxy_ip:your_proxy_port',
'https': 'https://your_proxy_ip:your_proxy_port'
}
response = requests.get('https://www.example.com', proxies=proxies)
- 如果使用urllib3直接发送请求,也需要确保传递的代理方案是正确的。例如:
import urllib3
http = urllib3.ProxyManager('http://your_proxy_ip:your_proxy_port')
r = http.request('GET', 'https://www.example.com')
通过以上两种方法,可以确保代理方案设置正确,避免出现"Invalid proxy scheme for tunneling"的ValueError。
具体例子
当使用urllib3
库时,出现ValueError: Invalid proxy scheme for tunneling: {scheme}, must be either 'http' or 'https'
错误通常是因为代理服务器的协议方案不正确导致的。要正确使用urllib3
避免该错误,需要确保代理服务器的协议方案为http
或https
。
解决该问题的方法是在创建urllib3
的PoolManager
时,为其传递一个正确配置的代理。下面是一个示例代码:
import urllib3
# 设置代理信息,注意代理协议必须为 http 或 https
proxy = {
'http': 'http://your_http_proxy:port',
'https': 'http://your_https_proxy:port'
}
# 创建带有代理的 PoolManager
http = urllib3.ProxyManager(proxy_url=proxy['http'], proxy_headers=None)
https = urllib3.ProxyManager(proxy_url=proxy['https'], proxy_headers=None)
# 发送请求
response_http = http.request('GET', 'http://example.com')
response_https = https.request('GET', 'https://example.com')
print(response_http.status)
print(response_https.status)
在以上示例中,我们首先定义了proxy
字典,它包含了HTTP和HTTPS代理服务器的地址。然后分别创建了带有对应代理的urllib3.ProxyManager
对象,分别使用HTTP代理发送HTTP请求和使用HTTPS代理发送HTTPS请求。最后打印出了请求的状态码。
通过上述方法,可以正确使用urllib3
库,避免ValueError: Invalid proxy scheme for tunneling
错误的发生。