美文网首页
2. Urllib -- urllib.error

2. Urllib -- urllib.error

作者: 江湖十年 | 来源:发表于2018-06-14 11:26 被阅读67次

    一、异常类

    1. URLError
      由 request 模块产生的异常都可以通过 urllib.error.URLError 来捕获,是 error 模块的基类。它是OSError的一个子类。

    属性:

    • reason 返回错误原因
    • 实例
    import urllib.request
    import urllib.error
    
    
    try:
        response = urllib.request.urlopen('http://www.test.cn/')
    except urllib.error.URLError as e:
        print(e)
        print(e.reason)  # reason 属性可以返回错误原因
    
    HTTP Error 500: Internal Privoxy Error
    Internal Privoxy Error
    
    1. HTTPError
      URLError的一个子类,通常用来处理HTTP请求错误,例如请求身份验证失败。

    属性:

    • code,返回 HTTP Status Code,即状态码,比如 404 网页不存在,500 服务器内部错误等等。
    • reason,同父类一样,返回错误的原因。
    • headers,返回 Response Headers。
    • 实例
    import urllib.request
    import urllib.error
    
    
    try:
        response = urllib.request.urlopen('http://www.test.cn/')
    except urllib.error.HTTPError as e:
        # print(e)
        print(e.reason)
        print()
        print(e.code)
        print()
        print(e.headers)
    
    Internal Privoxy Error
    
    500
    
    Content-Length: 744
    Content-Type: text/html
    Cache-Control: no-cache
    Date: Wed, 02 May 2018 10:17:06 GMT
    Last-Modified: Wed, 02 May 2018 10:17:06 GMT
    Expires: Sat, 17 Jun 2000 12:00:00 GMT
    Pragma: no-cache
    Connection: close
    

    二、完整代码实例

    • 实例1 -- 访问https
    import urllib.request
    import urllib.error
    import socket
    
    
    try:
        response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01)  # 访问https
        # response = urllib.request.urlopen('http://www.baidu.com', timeout=0.01)
    except urllib.error.HTTPError as e:
        # print(e)
        print(e.reason)
        print(e.code)
        print(e.headers)
    except urllib.error.URLError as e:
        print(e)
        print(e.reason)  # 这里reason属性返回的不再是字符串, 而是一个对象
        print(type(e.reason))
        if isinstance(e.reason, socket.timeout):
            print('time out error')
    except Exception as e:
        print(e)
        print(1)
    
    <urlopen error _ssl.c:733: The handshake operation timed out>
    _ssl.c:733: The handshake operation timed out
    <class 'socket.timeout'>
    time out error
    
    • 实例2 -- 访问http
    import urllib.request
    import urllib.error
    import socket
    
    
    try:
        # response = urllib.request.urlopen('https://www.baidu.com', timeout=0.01)
        response = urllib.request.urlopen('http://www.baidu.com', timeout=0.01)  # 访问http
    except urllib.error.HTTPError as e:
        # print(e)
        print(e.reason)
        print(e.code)
        print(e.headers)
    except urllib.error.URLError as e:
        print(e)
        print(e.reason)  # 这里reason属性返回的不再是字符串, 而是一个对象
        print(type(e.reason))
        if isinstance(e.reason, socket.timeout):
            print('time out error')
    except Exception as e:
        print(e)
        print(1)
    
    timed out
    1
    
    • 由以上2个实例可以发现,有些网站(目前只发现百度这样),当访问 https 链接时,timeout 异常会被 urllib.error.URLError 捕获,访问 http 链接时,timeout 异常则不会被 urllib.error.URLError 捕获

    相关文章

      网友评论

          本文标题:2. Urllib -- urllib.error

          本文链接:https://www.haomeiwen.com/subject/vaicrftx.html