零基础写python爬虫之HTTP异常处理


Posted in Python onNovember 05, 2014

先来说一说HTTP的异常处理问题。
当urlopen不能够处理一个response时,产生urlError。
不过通常的Python APIs异常如ValueError,TypeError等也会同时产生。
HTTPError是urlError的子类,通常在特定HTTP URLs中产生。

1.URLError
通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。
这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),
包含了一个错误号和一个错误信息。
我们建一个urllib2_test06.py来感受一下异常的处理:

import urllib2  

req = urllib2.Request('http://www.baibai.com')  

try: urllib2.urlopen(req)  

except urllib2.URLError, e:    

    print e.reason 

按下F5,可以看到打印出来的内容是:
[Errno 11001] getaddrinfo failed
也就是说,错误号是11001,内容是getaddrinfo failed

2.HTTPError

服务器上每一个HTTP 应答对象response包含一个数字"状态码"。
有时状态码指出服务器无法完成请求。默认的处理器会为你处理一部分这种应答。
例如:假如response是一个"重定向",需要客户端从别的地址获取文档,urllib2将为你处理。
其他不能处理的,urlopen会产生一个HTTPError。
典型的错误包含"404"(页面无法找到),"403"(请求禁止),和"401"(带验证请求)。
HTTP状态码表示HTTP协议所返回的响应的状态。
比如客户端向服务器发送请求,如果成功地获得请求的资源,则返回的状态码为200,表示响应成功。
如果请求的资源不存在, 则通常返回404错误。

HTTP状态码通常分为5种类型,分别以1~5五个数字开头,由3位整数组成:
------------------------------------------------------------------------------------------------
200:请求成功      处理方式:获得响应的内容,进行处理
201:请求完成,结果是创建了新资源。新创建资源的URI可在响应的实体中得到    处理方式:爬虫中不会遇到
202:请求被接受,但处理尚未完成    处理方式:阻塞等待
204:服务器端已经实现了请求,但是没有返回新的信 息。如果客户是用户代理,则无须为此更新自身的文档视图。    处理方式:丢弃
300:该状态码不被HTTP/1.0的应用程序直接使用, 只是作为3XX类型回应的默认解释。存在多个可用的被请求资源。    处理方式:若程序中能够处理,则进行进一步处理,如果程序中不能处理,则丢弃
301:请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源    处理方式:重定向到分配的URL
302:请求到的资源在一个不同的URL处临时保存     处理方式:重定向到临时的URL
304 请求的资源未更新     处理方式:丢弃
400 非法请求     处理方式:丢弃
401 未授权     处理方式:丢弃
403 禁止     处理方式:丢弃
404 没有找到     处理方式:丢弃
5XX 回应代码以“5”开头的状态码表示服务器端发现自己出现错误,不能继续执行请求    处理方式:丢弃
------------------------------------------------------------------------------------------------

HTTPError实例产生后会有一个整型'code'属性,是服务器发送的相关错误号。

Error Codes错误码

因为默认的处理器处理了重定向(300以外号码),并且100-299范围的号码指示成功,所以你只能看到400-599的错误号码。
BaseHTTPServer.BaseHTTPRequestHandler.response是一个很有用的应答号码字典,显示了HTTP协议使用的所有的应答号。
当一个错误号产生后,服务器返回一个HTTP错误号,和一个错误页面。
你可以使用HTTPError实例作为页面返回的应答对象response。
这表示和错误属性一样,它同样包含了read,geturl,和info方法。
我们建一个urllib2_test07.py来感受一下:

import urllib2  

req = urllib2.Request('https://3water.com/callmewhy')  

try:  

    urllib2.urlopen(req)  

except urllib2.URLError, e:  

    print e.code  

    #print e.read() 

按下F5可以看见输出了404的错误码,也就说没有找到这个页面。

3.Wrapping

所以如果你想为HTTPError或URLError做准备,将有两个基本的办法。推荐使用第二种。
我们建一个urllib2_test08.py来示范一下第一种异常处理的方案:

from urllib2 import Request, urlopen, URLError, HTTPError  

req = Request('https://3water.com/callmewhy')  

try:  

    response = urlopen(req)  

except HTTPError, e:  

    print 'The server couldn\'t fulfill the request.'  

    print 'Error code: ', e.code  

except URLError, e:  

    print 'We failed to reach a server.'  

    print 'Reason: ', e.reason  

else:  

    print 'No exception was raised.'  

    # everything is fine 

和其他语言相似,try之后捕获异常并且将其内容打印出来。
这里要注意的一点,except HTTPError 必须在第一个,否则except URLError将同样接受到HTTPError 。
因为HTTPError是URLError的子类,如果URLError在前面它会捕捉到所有的URLError(包括HTTPError )。

我们建一个urllib2_test09.py来示范一下第二种异常处理的方案:

from urllib2 import Request, urlopen, URLError, HTTPError  

req = Request('https://3water.com/callmewhy')  

try:    

    response = urlopen(req)    

except URLError, e:    

    if hasattr(e, 'code'):    

        print 'The server couldn\'t fulfill the request.'    

        print 'Error code: ', e.code    

    elif hasattr(e, 'reason'):    

        print 'We failed to reach a server.'    

        print 'Reason: ', e.reason    

else:    

    print 'No exception was raised.'    

    # everything is fine   
Python 相关文章推荐
python的Template使用指南
Sep 11 Python
python实现同时给多个变量赋值的方法
Apr 30 Python
详解Python字符串对象的实现
Dec 24 Python
Python与Java间Socket通信实例代码
Mar 06 Python
Python3下错误AttributeError: ‘dict’ object has no attribute’iteritems‘的分析与解决
Jul 06 Python
Python3之文件读写操作的实例讲解
Jan 23 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
May 18 Python
Virtualenv 搭建 Py项目运行环境的教程详解
Jun 22 Python
通用的Django注册功能模块实现方法
Feb 05 Python
Jupyter notebook 更改文件打开的默认路径操作
May 21 Python
Python中的np.argmin()和np.argmax()函数用法
Jun 02 Python
Python人工智能之混合高斯模型运动目标检测详解分析
Nov 07 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 #Python
零基础写python爬虫之爬虫的定义及URL构成
Nov 04 #Python
使用Python编写简单网络爬虫抓取视频下载资源
Nov 04 #Python
Python爬取Coursera课程资源的详细过程
Nov 04 #Python
使用python开发vim插件及心得分享
Nov 04 #Python
Python学习笔记之os模块使用总结
Nov 03 #Python
Python中获取网页状态码的两个方法
Nov 03 #Python
You might like
PHP新手上路(十)
2006/10/09 PHP
discuz7 phpMysql操作类
2009/06/21 PHP
php下使用strpos需要注意 === 运算符
2010/07/17 PHP
php中3种方法统计字符串中每种字符的个数并排序
2012/08/27 PHP
Centos6.5和Centos7 php环境搭建方法
2016/05/27 PHP
Javascript 面试题随笔
2011/03/31 Javascript
ComboBox 和 DateField 在IE下消失的解决方法
2013/08/30 Javascript
禁止IE用右键的JS代码
2013/12/30 Javascript
jquery图片轮播插件仿支付宝2013版全屏图片幻灯片
2014/04/03 Javascript
纯js实现div内图片自适应大小(已测试,兼容火狐)
2014/06/16 Javascript
Google 地图控件集详解及实例代码
2016/08/06 Javascript
JS日程管理插件FullCalendar简单实例
2017/02/07 Javascript
JS实现留言板功能[楼层效果展示]
2017/12/27 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
JS基于ES6新特性async await进行异步处理操作示例
2019/02/02 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
tornado框架blog模块分析与使用
2013/11/21 Python
Win7下搭建python开发环境图文教程(安装Python、pip、解释器)
2016/05/17 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
对python csv模块配置分隔符和引用符详解
2018/12/12 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
详解Python3除法之真除法、截断除法和下取整对比
2019/05/23 Python
Python 通过微信控制实现app定位发送到个人服务器再转发微信服务器接收位置信息
2019/08/05 Python
Django实现文件上传下载
2019/10/06 Python
pandas中遍历dataframe的每一个元素的实现
2019/10/23 Python
python opencv pytesseract 验证码识别的实现
2020/08/28 Python
viagogo法国票务平台:演唱会、体育比赛、戏剧门票
2017/03/27 全球购物
澳大利亚百货商店中销量第一的商务衬衫品牌:Van Heusen
2018/07/26 全球购物
《雷雨》教学反思
2014/02/20 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
年度考核自我鉴定
2014/03/19 职场文书
办理信用卡收入证明范例
2014/09/13 职场文书
幼儿园小班教师个人工作总结
2015/02/06 职场文书
心理健康教育培训研修感言
2015/11/18 职场文书
《雪地里的小画家》教学反思
2016/02/16 职场文书
详解redis在微服务领域的贡献
2021/10/16 Redis