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

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 也会忽略以下内容:

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

如果您只想禁用特定域的代理(如 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_proxyHTTP_PROXYhttps_proxyHTTPS_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)