1.异常处理
在已经掌握了基本的爬虫技能,但是如果再发送请求中出现异常,如网络不好,请求被拒等情况,就可能出现报错而终止运行程序。
urllib的error模块定义了由request模块产生的异常。如果出现了问题,request模块便会爆出error模块中定义的异常。现在就使用error模块来处理各种异常。
1.1URLErrror
URLError类来自urllib的error模块,它继承自OSError类,是error异常模块的基类,由request模块所产生的异常都可以通过它来捕获。
它的一个重要属性reason,返回错误原因,有助于我们判断异常类型。
from urllib import request,error
try:
request.urlopen('https://blog.csdn.net/Watson_Ashin/nothispage')
except error.URLError as e:
print(e.reason)
==> Not Found
上面我们访问了一个不存在的地址,最终返回的是"Not Found",且程序并没有报错,就是说我们成功处理了异常,而程序依然再运行。
1.2HTTPERROR
它是URLError的子类,专门用来处理HTTP请求错误,比如认证请求失败等问题。它有如下三个属性:
- code: 返回HETTP状态码,比如404表示网页不存在,500表示服务器内部错误等。
- reason:返回错误原因
- headers:返回请求头
from urllib import request,error
try:
request.urlopen('https://blog.csdn.net/Watson_Ashin/nothispage')
except error.HTTPError as e:
print(e.reason,e.code,e.headers,sep='\n')
==>输出如下
Not Found
404
Server: openresty
Date: Mon, 10 Feb 2020 07:36:31 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 15600
Connection: close
Vary: Accept-Encoding
Set-Cookie: uuid_tt_dd=10_18823982490-1581320191409-585554; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
Set-Cookie: dc_session_id=10_1581320191409.605227; Expires=Thu, 01 Jan 2025 00:00:00 GMT; Path=/; Domain=.csdn.net;
ETag: "5e3b798b-3cf0"
上面的代码就返回了错误原因,错误码和请求头。因为URLError是HTTPerror的父类,所以根据规范应该先捕获子类,再捕获父类,所以代码如下:
from urllib import request,error
try:
request.urlop