如何在Python Requests中使用含问号的代理密码?
问题解决:含特殊字符的代理凭据导致InvalidURL错误
问题原因
服务凭据的密码中包含?,这是URL的保留特殊字符,直接拼在代理URL里时,会被解析成URL参数的起始标记,导致代理地址格式非法,触发requests.exceptions.InvalidURL错误。环境变量方式同理,未编码的?会破坏URL结构,导致代理未被正确识别。
解决方案
1. 手动URL编码凭据
使用Python内置的urllib.parse.quote()对用户名和密码分别编码,将特殊字符转义为URL安全格式(?会被转成%3F):
from urllib.parse import quote import requests # 替换为实际的服务凭据、代理地址和目标API地址 username = "SERVICE_USERNAME" password = "包含?的密码" proxy_host = "proxyserver" proxy_port = "port" target_url = "你的API地址" # 编码特殊字符 encoded_user = quote(username) encoded_pwd = quote(password) # 构造合法的代理URL proxy_url = f"http://{encoded_user}:{encoded_pwd}@{proxy_host}:{proxy_port}" response = requests.get(target_url, proxies={"https": proxy_url})
2. 使用HTTPProxyAuth传递凭据(推荐)
requests支持通过auth参数单独传递代理认证信息,无需拼接在URL中,会自动处理特殊字符编码:
import requests from requests.auth import HTTPProxyAuth proxy_url = "http://proxyserver:port" target_url = "你的API地址" # 直接传入原始凭据,无需编码 proxy_auth = HTTPProxyAuth("SERVICE_USERNAME", "包含?的密码") response = requests.get(target_url, proxies={"https": proxy_url}, auth=proxy_auth)
3. 修正环境变量配置
如果要通过HTTPS_PROXY环境变量设置代理,需手动将密码中的?替换为%3F:
# Linux/macOS终端 export HTTPS_PROXY="http://SERVICE_USERNAME:替换?为%3F后的密码@proxyserver:port" # Windows CMD set HTTPS_PROXY=http://SERVICE_USERNAME:替换?为%3F后的密码@proxyserver:port # Windows PowerShell $env:HTTPS_PROXY = "http://SERVICE_USERNAME:替换?为%3F后的密码@proxyserver:port"
内容的提问来源于stack exchange,提问作者Miloš Uriga
相关产品推荐
相关产品推荐

