请求:如何禁用/绕过代理
requests: how to disable / bypass proxy
我得到一个 url 有:
r = requests.get("http://myserver.com")
正如我在"myserver.com"的'access.log'中看到的那样,使用了客户端的系统代理。但我想通过 requests
.
完全禁用代理
我目前知道的完全禁用代理的唯一方法如下:
- 创建会话
- 将
session.trust_env
设置为False
- 使用该会话创建您的请求
import requests
session = requests.Session()
session.trust_env = False
response = session.get('http://www.whosebug.com')
这是基于this comment by Lukasa and the (limited) documentation for requests.Session.trust_env
。
注意: 将 trust_env
设置为 False
也会忽略以下内容:
如果您只想禁用特定域的代理(如 localhost
),您可以使用 NO_PROXY
environment variable:
import os
import requests
os.environ['NO_PROXY'] = 'whosebug.com'
response = requests.get('http://www.whosebug.com')
请求库遵守环境变量。
http://docs.python-requests.org/en/latest/user/advanced/#proxies
所以尝试删除环境变量 HTTP_PROXY 和 HTTPS_PROXY。
import os
for k in list(os.environ.keys()):
if k.lower().endswith('_proxy'):
del os.environ[k]
您可以为每个请求选择代理。来自 the docs:
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
所以要禁用代理,只需将每个设置为 None:
import requests
proxies = {
"http": None,
"https": None,
}
requests.get("http://example.org", proxies=proxies)
停止requests/urllib代理任何请求的方法是将no_proxy
(或NO_PROXY
)环境变量设置为*
,例如在 bash:
export no_proxy='*'
或来自Python:
import os
os.environ['no_proxy'] = '*'
要理解为什么这样做是因为 urllib.request.getproxies 函数首先检查环境变量中设置的任何代理(例如 http_proxy
、HTTP_PROXY
、https_proxy
、HTTPS_PROXY
, 等等)或者如果设置了 none 那么它将使用特定于平台的调用检查系统配置的代理(例如,在 MacOS 上它将使用系统 scutil/configd 接口进行检查,而在 Windows 它将检查注册表)。如评论中所述,如果设置了任何代理变量,您可以按照@udani 的建议重置它们,或者像这样从 Python:
中取消设置它们
del os.environ['HTTP_PROXY']
然后,当 urllib 尝试使用任何代理时,proxyHandler
函数将检查 no_proxy
环境变量的存在和设置 - 可以将其设置为如上所述的特定主机名,或者它可以设置特殊的 *
值,所有主机绕过代理。
对于 Python3,jtpereyda 的 不起作用,但以下方法起作用:
proxies = {
"http": "",
"https": "",
}
r = requests.post('https://localhost:44336/api/',data='',verify=False)
我在连接 localhost 以使用 request
模块从 Python 脚本访问我的 .net 后端时遇到了同样的问题。
我把verify
设置为False
,取消了默认的SSL验证。
P.s - 上面的代码会抛出一个可以被下面的代码忽略的警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
r=requests.post('https://localhost:44336/api/',data='',verify=False)
我得到一个 url 有:
r = requests.get("http://myserver.com")
正如我在"myserver.com"的'access.log'中看到的那样,使用了客户端的系统代理。但我想通过 requests
.
我目前知道的完全禁用代理的唯一方法如下:
- 创建会话
- 将
session.trust_env
设置为False
- 使用该会话创建您的请求
import requests
session = requests.Session()
session.trust_env = False
response = session.get('http://www.whosebug.com')
这是基于this comment by Lukasa and the (limited) documentation for requests.Session.trust_env
。
注意: 将 trust_env
设置为 False
也会忽略以下内容:
如果您只想禁用特定域的代理(如 localhost
),您可以使用 NO_PROXY
environment variable:
import os
import requests
os.environ['NO_PROXY'] = 'whosebug.com'
response = requests.get('http://www.whosebug.com')
请求库遵守环境变量。 http://docs.python-requests.org/en/latest/user/advanced/#proxies
所以尝试删除环境变量 HTTP_PROXY 和 HTTPS_PROXY。
import os
for k in list(os.environ.keys()):
if k.lower().endswith('_proxy'):
del os.environ[k]
您可以为每个请求选择代理。来自 the docs:
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://example.org", proxies=proxies)
所以要禁用代理,只需将每个设置为 None:
import requests
proxies = {
"http": None,
"https": None,
}
requests.get("http://example.org", proxies=proxies)
停止requests/urllib代理任何请求的方法是将no_proxy
(或NO_PROXY
)环境变量设置为*
,例如在 bash:
export no_proxy='*'
或来自Python:
import os
os.environ['no_proxy'] = '*'
要理解为什么这样做是因为 urllib.request.getproxies 函数首先检查环境变量中设置的任何代理(例如 http_proxy
、HTTP_PROXY
、https_proxy
、HTTPS_PROXY
, 等等)或者如果设置了 none 那么它将使用特定于平台的调用检查系统配置的代理(例如,在 MacOS 上它将使用系统 scutil/configd 接口进行检查,而在 Windows 它将检查注册表)。如评论中所述,如果设置了任何代理变量,您可以按照@udani 的建议重置它们,或者像这样从 Python:
del os.environ['HTTP_PROXY']
然后,当 urllib 尝试使用任何代理时,proxyHandler
函数将检查 no_proxy
环境变量的存在和设置 - 可以将其设置为如上所述的特定主机名,或者它可以设置特殊的 *
值,所有主机绕过代理。
对于 Python3,jtpereyda 的
proxies = {
"http": "",
"https": "",
}
r = requests.post('https://localhost:44336/api/',data='',verify=False)
我在连接 localhost 以使用 request
模块从 Python 脚本访问我的 .net 后端时遇到了同样的问题。
我把verify
设置为False
,取消了默认的SSL验证。
P.s - 上面的代码会抛出一个可以被下面的代码忽略的警告
import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
r=requests.post('https://localhost:44336/api/',data='',verify=False)