先来说一说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来感受一下:

双击代码全选
1
2
3
4
5
6
7
8
9
10
import
urllib2
req =
urllib2.Request('http://bbs.csdn.net/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('http://bbs.csdn.net/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('http://bbs.csdn.net/callmewhy') 

        

try:   

        

    response = urlopen(req)   

        

except URLError, e:   

        

    if hasattr(e, 'reason'):   

        

        print 'We failed to reach a server.'

        

        print 'Reason: ', e.reason   

        

    elif hasattr(e, 'code'):   

        

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

        

        print 'Error code: ', e.code   

        

else:   

    print 'No exception was raised.'

    # everything is fine

[Python]网络爬虫(三):异常的处理和HTTP状态码的分类的更多相关文章

  1. Python网络爬虫(三)

    AJAX学习 AJAX=Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).通俗来说,AJAX是一种无需加载整个网页的情况下,通过在后台与服务器 ...

  2. 【Python网络爬虫三】 爬去网页新闻

    学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...

  3. 【Python网络爬虫三】 爬取网页新闻

    学弟又一个自然语言处理的项目,需要在网上爬一些文章,然后进行分词,刚好牛客这周的是从一个html中找到正文,就实践了一下.写了一个爬门户网站新闻的程序 需求: 从门户网站爬取新闻,将新闻标题,作者,时 ...

  4. Python网络爬虫

    http://blog.csdn.net/pi9nc/article/details/9734437 一.网络爬虫的定义 网络爬虫,即Web Spider,是一个很形象的名字. 把互联网比喻成一个蜘蛛 ...

  5. Python网络爬虫(一):初步认识网络爬虫

    不管你是因为什么原因想做一个网络爬虫,首先做的第一件事情就是要了解它. 在了解网络爬虫之前一定要牢记下面4个要点,这是做网络爬虫的基础: 1.抓取 py的urllib不一定去用.可是要学.假设你还没用 ...

  6. python网络爬虫高清PDF资料分享

    1.python+网络爬虫开发实战中文PDF高清版 链接:https://pan.baidu.com/s/1bks8J9kgqCArUlEoDg4acA 提取码:h9y2 复制这段内容后打开百度网盘手 ...

  7. 第三次作业-MOOC学习笔记:Python网络爬虫与信息提取

    1.注册中国大学MOOC 2.选择北京理工大学嵩天老师的<Python网络爬虫与信息提取>MOOC课程 3.学习完成第0周至第4周的课程内容,并完成各周作业 第一周 Requests库的爬 ...

  8. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...

  9. python网络爬虫之解析网页的正则表达式(爬取4k动漫图片)[三]

    前言 hello,大家好 本章可是一个重中之重,因为我们今天是要爬取一个图片而不是一个网页或是一个json 所以我们也就不用用到selenium模块了,当然有兴趣的同学也一样可以使用selenium去 ...

随机推荐

  1. Nginx之(二)Nginx安装

    首先从官网上http://nginx.org/下载最新的stable version源码,当前最新版本为nginx-1.10.2.tar.gz. 2.1 configure 解压之后,会发现里面有一个 ...

  2. POSIX 消息队列相关问题

    一.查看和删除消息队列要想看到创建的posix消息队列,需要在root用户下执行以下操作:# mkdir /dev/mqueue# mount -t mqueue none /dev/mqueue删除 ...

  3. 在Spring Boot框架下使用WebSocket实现消息推送

    Spring Boot的学习持续进行中.前面两篇博客我们介绍了如何使用Spring Boot容器搭建Web项目(使用Spring Boot开发Web项目)以及怎样为我们的Project添加HTTPS的 ...

  4. C实战:强大的程序调试工具GDB

    C实战:强大的程序调试工具GDB 1.基本调试 这里只列举最最常用的GDB命令. 1.1 启动GDB gdb program:准备调试程序.也可以直接进入gdb,再通过file命令加载. 1.2 添加 ...

  5. 预处理指令--C语言

    ANSI标准C还定义了如下几个宏: __LINE__ 表示正在编译的文件的行号 __FILE__ 表示正在编译的文件的名字 __DATE__ 表示编译时刻的日期字符串,例如:"25 Dec ...

  6. 20160210.CCPP体系详解(0020天)

    程序片段(01):01.二级指针.c 内容概要:二级指针 #include <stdio.h> #include <stdlib.h> //01.二级指针: // 1.使用场景 ...

  7. docker iotop :OSError: Netlink error: No such file or directory

    在容器内使用iotop ,错误信息: raceback (most recent call last): File "/usr/sbin/iotop", line 16, in & ...

  8. load balancer 配置参考

    https://wiki.ewu.edu/oit/Load_balancing_using_nginx

  9. Activity平移动画

    Activity平移动画 效果图 添加动画文件 在res下添加anim文件夹,在anim下添加几个动画文件,分别是进入和退出的动画时间和移动距离,属性很简单,一看就懂,不磨叽了. tran_next_ ...

  10. 使用Intent传递对象

    Intent 的用法相信你已经比较熟悉了,我们可以借助它来启动活动.发送广播.启动服务等.在进行上述操作的时候,我们还可以在Intent 中添加一些附加数据,以达到传值的效果,比如在FirstActi ...