小白学 Python 爬虫(13):urllib 基础使用(三)
人生苦短,我用 Python
前文传送门:
小白学 Python 爬虫(1):开篇
小白学 Python 爬虫(2):前置准备(一)基本类库的安装
小白学 Python 爬虫(3):前置准备(二)Linux基础入门
小白学 Python 爬虫(4):前置准备(三)Docker基础入门
小白学 Python 爬虫(5):前置准备(四)数据库基础
小白学 Python 爬虫(6):前置准备(五)爬虫框架的安装
小白学 Python 爬虫(7):HTTP 基础
小白学 Python 爬虫(8):网页基础
小白学 Python 爬虫(9):爬虫基础
小白学 Python 爬虫(10):Session 和 Cookies
小白学 Python 爬虫(11):urllib 基础使用(一)
小白学 Python 爬虫(12):urllib 基础使用(二)
引言
前面两篇基础,我们介绍请求发送的过程。
不知道各位同学有没有想过这样一个问题,如果在爬虫运行的过程中,网络突然波动了下,比如突然网速很慢很慢,造成当前的请求超时,程序很可能会直接挂掉。
这种处理方式显然不是我们希望看到的,我们希望看到的肯定是如果当前的请求挂掉,那就挂掉,不要影响其他的请求或者是下一次的请求。
那么,我们在发送请求的时候,异常处理就显得十分有必要。
urllib 的 error 模块定义了由 request 模块产生的异常,如果出现问题, request 模块便会抛出 error 模块中定义的异常。
URLError
URLError 这个类来自于 urllib 库的 error 模块,它继承自 OSError ,是 error 异常模块的基类,由 request 模块产生的异常都可以通过捕获这个类来处理。
它只有一个属性 reason ,即返回错误的原因。
我们来写一个简单的示例大家看一下:
from urllib import request, error# 访问明显不存在的地址,报错:Not Found
try:response = request.urlopen('https://www.geekdigging.com/aa')
except error.URLError as e:print(e.reason)# 访问超时,报错:timed out
try:response = request.urlopen('https://www.baidu.com', timeout=0.001)
except error.URLError as e:print(e.reason)
这里我们访问了一个明显不存在的链接和限定了极短的超时时间,这里会抛出异常,但是我们捕获了 URLError 这个异常,运行结果如下:
Not Found
timed out
程序没有直接抛出异常终止运行,而是输出了上面这个异常,通过这样的操作,我们可以避免程序异常终止,同时还可以对这个异常做出针对性的处理。
此外,异常捕捉抛出的异常不一定都是字符串类型,比如访问超时的报错,我们将打印结果的代码稍作改动:
from urllib import request, error
import socket# 异常类型示例
try:response = request.urlopen('https://www.baidu.com', timeout=0.001)
except error.URLError as e:print(type(e.reason))if isinstance(e.reason, socket.timeout):print('TIME OUT')
结果如下:
<class 'socket.timeout'>
TIME OUT
HTTPError
它是 URLError 的子类,专门用来处理 HTTP 请求错误,比如认证请求失败等。它有如下 3 个属性。
- code:返回HTTP状态码,比如404表示网页不存在,500表示服务器内部错误等。
- reason:同父类一样,用于返回错误的原因。
- headers:返回请求头。
还是先看一个最简单的示例:
from urllib import request, error# 访问明显不存在的地址,使用 HTTPError 捕捉异常
try:response = request.urlopen('https://www.geekdigging.com/aa')
except error.HTTPError as e:print(e.reason, e.code, e.headers, sep='\n')
运行结果如下:
Not Found
404
Date: Sun, 01 Dec 2019 15:11:48 GMT
Content-Type: text/html
Content-Length: 49307
Connection: close
Server: tencent-cos
Last-Modified: Sun, 01 Dec 2019 15:03:24 GMT
X-NWS-UUID-VERIFY: c89959eb27b89a0fb1c0326d1b2e7171
Accept-Ranges: bytes
ETag: "1bb6cc2c28a5621cf0c3238107edc229"
x-cos-error-code: NoSuchKey
x-cos-error-detail-Key: aa
x-cos-error-message: The specified key does not exist.
x-cos-request-id: NWRlM2Q4MzRfMzNhNzAzMDlfYTljZl8yNGU1NTgx
x-cos-trace-id: OGVmYzZiMmQzYjA2OWNhODk0NTRkMTBiOWVmMDAxODc0OWRkZjk0ZDM1NmI1M2E2MTRlY2MzZDhmNmI5MWI1OTQ5YWUxMjNkYTk3NzdjZmZlMDQzOTgxOThkOTNlOWFkOGJiN2YzOGQ5MDdjNGY0ODQ1MGIzYjUyMzg2NjFhNzc=
X-Daa-Tunnel: hop_count=2
X-NWS-LOG-UUID: 7c3fe80b-af9a-4e59-969b-10c8b3963a1d
X-Cache-Lookup: Hit From Upstream
X-Cache-Lookup: Hit From Upstream
因为 URLError 是 HTTPError 的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,这样对异常的处理更具针对性。
注意: 捕捉异常一般先捕捉子类异常,再捕捉父类异常。
所以我们可以更改下前面的异常捕捉的代码进行一些优化:
# 优化异常捕捉代码
try:response = request.urlopen('https://www.geekdigging.com/aa')
except error.HTTPError as e:print(e.reason, e.code, e.headers, sep='\n')
except error.URLError as e:print(e.reason)
else:print('Request Success!')
示例代码
本系列的所有代码小编都会放在代码管理仓库 Github 和 Gitee 上,方便大家取用。
示例代码-Github
示例代码-Gitee
参考
https://www.cnblogs.com/zhangxinqi/p/9170312.html
您的扫码关注,是对小编坚持原创的最大鼓励:)
小白学 Python 爬虫(13):urllib 基础使用(三)相关推荐
- python 使用socks 爬虫_小白学 Python 爬虫(17):Requests 基础使用
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- post python爬虫_小白学 Python 爬虫(17):Requests 基础使用
人生苦短,我用 Python 如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:) 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Py ...
- 小白学vb还是python_小白学 Python 爬虫(30):代理基础
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- python requests_小白学 Python 爬虫(18):Requests 进阶操作
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- class参数传入 python_小白学 Python 爬虫(20):Xpath 进阶
人生苦短,我用 Python 如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:) 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Py ...
- python 爬虫框架_小白学 Python 爬虫(28):自动化测试框架 Selenium (下)
人生苦短,我用 Python 如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:) 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Py ...
- 同花顺python_小白学 Python 爬虫(25):爬取股票信息
人生苦短,我用 Python 如果我的文章对您有帮助,请关注支持下作者的公众号:极客挖掘机,您的关注,是对小编坚持原创的最大鼓励:) 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Py ...
- 小白学 Python 爬虫(15):urllib 基础使用(五)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
- 小白学 Python 爬虫(11):urllib 基础使用(一)
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...
最新文章
- 来聊聊可形变卷积及其应用
- python-列表生成器
- 《你不知道的JavaScript》整理(四)——原型
- 实验一线性表的基本操作实现及其应用(JavaScript实现)
- 9.proc目录下的文件和目录详解
- 2017.3.29 longge的问题 失败总结
- 笔记6:Django基础
- centos 搭建nfs服务器
- 【疾病分类】基于matlab GUI模糊逻辑分类叶病严重程度分级系统【含Matlab源码 194期】
- Android中的内存泄露问题
- RS232与RS485协议原理及应用
- 【UE4 特效】粒子火焰
- IntelliJ IDEA2017.3 破解
- 两个服务器同步网站数据,两个服务器之间数据库同步
- PHPMailer 发送163网易企业邮箱和个人邮箱, 163邮箱可能无法发送gmail邮箱,可使用qq邮箱解决问题
- 从jupyter转换为exe格式
- 【opencv14】cv::Mat---Desne数组类
- salesforce chatter提醒带Mention(即@)
- Linux HA Cluster的实例演示(2)
- 求当前高度=n时,值x=多少?求解题思路
热门文章
- STM32单片机接直流减速电机编码器注意点
- React Native 连接夜神模拟器
- android音频编辑之音频裁剪的示例代码
- 怎么剪切音频的一部分 去掉音频中的某段内容
- 最新海洋CMS(海洋视频内容管理系统)V12.6版
- Android手机平板根目录详解
- 清理android根目录垃圾,寻找Android手机垃圾文件的根源
- php时间函数不准确,PHP中DATE函数与实际时间相差8小时的解决办法
- TP-LINK路由器WR703N刷openwrt固件挂载USB摄像头(上)
- LeetCode/LintCode 题解丨一周爆刷字符串:旋转字符数组