如何使用urllib2将经过身份验证的代理例外应用于开启者?

时间:2008-11-07 01:29:15

标签: python windows proxy

在Windows上使用urllib2(也许是urllib)时,python似乎神奇地选择了应用于InternetExplorer的经过身份验证的代理设置。但是,它似乎没有检查和处理高级设置“例外”列表。

我有办法让它来处理例外列表吗?或者,忽略IE代理设置并应用我自己的代理开启器来解决此问题?

之前我玩过创建代理开启器,但无法让它工作。这是我设法挖掘的内容,但我仍然没有看到如何/在哪里应用任何异常,我甚至不确定这是否正确:

proxy_info = {
                      'host':'myproxy.com',
                      'user':Username,
                      'pass':Password,
                      'port':1080
                      }                                                   

http_str = "http://%(user)s:%(pass)s@%(host)s:%(port)d" % proxy_info

authInfo = urllib2.HTTPBasicAuthHandler()
authInfo.add_password()
proxy_dict = {'http':http_str}
proxyHandler = urllib2.ProxyHandler(proxy_dict)

# apply the handler to an opener
proxy_opener = urllib2.build_opener(proxyHandler, urllib2.HTTPHandler)

urllib2.install_opener(proxy_opener)

1 个答案:

答案 0 :(得分:2)

默认情况下,urllib2从环境变量中获取代理设置,这就是它使用IE设置的原因。这非常方便,因为您不需要自己设置身份验证。

您不能按照自己的意愿应用异常,最简单的方法是使用两个opener并决定使用哪个,具体取决于域是否在您的例外列表中。

当您想要使用代理时使用默认opener,而在不需要时使用没有代理的代理:

>>> no_proxy = urllib2.ProxyHandler({})
>>> opener = urllib2.build_opener(no_proxy)
>>> urllib2.install_opener(opener)

来自here

修改

我是这样做的:

exclusion_list = ['http://www.google.com/', 'http://localhost/']

no_proxy = urllib2.ProxyHandler({})
no_proxy_opener = urllib2.build_opener(no_proxy)

default_proxy_opener = urllib2.build_opener()

url = 'http://www.example.com/'

if url in exclusion_list:
    opener = no_proxy_opener
else:
    opener = default_proxy_opener

page = opener.open(url)
print page

您最大的问题是将网址与排除列表相匹配,但这是一个全新的问题。