人生苦短,我用 Python

引言

前面两篇基础,我们介绍请求发送的过程。

不知道各位同学有没有想过这样一个问题,如果在爬虫运行的过程中,网络突然波动了下,比如突然网速很慢很慢,造成当前的请求超时,程序很可能会直接挂掉。

这种处理方式显然不是我们希望看到的,我们希望看到的肯定是如果当前的请求挂掉,那就挂掉,不要影响其他的请求或者是下一次的请求。

那么,我们在发送请求的时候,异常处理就显得十分有必要。

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!')

对Python感兴趣或者是正在学习的小伙伴,可以加入我们的Python学习扣qun:855408893 ,从0基础的python脚本到web开发、爬虫、django、数据挖掘数据分析等,0基础到项目实战的资料都有整理。送给每一位python的小伙伴!每晚分享一些学习的方法和需要注意的小细节,学习路线规划,利用编程赚外快。点击加入我们的 python学习圈

Python爬虫教程:urllib 基础使用(三)相关推荐

  1. python补充urllib教程,Python爬虫之urllib基础用法教程

    综述 本系列文档用于对Python爬虫技术进行简单的教程讲解,巩固自己技术知识的同时,万一一不小心又正好对你有用那就更好了. Python 版本是3.7.4 urllib库介绍 它是 Python 内 ...

  2. 无敌python爬虫教程学习笔记(二)

    系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 手刃一个小爬虫 系列文章目 ...

  3. 无敌python爬虫教程学习笔记(一)

    python爬虫系列文章目录 无敌python爬虫教程学习笔记(一) 无敌python爬虫教程学习笔记(二) 无敌python爬虫教程学习笔记(三) 无敌python爬虫教程学习笔记(四) 本文目录 ...

  4. Python爬虫教程(一):基础知识

    目录 01 基础知识 1.1 渲染 1.2 http(超文本传输协议)协议 1.3 requests进阶 02 数据解析 2.1 re模块 2.2 bs4模块 2.3 xpath模块 01 基础知识 ...

  5. Python爬虫之XPath基础教程:用代码抓取网页数据

    Python爬虫之XPath基础教程:用代码抓取网页数据 在网络时代,网页数据是获取信息和进行分析的最重要的来源之一.Python的爬虫技术让我们可以轻松抓取网页数据,并进行数据处理.XPath是一种 ...

  6. 在职爬虫工程师,带给大家超简单 Python 爬虫教程

    本篇 Python 爬虫教程主要讲解以下5部分内容,请按照顺序进行学习. 爬虫概述:介绍什么是爬虫,爬虫的目的和应用. 爬虫基础知识:介绍爬虫的基本概念,例如网络协议,HTML 结构,CSS 样式表等 ...

  7. python爬虫设计在哪里_《python 爬虫教程 知乎》 怎样用Python设计一个爬虫模拟登陆知乎...

    <python 爬虫教程 知乎> 怎样用Python设计一个爬虫模拟登陆知乎 python 爬虫教程 知乎2020-09-23 01:45:13人已围观 怎样用Python设计一个爬虫模拟 ...

  8. Python爬虫之urllib模块2

    Python爬虫之urllib模块2 本文来自网友投稿 作者:PG-55,一个待毕业待就业的二流大学生. 看了一下上一节的反馈,有些同学认为这个没什么意义,也有的同学觉得太简单,关于Beautiful ...

  9. 爬虫python代码-Python爬虫教程:200行代码实现一个滑动验证码

    Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...

  10. python爬虫代码-Python爬虫教程:200行代码实现一个滑动验证码

    Python爬虫教程:教你用200行代码实现一个滑动验证码 做网络爬虫的同学肯定见过各种各样的验证码,比较高级的有滑动.点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大 ...

最新文章

  1. Java源码详解四:String源码分析--openjdk java 11源码
  2. 使用STC8G1K08制作调频接收模块TEA5767配置电路
  3. 将数组放进集合中的简单方法
  4. 窥视各大网站到底有没有的BUG?
  5. 开闭原则------(转)
  6. IntelliJ IDEA如何查看接口的实现类以及如何查看被实现的接口
  7. 【Python CheckiO 题解】Pawn Brotherhood
  8. 用SQL语句查看数据库数据量的大小
  9. Nginx系列1之部分模块详解
  10. Scrum立会报告+燃尽图(十月二十四日总第十五次)
  11. JUNIT Hello World
  12. antd树型选择控件选择父级_element的tree树形菜单回显、父级半勾选
  13. 服务器群晖系统安装,使用电脑为群晖NAS安装DSM操作系统
  14. 苹果手机录屏软件_手机游戏录屏软件哪个好用 好用手机游戏录屏软件介绍
  15. java猜数字1到100_Java实现简单猜数字小游戏
  16. 当天使爱上吸血鬼,上帝开始哭泣
  17. 游戏制作之路-unity捕鱼达人(一 开始以及加载界面的制作)
  18. 分布式数据库如何实现主键全局自增?
  19. nuScenes数据集详细介绍
  20. 网吧服务器掉硬盘,网吧服务器磁盘压力大的解决过程

热门文章

  1. 高考报志愿选什么专业?
  2. 23种设计模式汇总整理
  3. openmv使用总结笔记(基础篇)
  4. 乐观锁与悲观锁的区别
  5. Redis中的乐观锁和悲观锁
  6. [linux] 5 更改文件属性
  7. HYPER-V:无法打开虚拟机XXX,因为虚拟机监控程序未运行
  8. STL vector 容器介绍 (转载)
  9. 上拉电阻和下拉电阻的区别
  10. 原创丨智合同AI开放平台