Python 2.7实现HTTP基础认证获取网站数据遇问题求助
分析你的HTTP Basic Auth请求问题
让我帮你拆解下这两个方法里的错误,以及如何正确实现Python 2.7的HTTPS基础认证请求:
方法一的核心错误
你这个写法有两个致命问题,直接导致了403错误:
- URL不完整:你只传了
secure.pol.com作为url,既没有指定https://协议,也没加上目标资源路径/polcs/trade.xml。urllib2默认会用HTTP协议发送请求,但网站明确要求HTTPS请求,这会让请求直接发错地址。 - 错误的请求头设置:你把请求行
GET /polcs/trade.xml HTTP/1.0放到了headers字典里,这完全不符合HTTP规范。urllib2.Request会自动处理请求方法(默认是GET,传data才会用POST)和HTTP版本,手动添加这个头会让服务器收到格式错误的请求,直接拒绝访问。
方法二的潜在问题
这个写法比方法一规范,但可能存在以下问题:
- 路径不匹配:你访问的是
/polcs/data.xml,但网站示例里的目标路径是/polcs/trade.xml,如果这个路径不是你要访问的正确资源,服务器也会返回错误,请先确认路径是否正确。 - base64编码的小坑:Python 2.7的
base64.encodestring会自动在编码结果末尾添加换行符,虽然你用replace('\n', '')处理了,但更可靠的是用base64.b64encode,它不会额外生成换行。 - SSL证书验证问题:如果网站的SSL证书不被你的系统信任,urllib2会直接拒绝连接,这时候需要处理证书验证逻辑。
正确的实现代码
这里给你一个标准的可运行版本:
import urllib2 import base64 # 务必使用完整的HTTPS URL,包含正确的资源路径 target_url = 'https://secure.pol.com/polcs/trade.xml' username = '你的实际用户名' password = '你的实际密码' # 使用b64encode进行编码,避免多余换行 auth_str = base64.b64encode('{}:{}'.format(username, password)) auth_header = 'Basic ' + auth_str # 创建请求对象并添加认证头 request = urllib2.Request(target_url) request.add_header('Authorization', auth_header) try: # 发送请求并获取响应 response = urllib2.urlopen(request) # 读取返回的数据 response_data = response.read() print(response_data) except urllib2.HTTPError as err: print(f"HTTP错误:{err.code} - {err.reason}") except urllib2.URLError as err: print(f"连接错误:{err.reason}")
处理SSL证书验证问题
如果运行时遇到SSL证书相关的错误,可以临时添加以下代码跳过验证(仅用于测试环境,生产环境请配置信任的证书):
import ssl # 创建不验证证书的上下文 ssl_context = ssl._create_unverified_context() # 打开请求时传入上下文 response = urllib2.urlopen(request, context=ssl_context)
内容的提问来源于stack exchange,提问作者hod
相关产品推荐
相关产品推荐

