人生苦短,我用 Python

引言

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

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

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

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

urllib 的 error 模块定义了由 request 模块产生的异常,如果出现问题, request 模块便会抛出 error 模块中定义的异常。

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

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 的父类,所以可以先选择捕获子类的错误,再去捕获父类的错误,这样对异常的处理更具针对性。

注意: 捕捉异常一般先捕捉子类异常,再捕捉父类异常。

所以我们可以更改下前面的异常捕捉的代码进行一些优化:

在学习过程中有什么不懂得可以加我的
python学习扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
# 优化异常捕捉代码
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 爬虫(13):urllib 基础使用(三)相关推荐

  1. python学起来难不难-零基础学Python爬虫难不难?要怎么学?

    零基础学Python爬虫难不难?要怎么学?众所周知,Python是最容易上手的编程语言,如果有一定基础,学会Python爬虫也是分分钟钟的事.对于零基础的学习者来说,Python爬虫也是比较简单的,只 ...

  2. 爬虫取中间文本_零基础学 Python 爬虫 I:了解爬虫基础

    人生苦短,我用 Python 引言 各位同学大家好,好久不见(可能只有一两天没见:囧)~~~ 先讲一件事情,昨天为啥没更新. emmmmmmmmm,当然是因为加班啦,快到年底了,公司项目比较忙,最近的 ...

  3. 0基础学python有多难-0基础学Python有多难?

    0基础学Python有多难?该怎么入门?零基础学Python并不难,因为Python是一门非常适合初学者入门的编程语言.Python语法简单明了,代码可读性很高,容易入门.但Python对代码的要求非 ...

  4. 0基础学python难吗-0基础学武汉Python开发课程有多难?该怎么入门?

    Python语言可谓十分强大,正如它的两个外号所称,一个是"内置电池",另一个是"胶水语言".开源社区和独立开发者长期为Python贡献了丰富大量的第三方库,其 ...

  5. 0基础学python难吗-0基础学Python有多难?该怎么入门?

    0基础学Python有多难?该怎么入门?零基础学Python并不难,因为Python是一门非常适合初学者入门的编程语言.Python语法简单明了,代码可读性很高,容易入门.但Python对代码的要求非 ...

  6. 0基础学python有多难-0基础纯小白学Python,请注意这2个坑

    0基础的纯小白学Python有哪些坑需要避免?有没有适合小白的Python教材推荐? 很多纯0基础,毫无编程经验的小白在学习Python的过程中总是无法坚持下来,究其原因,其实就是因为毫无经验,方向不 ...

  7. 零基础学python爬虫-零基础如何学爬虫技术?一篇带你入门!(理论+实操+荐书)...

    对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情. 但掌握正确的方法,在短时间内做到能够爬取主流网站的数据,其实非常容易实现! 同时,你需要从一开始就有一个具体的目标!只有在目标的驱动下,你的 ...

  8. 零基础学python爬虫-我是如何零基础开始能写Python爬虫的

    刚开始接触爬虫的时候,简直惊为天人,十几行代码,就可以将无数网页的信息全部获取下来,自动选取网页元素,自动整理成结构化的文件. 利用这些数据,可以做很多领域的分析.市场调研,获得很多有价值的信息.这种 ...

  9. 零基础学 Python爬虫(5):前置准备(四)数据库基础

    人生苦短,我用 Python 本篇文章,我们接着介绍基础内容,数据库. 爬虫将数据爬取完成后,总要有地方存放吧,这个数据存在哪里呢? 当然是数据库中,那个说放在 Excel 里的,你给我站住! 当然 ...

最新文章

  1. LOADRUNNER 登陆功能测试实例(转)
  2. 【面试招聘】去不了大厂实习,小厂实习去吗?
  3. 通过IDEA查看jar包中的依赖关系
  4. racle的STRUCT和VARRAY的读写方法
  5. android linux内核开发环境,定制Android 4.2.2开发环境
  6. C - Internet Address CodeForces - 245B(有些思维的水题)
  7. 从原理到方法,一文讲清如何应对C语言内存泄露!
  8. 在Java 8中,有没有一种简洁的方法可以迭代带有索引的流?
  9. threadx系统_实时操作系统(RTOS)市场简报
  10. IDEA用maven创建springMVC项目和配置
  11. Mac上“照片”的终极工具箱​​​​ PowerPhotos
  12. Asp.net网站使用HttpHandler实现图片防盗链功能
  13. Velodyne 16线三维激光雷达
  14. Linux重置root密码和Linux基础命令
  15. jsb is not in the sudoers file. This incident will be reported.
  16. 小程序开发需要多少钱?
  17. 每日经典算法题(十六) 九九乘法表
  18. mysql血缘 表级血缘 字段级血缘GUDU GSP,JSQL PARSER,ANTLR MYSQL,DRUID
  19. 一种TV端自动化测试应用OTA升级的方法
  20. 【使用C++开发MCU】05-CAN实例之NXP S32K1 FlexCAN模块

热门文章

  1. 【VSCode】Windows 下搭建 Fortran 环境
  2. 机器学习数据科学包(三)——Pandas实例:MovieLens电影数据分析
  3. 亚马逊收购全食超市成中国新零售的学生,最终却会成为对手
  4. linux系统下安装微信
  5. 厉害了!用“Pandas”现在也可以绘制交互式的图形了!
  6. Debian 10创建文件夹和删除文件夹命令
  7. 【编译打包】tengine 1.5.1 SRPM
  8. linux vim后退出的命令
  9. 最近使用百度分享的api,引发 了一下问题,微博分享的页面跳转不成功
  10. php的getopt函数,PHP函数getopt详解