使用Python Requests库通过含@密码的认证代理下载数据的问题
解决Requests代理密码含@的认证问题
这个坑我之前踩过!当密码里包含@时,直接用官方文档里的http://user:password@host格式肯定会出问题——requests会把密码里的@当成用户认证部分和代理主机的分隔符,导致解析出来的代理地址完全错误。给你两个实用的解决办法:
方法1:URL编码密码中的特殊字符
URL里的@属于保留字符,必须转成URL编码格式%40才能被正确解析。举个例子:
如果你的密码是my@secret,就把它改成my%40secret,然后拼接成完整的代理URL:
proxies = { 'http': 'http://your-username:my%40secret@proxy-host:8080', 'https': 'http://your-username:my%40secret@proxy-host:8080' } response = requests.get('https://target-website.com', proxies=proxies)
这种方法简单直接,适合快速解决单个特殊字符的问题。
方法2:分离代理地址与认证信息(更推荐)
不用把用户名密码塞进代理URL里,而是用requests的HTTPBasicAuth对象单独指定认证信息,这样完全不用处理字符编码,逻辑也更清晰:
import requests from requests.auth import HTTPBasicAuth # 只设置代理主机和端口 proxies = { 'http': 'http://proxy-host:8080', 'https': 'http://proxy-host:8080' } # 方式A:单次请求指定认证 response = requests.get( 'https://target-website.com', proxies=proxies, auth=HTTPBasicAuth('your-username', 'my@secret') ) # 方式B:用Session持久化设置(适合多次请求) session = requests.Session() session.proxies = proxies session.auth = HTTPBasicAuth('your-username', 'my@secret') # 之后所有请求自动使用代理和认证 response = session.get('https://target-website.com')
这种方法尤其适合密码里有多个特殊字符的场景,避免了频繁编码的麻烦。
内容的提问来源于stack exchange,提问作者smoff




