资讯专栏INFORMATION COLUMN

Python3网络爬虫实战---21、使用Urllib:处理异常

hlcfan / 503人阅读

摘要:最后用来处理正常的逻辑,这是一个较好的异常处理写法。上一篇文章网络爬虫实战使用发送请求下一篇文章网络爬虫实战使用解析链接

上一篇文章:Python3网络爬虫实战---20、使用Urllib:发送请求
下一篇文章:Python3网络爬虫实战---22、使用Urllib:解析链接

在前面一节我们了解了 Request 的发送过程,但是在网络情况不好的情况下,出现了异常怎么办呢?这时如果我们不处理这些异常,程序很可能报错而终止运行,所以异常处理还是十分有必要的。

Urllib 的 error 模块定义了由 request 模块产生的异常。如果出现了问题,request 模块便会抛出 error 模块中定义的异常,本节会对其进行详细的介绍。

1. URLError

URLError 类来自 Urllib 库的 error 模块,它继承自 OSError 类,是 error 异常模块的基类,由 request 模块生的异常都可以通过捕获这个类来处理。

它具有一个属性 reason,即返回错误的原因。

下面用一个实例来感受一下:

from urllib import request, error
try:
    response = request.urlopen("http://cuiqingcai.com/index.htm")
except error.URLError as e:
    print(e.reason)

我们打开一个不存在的页面,照理来说应该会报错,但是这时我们捕获了 URLError 这个异常,运行结果如下:

Not Found

程序没有直接报错,而是输出了如上内容,这样通过如上操作,我们就可以避免程序异常终止,同时异常得到了有效处理。

2. HTTPError

它是 URLError 的子类,专门用来处理 HTTP 请求错误,比如认证请求失败等等。

它有三个属性。

code,返回 HTTP Status Code,即状态码,比如 404 网页不存在,500 服务器内部错误等等。

reason,同父类一样,返回错误的原因。

headers,返回 Request Headers。

下面我们来用几个实例感受一下:

from urllib import request,error
try:
    response = request.urlopen("http://cuiqingcai.com/index.htm")
except error.HTTPError as e:
    print(e.reason, e.code, e.headers, sep="
")

运行结果:

Not Found
404
Date: Mon, 17 Jun 2019 04:52:50 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Connection: close
Vary: Accept-Encoding
Status: 404 Not Found
Cache-Control: no-cache
Strict-Transport-Security: max-age=31536000
X-XSS-Protection: 1; mode=block
X-Request-Id: e65fb029-a4fd-46e2-91c3-9616ccc2f879
X-Runtime: 0.006814
X-Frame-Options: SAMEORIGIN
X-Content-Type-Options: nosniff
X-Powered-By: Phusion Passenger 6.0.2
Server: nginx + Phusion Passenger 6.0.2

依然是同样的网址,在这里我们捕获了 HTTPError 异常,输出了 reason、code、headers 属性。

因为 URLError 是 HTTPError 的父类,所以我们可以先选择捕获子类的错误,再去捕获父类的错误,所以上述代码更好的写法如下:

from urllib import request, error

try:
    response = request.urlopen("http://cuiqingcai.com/index.htm")
except error.HTTPError as e:
    print(e.reason, e.code, e.headers, sep="
")
except error.URLError as e:
    print(e.reason)
else:
    print("Request Successfully")

这样我们就可以做到先捕获 HTTPError,获取它的错误状态码、原因、Headers 等详细信息。如果非 HTTPError,再捕获 URLError 异常,输出错误原因。最后用 else 来处理正常的逻辑,这是一个较好的异常处理写法。

有时候 reason 属性返回的不一定是字符串,也可能是一个对象,我们再看下面的实例:

import socket
import urllib.request
import urllib.error

try:
    response = urllib.request.urlopen("https://www.baidu.com", timeout=0.01)
except urllib.error.URLError as e:
    print(type(e.reason))
    if isinstance(e.reason, socket.timeout):
        print("TIME OUT")

在这里我们直接设置了超时时间来强制抛出 timeout 异常。

运行结果如下:


TIME OUT

可以发现 reason 属性的结果是 socket.timeout 类。所以在这里我们可以用 isinstance() 方法来判断它的类型,做出更详细的异常判断。

3. 结语

本节讲述了 error 模块的相关用法,通过合理地捕获异常可以做出更准确的异常判断,使得程序更佳稳健。

上一篇文章:Python3网络爬虫实战---20、使用Urllib:发送请求
下一篇文章:Python3网络爬虫实战---22、使用Urllib:解析链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44073.html

相关文章

  • Python3网络爬虫实战---22、使用Urllib:解析链接

    摘要:上一篇文章网络爬虫实战使用处理异常下一篇文章网络爬虫实战使用分析协议库里还提供了这个模块,它定义了处理的标准接口,例如实现各部分的抽取,合并以及链接转换。上一篇文章网络爬虫实战使用处理异常下一篇文章网络爬虫实战使用分析协议 上一篇文章:Python3网络爬虫实战---21、使用Urllib:处理异常下一篇文章:Python3网络爬虫实战---23、使用Urllib:分析Robots协议...

    betacat 评论0 收藏0
  • Python3网络爬虫实战---20、使用Urllib:发送请求

    摘要:下面我们传入多个参数构建一个来感受一下在这里我们通过四个参数构造了一个,即请求,在中指定了和,传递的参数用了和方法来转成字节流,另外指定了请求方式为。运行结果如下通过观察结果可以发现,我们成功设置了,以及。用于处理重定向。 上一篇文章:Python3网络爬虫实战---19、代理基本原理下一篇文章:Python3网络爬虫实战---21、使用Urllib:处理异常 学习爬虫,最初的操作便...

    kun_jian 评论0 收藏0
  • Python3网络爬虫实战---17、爬虫基本原理

    摘要:在前面我们讲到了和的概念,我们向网站的服务器发送一个,返回的的便是网页源代码。渲染页面有时候我们在用或抓取网页时,得到的源代码实际和浏览器中看到的是不一样的。所以使用基本请求库得到的结果源代码可能跟浏览器中的页面源代码不太一样。 上一篇文章:Python3网络爬虫实战---16、Web网页基础下一篇文章:Python3网络爬虫实战---18、Session和Cookies 爬虫,即网...

    hellowoody 评论0 收藏0
  • Python3网络爬虫实战---25、requests:高级用法

    摘要:比如我们以知乎为例,直接利用来维持登录状态。测试后,发现同样可以正常登录知乎。上一篇文章网络爬虫实战基本使用下一篇文章网络爬虫实战正则表达式 上一篇文章:Python3网络爬虫实战---24、requests:基本使用下一篇文章:Python3网络爬虫实战---26、正则表达式 在前面一节我们了解了 Requests 的基本用法,如基本的 GET、POST 请求以及 Response...

    dingding199389 评论0 收藏0
  • Python3网络爬虫实战---23、使用Urllib:分析Robots协议

    摘要:比如我们可以设置这就代表我们设置的规则对百度爬虫是有效的。上一篇文章网络爬虫实战使用解析链接下一篇文章网络爬虫实战基本使用 上一篇文章:Python3网络爬虫实战---22、使用Urllib:解析链接下一篇文章:Python3网络爬虫实战---24、requests:基本使用 利用 Urllib 的 robotparser 模块我们可以实现网站 Robots 协议的分析,本节我们来简...

    kaka 评论0 收藏0

发表评论

0条评论

hlcfan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<