urllib2:如何安装代理和http基本身份验证处理程序作为开启者?

时间:2014-02-14 05:35:18

标签: python urllib2 python-2.4

背景:由于环境限制,我遇到了python 2.4。所以requests是不可能的。

我希望能够同时使用urllib2.HTTPBasicAuthHandlerProxyHandler来打开网址。

如果我这样做:

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]))

1 个答案:

答案 0 :(得分:2)

阅读docs-install_openerdocs-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()