Python配置企业代理遇凭证无效,求等效R的set_config方案
我需要通过企业代理向服务器发送请求,想在Python中实现和R代码set_config(use_proxy(url = "some_url", port = some_port, username = "some_user", password = "some_pass"))等效的代理配置。
我尝试了以下代码:
import os import requests proxy = 'http://some_user:some_pass@some_url:some_port' os.environ['http_proxy'] = proxy os.environ['HTTP_PROXY'] = proxy os.environ['https_proxy'] = proxy os.environ['HTTPS_PROXY'] = proxy response = requests.post(url=url, data=data)
但没有得到正确结果,反而返回无效凭证错误,相同的凭证在R中可以正常使用,请问我遗漏了什么?
这种情况通常是因为requests对环境变量代理的解析、凭证处理逻辑和R的httr包存在差异,以下几个方向可以排查和解决:
直接在
requests中显式设置代理(推荐)
不要依赖系统环境变量,而是直接给requests的proxies参数传入配置,这样能精准控制代理的使用逻辑,避免环境变量可能带来的解析问题:import requests proxies = { 'http': 'http://some_user:some_pass@some_url:some_port', 'https': 'http://some_user:some_pass@some_url:some_port' } response = requests.post(url=url, data=data, proxies=proxies)注意:即使是HTTPS请求,代理地址通常也是
http://开头(除非你的企业代理本身是HTTPS协议的)。检查凭证是否需要URL编码
如果你的用户名或密码包含特殊字符(比如@、:、/、&等),直接拼在代理URL里会导致requests解析凭证出错。R的use_proxy可能自动处理了这种编码,但Python环境变量方式不会,这时候需要手动编码:from urllib.parse import quote import requests # 对用户名和密码进行URL编码 username = quote("some_user") password = quote("some_pass") proxy_url = f'http://{username}:{password}@some_url:some_port' proxies = { 'http': proxy_url, 'https': proxy_url } response = requests.post(url=url, data=data, proxies=proxies)使用
requests.Session持久化代理配置
如果需要发送多次请求,用Session对象设置代理会更高效,也能避免重复配置:import requests session = requests.Session() session.proxies = { 'http': 'http://some_user:some_pass@some_url:some_port', 'https': 'http://some_user:some_pass@some_url:some_port' } # 后续所有请求都会自动使用该代理 response = session.post(url=url, data=data)处理NTLM类型的企业代理
部分企业代理使用NTLM认证,这种情况下环境变量方式完全不适用,需要安装requests-ntlm库来处理:pip install requests-ntlm然后按如下方式配置:
from requests_ntlm import HttpNtlmAuth import requests session = requests.Session() session.proxies = { 'http': 'http://some_url:some_port', 'https': 'http://some_url:some_port' } # 注意域名格式,通常是「域名\用户名」 session.auth = HttpNtlmAuth('company_domain\\some_user', 'some_pass') response = session.post(url=url, data=data)
内容的提问来源于stack exchange,提问作者Derek Langley

