You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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里,而是用requestsHTTPBasicAuth对象单独指定认证信息,这样完全不用处理字符编码,逻辑也更清晰:

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

火山引擎 最新活动