1.URLError简介
打开python标准库链接,https://docs.python.org/3.6/library/urllib.error.html。然后找到21.9. urllib.error — Exception classes raised by urllib.request,这个页面里的内容就是我们本文要探讨的问题。
The
urllib.error
module defines the exception classes for exceptions raised byurllib.request
. The base exception class isURLError
.exception
urllib.error.
URLError
The handlers raise this exception (or derived exceptions) when they run into a problem. It is a subclass ofOSError
.
reason
The reason for this error. It can be a message string or another exception instance.
exception
urllib.error.
HTTPError
Though being an exception (a subclass of
URLError
), anHTTPError
can also function as a non-exceptional file-like return value (the same thing thaturlopen()
returns). This is useful when handling exotic HTTP errors, such as requests for authentication.
code
- An HTTP status code
reason
- This is usually a string explaining the reason for this error.
headers
- The HTTP response headers for the HTTP request that caused the
HT
TPError
.
大家大概浏览一下,四级英语水平的我都能看懂个大概,大家应该也可以的。
urllib.error
模块定义了一些由urllib.request
产生的异常,这个模块中最基本的类是URLError(基类)
。这个类是OSError的子类
。当URL访问出现异常情况的时候,urllib.error.
URLError
这个类就会处理这些异常情况。
urllib.error.
HTTPError
是URLError这个类的子类。code是爆出异常的状态码,reason是异常的原因说明。
2.HTTPError 状态码总结
100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。
101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。只有在切换新的协议更有好处的时候才应该采取类似措施。
102:继续处理 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。
200:请求成功 处理方式:获得响应的内容,进行处理
201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到 处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完成 处理方式:阻塞等待
204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。 处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。 处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源 处理方式:重定向到分配的URL302:请求到的资源在一个不同的URL处临时保存 处理方式:重定向到临时的URL
304:请求的资源未更新 处理方式:丢弃
400:非法请求 处理方式:丢弃
401:未授权 处理方式:丢弃
403:禁止 处理方式:丢弃
404:没有找到 处理方式:丢弃
500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。一般来说,这个问题都会在服务器端的源代码出现错误时出现。
501:服务器无法识别 服务器不支持当前请求所需要的某个功能。当服务器无法识别请求的方法,并且无法支持其对任何资源的请求。
502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。
503:服务出错 由于临时的服务器维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复。
3.捕获HTTPError错误实例说明
HTTPError实例产生后,会有一个code属性,这个属性用来表示当前网络连接的状态码。下面来看几个实例:
1.不加try-except访问不存在网址
1 2 3 4 |
import urllib.request request = urllib.request.Request("http://www.zhuziwenzhuziwen.com") urllib.request.urlopen(request) |
运行结果如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Traceback (most recent call last): File "E:/技术学习/Python代码/13.异常捕获/exception.py", line 5, in <module> urllib.request.urlopen(request) File "D:\python\lib\urllib\request.py", line 223, in urlopen return opener.open(url, data, timeout) File "D:\python\lib\urllib\request.py", line 526, in open response = self._open(req, data) File "D:\python\lib\urllib\request.py", line 544, in _open '_open', req) File "D:\python\lib\urllib\request.py", line 504, in _call_chain result = func(*args) File "D:\python\lib\urllib\request.py", line 1346, in http_open return self.do_open(http.client.HTTPConnection, req) File "D:\python\lib\urllib\request.py", line 1320, in do_open raise URLError(err) urllib.error.URLError: <urlopen error [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。> |
2.添加try-except:
1 2 3 4 5 6 7 |
import urllib.request request = urllib.request.Request("http://www.zhuziwenzhuziwen.com") try: urllib.request.urlopen(request) except urllib.error.URLError as e: print(e.reason) |
运行结果如下:
1 2 3 4 |
D:\python\python.exe E:/技术学习/Python代码/13.异常捕获/exception.py [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。 进程已结束,退出代码0 |
3.403forbidden禁止访问
1 2 3 4 5 6 7 8 |
import urllib.request request = urllib.request.Request("https://blog.csdn.net/post") try: urllib.request.urlopen(request) except urllib.error.HTTPError as e: print(e.code) print(e.reason) |
运行结果如下:403,服务器禁止访问
1 2 3 4 5 |
D:\python\python.exe E:/技术学习/Python代码/13.异常捕获/exception.py 403 Forbidden 进程已结束,退出代码0 |
4.先写子类异常,再写父类异常
HTTPError的父类是URLError,根据编程经验,父类的异常应当写到子类异常的后面,如果子类捕获不到,那么可以捕获父类的异常,所以上述的代码可以这么改写
1 2 3 4 5 6 7 8 9 10 11 12 |
import urllib.error import urllib.request request = urllib.request.Request("https://blog.csdn.net/post") try: urllib.request.urlopen(request) except urllib.error.HTTPError as e: print(e.code) except urllib.error.URLError as e: print(e.reason) else: print("ok!") |
这里运行结果如下:
1 2 3 4 |
D:\python\python.exe E:/技术学习/Python代码/13.异常捕获/exception.py 403 进程已结束,退出代码0 |
咦~,怎么只有一个403状态码,没有打印出错误原因啊。原来是这样的,如果捕获到了HTTPError,则输出code,不会再处理URLError异常。如果发生的不是HTTPError,则会去捕获URLError异常,输出错误原因。
5.加入 hasattr属性提前对属性进行判断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import urllib.error import urllib.request request = urllib.request.Request("https://blog.csdn.net/post") try: urllib.request.urlopen(request) except urllib.error.HTTPError as e: if hasattr(e,"code"): print(e.code) except urllib.error.URLError as e: if hasattr(e,"reason"): print(e.reason) else: print("ok!") |
4.本章小结
本篇博文,我们一起学习了HTTPError和URLError两个类进行异常捕获的学习,再下一篇博文中,我们将要开始学习python的正则表达式,学完正则表达式之后,我们就开始做几个小项目进行练手,小项目完成之后,我们将开始学习高级的爬虫框架。大家一起加油!!
转载请注明:燕骏博客 » Python3.6爬虫入门自学教程之八:URLError异常处理
赞赏作者微信赞赏支付宝赞赏