尝试通过代理发送简单的GET请求。我有“Proxy-Authorization”和“Authorization”标头,不认为我需要“Authorization”标头,但无论如何都添加了它。
import requests
URL = 'https://www.google.com'
sess = requests.Session()
user = 'someuser'
password = 'somepass'
token = base64.encodestring('%s:%s'%(user,password)).strip()
sess.headers.update({'Proxy-Authorization':'Basic %s'%token})
sess.headers['Authorization'] = 'Basic %s'%token
resp = sess.get(URL)
I get the following error:
requests.packages.urllib3.exceptions.ProxyError: Cannot connect to proxy. Socket error: Tunnel connection failed: 407 Proxy Authentication Required.
然而,当我将URL更改为简单的
http://www.google.com
时,它可以正常工作。代理是否对HTTPS使用基本身份验证、摘要身份验证或其他类型的身份验证?这是代理服务器特定的吗?我如何发现这些信息?我需要使用requests库来实现这一点。
更新:似乎在HTTP请求中,我们必须传递一个
Proxy-Authorization
头,但在HTTPS请求中,我们需要使用用户名和密码格式化代理URL。#HTTP
import requests, base64
URL = 'http://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<IP>:<PORT>}
token = base64.encodestring('%s:%s' %(user, password)).strip()
myheader = {'Proxy-Authorization': 'Basic %s' %token}
r = requests.get(URL, proxies = proxies, headers = myheader)
print r.status_code # 200
#HTTPS
import requests
URL = 'https://www.google.com'
user = <username>
password = <password>
proxy = {'http': 'http://<user>:<password>@<IP>:<PORT>}
r = requests.get(URL, proxies = proxy)
print r.status_code # 200
发送HTTP请求时,如果我省略了头部并传递一个带有用户名/密码格式的代理,我会收到407响应。
发送HTTPS请求时,如果我传递了头部但未格式化代理,则会出现先前提到的ProxyError错误。
我正在使用requests 2.0.0和Squid代理缓存Web服务器。为什么头选项在HTTPS上不起作用?为什么格式化的代理在HTTP上不起作用?