ITEEDU

bulid_opener()创建自己的opener对象

build_opener参数可以是许多个handler,中间用逗号分开。默认情况下:ProxyHandler,UnknowHandler,HTTPHandler,HTTPSHandler,HTTPDefaultErrorHandlerHTTPRedirectHandler,FTPHandler,FileHandler,HTTPErrorProcessoropener这些处理程序是可用的。

bulid_opener()返回的OpenerDirector对象是具有open(url[,data[,timeout]])方法,其作用是根据各种处理程序提供的规则打开URL,当然我们可以使用install_opener(opener)来安装不同的opener对象作为urlopen()使用的全局URL opener。

下面给出部分build_opener()的代码:

def build_opener(*handlers):

    opener = OpenerDirector()
    default_classes = [ProxyHandler, UnknownHandler, HTTPHandler,
                       HTTPDefaultErrorHandler, HTTPRedirectHandler,
                       FTPHandler, FileHandler, HTTPErrorProcessor]
    if hasattr(httplib, 'HTTPS'):
        default_classes.append(HTTPSHandler)
    skip = set()
    for klass in default_classes:
        for check in handlers:
            if isclass(check):
                if issubclass(check, klass):
                    skip.add(klass)
            elif isinstance(check, klass):
                skip.add(klass)
    for klass in skip:
        default_classes.remove(klass)

    for klass in default_classes:
        opener.add_handler(klass())

    for h in handlers:
        if isclass(h):
            h = h()
        opener.add_handler(h)
    return opener