尝试通过代理发送简单的获取请求。我有“代理授权”和“授权”标头,不认为我需要“授权”标头,但还是添加了它。
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)
我收到以下错误:
requests.packages.urllib3.exceptions.ProxyError: Cannot connect to proxy. Socket error: Tunnel connection failed: 407 Proxy Authentication Required.
但是,当我将 URL 更改为 simplehttp://www.google.com
时,它工作正常。
代理是否对 https 使用 Basic、Digest 或某种其他类型的身份验证?它是代理服务器特定的吗?我如何发现这些信息?我需要使用 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 请求时,如果我省略了标头并传入了一个使用 user/pass 格式的代理,我会收到 407 响应。
发送 HTTPS 请求时,如果我传入标头并保持代理未格式化,则会收到前面提到的 ProxyError。
我正在使用 requests 2.0.0 和 Squid 代理缓存 Web 服务器。为什么标头选项不适用于 HTTPS?为什么格式化的代理不适用于 HTTP?