python爬虫学习8
-
异常处理
我们已经知道如何发送请求,但是在网络不好的情况下,如果出现异常该怎么办?
urllib库中的error模块定义了由request模块产生的异常。
# URLError 类来自urllib库中的error模块,继承自 OSError 类,是error异常处理模块的基类。 from urllib import request,error url = 'https://cuiqingcai.com/404' try: resp = request.urlopen(url) except error.URLError as e: print(e.reason)
运行结果,我们打开了一个不存在的页面,照理来说会报错,但是我们捕获了这个异常:
-
HTTPError
- 是URLError的子类,专门用来处理HTTP请求错误,有以下三个属性:
- code 返回HTTP状态码,例如404(网页不存在),500(服务器内部错误)
- reason 同父类,用于返回错误原因。
- headers 返回请求头。
- 实例
# HTTPError 类 from urllib import request,error url = 'https://cuiqingcai.com/404' try: resp = request.urlopen(url) except error.HTTPError as e: print(e.reason,e.code,e.headers,sep='\n')
运行结果:
- 因为URLError是HTTPError的父类,所以可以选择先捕获子类的错误,再捕获父类。
from urllib import request,error url = "https://cuiqingcai.com/404" try: resp = request.urlopen(url) except error.HTTPError as e0: print(e0.reason, e0.code, e0.headers, sep='\n') except error.URLError as e1: print(e1.reason) else: print('请求成功!')
- 有时 reason返回的不一定是一个字符串,也可能是一个对象:
import socket import urllib.request import urllib.error url = 'https://www.baidu.com' timeout = 0.01 try: resp = urllib.request.urlopen(url,timeout=timeout) except urllib.error.URLError as e: print(e.reason) if isinstance(e.reason,socket.timeout): print('Time Out !')
可以看出,reason属性的结果是一个socket.timeout类:
- 是URLError的子类,专门用来处理HTTP请求错误,有以下三个属性:
-
-
解析连接
前面我们知道,urllib中的parse模块定义了处理URL的接口,通过调用该模块我们可以实现,例如URL各部分的抽取、合并以及连接转换。
下面,让我们一起了解几个parse模块中的常用方法:
未完待续
好吧,它好像断在了奇奇怪怪的地方了。。。