背景:由于环境限制,我只能使用python 2.4。因此requests
是不可能的。
我希望能够使用urllib2.HTTPBasicAuthHandler
并ProxyHandler
同时打开一个URL。
如果我做类似的事情:
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]))
阅读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处理程序构建一个打开程序。如果需要,请全局安装它:
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))
更新:我测试以下代码段,并且按预期工作。不要忘记用您自己的代理,URL,用户名和密码替换:
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()
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句