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

 更新时间:2014年11月05日 09:19:11   投稿:hebedich  
我们在使用爬虫来抓取网页内容的时候,HTTP异常是必须要注意的一项,所以本文,我们来详细探寻一下HTTP异常处理的相关内容,通过一些具体的实例来分析一下,非常的简单,但是却很实用。
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

先来说一说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('/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('/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('/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单例模式原理与创建方法,结合实例形式分析了Python单例模式的概念、原理、定义、使用方法及相关操作注意事项,需要的朋友可以参考下
    2019-10-10
  • pyCharm 实现关闭代码检查

    pyCharm 实现关闭代码检查

    这篇文章主要介绍了pyCharm 实现关闭代码检查,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • pip指定python位置安装软件包的方法

    pip指定python位置安装软件包的方法

    今天小编就为大家分享一篇pip指定python位置安装软件包的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python加密与解密模块hashlib与hmac

    Python加密与解密模块hashlib与hmac

    这篇文章介绍了Python中的加密与解密模块hashlib与hmac,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • 用python实现刷点击率的示例代码

    用python实现刷点击率的示例代码

    今天小编就为大家分享一篇用python实现刷点击率的示例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-02-02
  • Python Spyder 调出缩进对齐线的操作

    Python Spyder 调出缩进对齐线的操作

    这篇文章主要介绍了Python Spyder 调出缩进对齐线的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • windows下搭建python scrapy爬虫框架步骤

    windows下搭建python scrapy爬虫框架步骤

    在本文内容里小编给大家分享的是关于windows下搭建python scrapy爬虫框架的教学内容,需要的朋友们学习下。
    2018-12-12
  • 使用Pandas计算系统客户名称的相似度

    使用Pandas计算系统客户名称的相似度

    在日常业务处理中,我们经常会面临将不同系统中的数据进行匹配和比对的情况,本文将介绍如何使用Python的Pandas库来处理这个问题,需要的可以参考一下
    2023-07-07
  • Django使用Profile扩展User模块方式

    Django使用Profile扩展User模块方式

    这篇文章主要介绍了Django使用Profile扩展User模块方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • python实现的分析并统计nginx日志数据功能示例

    python实现的分析并统计nginx日志数据功能示例

    这篇文章主要介绍了python实现的分析并统计nginx日志数据功能,结合实例形式分析了Python针对nginx日志ip、访问url、状态等数据的相关读取、解析操作技巧,需要的朋友可以参考下
    2019-12-12

最新评论

?


http://www.vxiaotou.com