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

问题描述 投票:0回答:10

我收到的网址为:

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

正如我在“myserver.com”的“access.log”中看到的,使用了客户端的系统代理。但我想通过

requests
完全禁用代理。

python python-requests
10个回答
161
投票

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

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

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

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

这是基于 Lukasa 的评论和

requests.Session.trust_env
的(有限)文档。

注意:

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

  • 来自
    .netrc
    的认证信息(code
  • CA 捆绑包定义在
    REQUESTS_CA_BUNDLE
    CURL_CA_BUNDLE
    代码

但是,如果您只想禁用特定域的代理(例如

localhost
),则可以使用
NO_PROXY
环境变量

import os
import requests

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

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

96
投票

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

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
切换为
""
,请参阅评论。


23
投票

停止 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
等),或者如果没有设置后,它将使用特定于平台的调用检查系统配置的代理(例如,在 MacOS 上,它将使用系统 scutil/configd 接口进行检查,在 Windows 上,它将检查注册表)。正如评论中提到的,如果设置了任何代理变量,您可以按照@udani的建议重置它们,或者像这样从Python中取消设置它们:

del os.environ['HTTP_PROXY']

然后,当 urllib 尝试使用任何代理

proxyHandler
函数时,它将检查
no_proxy
环境变量的存在和设置 - 可以将其设置为如上所述的特定主机名,也可以设置特殊的
* 
所有主机绕过代理的值。


9
投票

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

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

5
投票

请求库尊重环境变量。 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]

4
投票

我在我们的生产代码库中实现了 @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})
    

3
投票
r = requests.post('https://localhost:44336/api/',data='',verify=False)
在连接本地主机以使用 

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)
    

1
投票
如果您有默认代理并且不希望替换它们,则追加到列表即可解决问题:

import os import requests os.environ['NO_PROXY'] = os.environ['NO_PROXY'] + ',' + 'stackoverflow.com' response = requests.get('http://www.stackoverflow.com')

为未来的读者发布 LeDerp 对 Lukas Graf 的 answer 的评论。


0
投票
对于那些

no_proxy="*"

 不起作用的人,请尝试 
0.0.0.0/32
,这对我有用。


0
投票
截至 2024 年 9 月,您似乎可以为代理传递一个空字典 :

import requests response = requests.get(https://google.com, proxies={})
    
© www.soinside.com 2019 - 2024. All rights reserved.