请求: 如何禁用/绕过代理

我得到了一个网址:

r = requests.get("http://myserver.com")

正如我在“ myserver.com”的“ accs.log”中看到的,使用了客户机的系统代理。但我想禁用所有使用代理与 requests

141667 次浏览

目前我所知道的禁用代理 完全相信的唯一方法是:

  • 创建一个会话
  • session.trust_env设置为 False
  • 使用该会话创建请求
import requests


session = requests.Session()
session.trust_env = False


response = session.get('http://www.stackoverflow.com')

这是基于 这是卢卡萨的评论requests.Session.trust_env的(有限的)文档。

注意: trust_env设置为 False也忽略以下内容:

  • 来自 .netrc(密码)的身份验证信息
  • REQUESTS_CA_BUNDLECURL_CA_BUNDLE(密码)中定义的 CA 包

但是,如果您只想禁用特定域的代理(如 localhost) ,则可以使用 NO_PROXY环境变量:

import os
import requests


os.environ['NO_PROXY'] = 'stackoverflow.com'


response = requests.get('http://www.stackoverflow.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]

您可以为每个请求选择代理:

import requests


proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}


requests.get("http://example.org", proxies=proxies)

因此,要禁用代理,只需将每个代理设置为空字符串:

import requests


proxies = {
"http": "",
"https": "",
}


requests.get("http://example.org", proxies=proxies)

更新: 从 None切换到 "",见注释。

阻止 request/urllib 代理任何请求的方法是将 no_proxy(或 NO_PROXY)环境变量设置为 *,例如,在 bash 中:

export no_proxy='*'

或者来自 Python:

import os
os.environ['no_proxy'] = '*'

要理解为什么这样做是因为 Getproxy函数首先检查任何在环境变量中设置的代理(例如 http_proxyHTTP_PROXYhttps_proxyHTTPS_PROXY等) ,或者如果没有设置,那么它将检查使用平台特定调用的系统配置代理(例如,在 MacOS 上它将检查使用系统 scutil/configd 接口,在 Windows 上它将检查注册表)。正如评论中提到的,如果设置了任何代理变量,你可以像@udani 建议的那样重置它们,或者像这样从 Python 中取消它们:

del os.environ['HTTP_PROXY']

然后,当 urllib 尝试使用任何代理时,它将检查 no_proxy环境变量的存在和设置——它可以像上面提到的那样设置为特定的主机名,也可以设置特殊的 *值,所有主机都绕过代理。

在 Python 3中,jtpereyda 的 解决方案不起作用,但以下代码起作用:

proxies = {
"http": "",
"https": "",
}
 r = requests.post('https://localhost:44336/api/',data='',verify=False)

在连接 localhost 访问我的。带有 request模块的 Python 脚本的 net 后端。

我将 verify设置为 False,这将取消默认的 SSL 验证。

上面的代码将抛出一个可以被下面的代码忽略的警告

import urllib3
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
r=requests.post('https://localhost:44336/api/',data='',verify=False)

我在我们的生产代码库中实现了 @ jtpereyda的解决方案,该解决方案在正常的成功 HTTP 请求(200 OK)上运行良好,但是这段代码最终不能运行 当接收到 HTTP 重定向时(301永久移动)而不是使用:

requests.get("https://pypi.org/pypi/pillow/9.0.0/json", proxies={"http": "", "https": ""})

作为比较,这条线在代理后面会导致 requests.exception.SSLError(pypi.org试图用大写字母 P 将我们重定向到 Pillow) :

requests.get("https://pypi.org/pypi/pillow/9.0.0/json", proxies={"http": None, "https": None})

对于那些 no_proxy="*"不工作,尝试 0.0.0.0/32,这为我工作。