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

t77*_*777 40 python python-requests

我得到一个网址:

r = requests.get("http://myserver.com")
Run Code Online (Sandbox Code Playgroud)

正如我在"myserver.com"的"access.log"中看到的那样,使用了客户端的系统代理.但我想完全禁用使用代理requests.

Luk*_*raf 85

我目前唯一能够完全禁用代理的方法如下:

  • 创建会话
  • 设置session.trust_envFalse
  • 使用该会话创建您的请求
import requests

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

response = session.get('http://www.stackoverflow.com')
Run Code Online (Sandbox Code Playgroud)

这是基于Lukasa的这个评论和(有限的)文件requests.Session.trust_env.

注意:设置trust_envFalse还忽略了以下内容:

  • 来自.netrc(代码)的认证信息
  • CA包中定义的REQUESTS_CA_BUNDLECURL_CA_BUNDLE(代码)

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

import os
import requests

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

response = requests.get('http://www.stackoverflow.com')
Run Code Online (Sandbox Code Playgroud)

  • 确实是@ t777 - 更新了我的答案. (4认同)
  • 实际上,在我的一台服务器上,`no_proxy`是正确的答案(小写). (4认同)
  • os.environ['NO_PROXY'] = os.environ['NO_PROXY'] + '\,'+ 'stackoverflow.com' 为了不替换默认代理,附加到列表即可 (4认同)

jtp*_*yda 43

您可以为每个请求选择代理.来自文档:

import requests

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

requests.get("http://example.org", proxies=proxies)
Run Code Online (Sandbox Code Playgroud)

因此,要禁用代理,只需将每个代理设置为无:

import requests

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

requests.get("http://example.org", proxies=proxies)
Run Code Online (Sandbox Code Playgroud)

  • 你好,我来自 2022 年,“None”不再有效,它必须是一个空字符串。 (4认同)
  • 我建议不要指定“无”,请检查我的答案。 (3认同)
  • 你检查过第2个案例吗?就我而言,它不起作用,即它仍在使用系统代理。 (2认同)
  • 如果你只是使用 HTTP 那么你不需要设置 `"https": None`,对于那些想知道的人 (2认同)

Gru*_*oll 8

对于Python3,jtpereyda的解决方案不起作用,但以下方法起作用了:

proxies = {
    "http": "",
    "https": "",
}
Run Code Online (Sandbox Code Playgroud)


小智 5

requests 库尊重环境变量。 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]
Run Code Online (Sandbox Code Playgroud)

  • 它绝对不会检查 Mac 上的环境变量。 (2认同)

Pie*_*erz 5

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

export no_proxy='*'
Run Code Online (Sandbox Code Playgroud)

或者来自 Python:

import os
os.environ['no_proxy'] = '*' 
Run Code Online (Sandbox Code Playgroud)

要理解为什么这样做是因为urllib.request.getproxies函数首先检查环境变量中设置的任何代理(例如 http_proxy 等),或者如果没有设置,则它将使用平台特定调用检查系统配置的代理(例如在 MacOS 上)它将使用系统 scutil/configd 接口进行检查,在 Windows 上它将检查注册表)。

然后,当 urllib 尝试使用任何代理时,该proxyHandler函数将检查no_proxy环境变量的存在和设置- 可以将其设置为如上所述的特定主机名,也可以设置特殊*值,从而使所有主机绕过代理。