零基础写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实现简单聊天应用 python群聊和点对点均实现
Sep 14 Python
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
Jan 05 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
Python基于进程池实现多进程过程解析
Apr 30 Python
解决echarts中饼图标签重叠的问题
May 16 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
python性能测试工具locust的使用
Dec 28 Python
pandas map(),apply(),applymap()区别解析
Feb 24 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 Python
Python编解码问题及文本文件处理方法详解
Jun 20 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
mysql 字段类型说明
2007/04/27 PHP
彻底杜绝PHP的session cookie错误
2009/08/09 PHP
php防止伪造的数据从URL提交方法
2014/06/27 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
2016/09/23 PHP
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
JavaScript 匿名函数(anonymous function)与闭包(closure)
2011/10/04 Javascript
Bootstrap轮播插件简单使用方法介绍
2016/06/21 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
JavaScript三种绑定事件方式及相互之间的区别分析
2017/01/10 Javascript
微信小程序 增、删、改、查操作实例详解
2017/01/13 Javascript
详解nodejs中express搭建权限管理系统
2017/09/15 NodeJs
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
还不懂递归?读完这篇文章保证你会懂
2018/07/29 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
深入理解令牌认证机制(token)
2019/08/22 Javascript
js回调函数仿360开机
2019/12/26 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
vue登录页实现使用cookie记住7天密码功能的方法
2021/02/18 Vue.js
python打印直角三角形与等腰三角形实例代码
2019/10/20 Python
Python解析json代码实例解析
2019/11/25 Python
python selenium实现发送带附件的邮件代码实例
2019/12/10 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
2020/06/01 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
使用HTML5加载音频和视频的实现代码
2020/11/30 HTML / CSS
英国领先的家庭时尚品牌:Peacocks
2018/01/11 全球购物
UGG英国官方网站:UGG UK
2018/02/08 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
省三好学生申请材料
2014/01/22 职场文书
科研课题实施方案
2014/03/18 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
Golang: 内建容器的用法
2021/05/05 Golang
详解Java分布式事务的 6 种解决方案
2021/06/26 Java/Android