Python3爬虫(3)_urllib.error
注:参照https://blog.csdn.net/c406495762/article/details/59488464
Learn_ERROR:
urllib.error可以接收有urllib.request产生的异常。urllib.error有两个方法,URLError和HTTPError。如下图所示:
URLError是OSError的一个子类,HTTPError是URLError的一个子类,服务器上HTTP的响应会返回一个状态码,根据这个HTTP状态码,我们可以知道我们的访问是否成功。例如第二个笔记中提到的200状态码,表示请求成功,再比如常见的404错误等。
1.URLError
让我们先看下URLError的异常,创建文件,编写代码:
from urllib import request from urllib import error if __name__ == "__main__": #和原博主一样,找一个并不存在的网址 url = "http://www.baidu.com/" req = request.Request(url) try: response = request.urlopen(req) html = response.read().decode('utf-8') print(html) except error.URLError as e: print(e.reason)
显示:
RESTART: C:\Users\DELL\AppData\Local\Programs\Python\Python36\urllib_test01.py
[Errno 11001] getaddrinfo failed
2.HTTPError
再看下HTTPError异常,编写如下代码:
from urllib import request from urllib import error if __name__ == "__main__": #一个不存在的连接 url = "http://www.douyu.com/WittPeng.html" req = request.Request(url) try: responese = request.urlopen(req) # html = responese.read() except error.HTTPError as e: print(e.code)
RESTART: C:\Users\DELL\AppData\Local\Programs\Python\Python36\urllib_test01.py
403
说明请求的资源没有在服务器上找到,有这个服务器,但是有WittPeng.html资源
其实我也打过一段时间的直播,可是观众不送火箭,当然我也不叫WittPeng。
二.URLError和HTTPError混合使用
最后值得注意的一点是,如果想用HTTPError和URLError一起捕获异常,那么需要将HTTPError放在URLError的前面,因为HTTPError是URLError的一个子类。如果URLError放在前面,出现HTTP异常会先响应URLError,这样HTTPError就捕获不到错误信息了。
如果不用上面的方法,也可以使用hasattr函数判断URLError含有的属性,如果含有reason属性表明是URLError,如果含有code属性表明是HTTPError。代码如下:
from urllib import request from urllib import error if __name__ == "__main__": #一个不存在的连接 url = "http://www.douyu.com/WittPeng.html" req = request.Request(url) try: responese = request.urlopen(req) except error.URLError as e: if hasattr(e, 'code'): print("HTTPError") print(e.code) elif hasattr(e, 'reason'): print("URLError") print(e.reason)
输出结果为:
RESTART: C:\Users\DELL\AppData\Local\Programs\Python\Python36\urllib_test01.py
HTTPError
403