python3网络爬虫学习——基本库的使用(3)

这一节我们主要讲解处理异常

在我们发送请求的时候,有的时候可能网络不好,出现了异常,程序因为报错而终止运行,为此我们需要对其进行处理

urllib里的error模块定义了request模块产生的异常,下面便介绍里面的函数:

  • URLError

该类是继承自OSError类,是error异常模块的基类,由request模块产生的异常都可以由这个类捕抓,它具有一个reason属性

import urllib.error,urllib.request
try:
    response = urllib.request.urlopen('https://cuiqingcai.com/index.htm')
except urllib.error.URLError as e:
    print(e.reason)

正常程序会报错,但最终程序输出的却是Not Found

值得注意的是,在程序运行中,如果Import 的是import urllib.error那么后面使用的时候也要urllib.error.URLError,如果import的是from urllib impoort request,error那么后面就可以直接request.urlopen,error.URLError等

  • HTTPError

这个是URLError的子类,专门用来处理HTTP的请求错误,比如认证请求失败等,他有三个属性:

                  code:返回HTTP状态码,比如404表示网页不存在,505表示服务器内部错误

               reason:返回错误的原因

               headers:返回请求头

下面上实例:

from urllib import request,error
try:
    response = request.urlopen('https://cuiqingcai.com/index.htm')
except error.HTTPError as e:
    print(e.reason,e.code,e.headers)
===================== RESTART: F:\Python\exercise\ok.py ===================


Not Found 404 Server: nginx/1.10.3 (Ubuntu) Date: Fri, 17 Aug 2018 03:14:05 GMT Content-Type: text/html; charset=UTF-8 Transfer-Encoding: chunked Connection: close Vary: Cookie Expires: Wed, 11 Jan 1984 05:00:00 GMT Cache-Control: no-cache, must-revalidate, max-age=0 Link: <https://cuiqingcai.com/wp-json/>; rel="https://api.w.org/"

因为HTTPError是URLError的子类,所以可以选择捕获错误时先捕获子类的,再去捕获父类的

from urllib import request,error
try:
    response = request.urlopen('https://cuiqingcai.com/index.htm')
except error.HTTPError as e:
    print(e.reason,e.code,e.headers)
except error.URLError as e:
    print(e.reason)
else:
    print('Request Successfully')

有时候reason返回的不是一个字符串也可能为一个对象,这时候有可能要用到socket库

socket 是网络连接端点。例如当你的Web浏览器请求www.jb51.net上的主页时,你的Web浏览器创建一个socket并命令它去连接 www.jb51.net的Web服务器主机,Web服务器也对来自的请求在一个socket上进行监听。两端使用各自的socket来发送和 接收信息。

import socket
import urllib.request
import urllib.error

try:
    response = urllib.request.urlopen('https://www.baidu.com',timeout = 0.01)
except urllib.error.URLError as e:
    print(type(e.reason))
    if isinstance(e.reason,socket.timeout):
        print('TIME OUT')
===================== RESTART: F:\Python\exercise\ok.py ===================

<class 'socket.timeout'>
TIME OUT

 

可见设置超时时间使程序强制执行了timeout异常(type函数不会认为子类是父类的一种类型,但isinstance会认为是)

猜你喜欢

转载自www.cnblogs.com/gausstu/p/9500922.html