背景:由于环境限制,我遇到了python 2.4。所以requests
是不可能的。
我希望能够同时使用urllib2.HTTPBasicAuthHandler
和ProxyHandler
来打开网址。
如果我这样做:
proxy = urllib2.ProxyHandler({'http': 'http://myproxy.local'})
proxy_opener = urllib2.build_opener(proxy)
...
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
pass_handler = urllib2.HTTPBasicAuthHandler(passman)
...
urllib2.install_opener(urllib2.build_opener([proxy_opener, pass_handler]))
代码将停留在这一行:
urllib2.urlopen(target_url)
那么,安装两个处理程序的正确方法是什么?
修改
我的原始版本有语法错误。这条线
urllib2.install_opener(urllib2.build_opener(pass_handler), proxy_opener)
应该是
urllib2.install_opener(urllib2.build_opener(pass_handler, proxy_opener)) # note the parenthesis
但正如 atupal 所示,它应该是
urllib2.install_opener(urllib2.build_opener([proxy_opener, pass_handler]))
答案 0 :(得分:2)
阅读docs-install_opener和docs-build_opener
urllib2.install_opener(opener)
安装一个 OpenerDirector实例作为默认的全局开启者。
和urllib2.build_opener([handler, ...])
返回一个OpenerDirector实例,该实例按给定的顺序链接处理程序。处理程序可以是BaseHandler的实例,也可以是BaseHandler的子类(在这种情况下,必须可以在没有任何参数的情况下调用构造函数)。以下类的实例将在处理程序前面 ,除非处理程序包含它们,它们的实例或它们的子类: ProxyHandler (如果检测到代理设置), UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessor。
所以你应该首先使用代理处理程序和auth处理程序构建一个opener。如果你愿意,可以将它全局安装:
proxy_handler = urllib2.ProxyHandler({'http': 'http://myproxy.local'})
...
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
pass_handler = urllib2.HTTPBasicAuthHandler(passman)
...
urllib2.install_opener(urllib2.build_opener(proxy_handler, pass_handler))
<强>更新强> 我测试了下面的代码片段,它按预期工作。不要忘记用您自己的代码替换代理,网址,用户名和密码:
import urllib2
proxyhandler = urllib2.ProxyHandler({'http': 'http://219.93.183.106:8080'})
url = "http://atupal.org:9001"
passman = urllib2.HTTPPasswordMgrWithDefaultRealm()
passman.add_password(None, url, "myusername", "mypassword")
pass_handler = urllib2.HTTPBasicAuthHandler(passman)
opener = urllib2.build_opener(
proxyhandler,
pass_handler,
)
urllib2.install_opener(opener)
print urllib2.urlopen(url).read()