您好,欢迎访问一九零五行业门户网

[Python]网络爬虫(三):异常的处理和HTTP状态码的分类

先来说一说http的异常处理问题。
当urlopen不能够处理一个response时,产生urlerror。
不过通常的python apis异常如valueerror,typeerror等也会同时产生。
httperror是urlerror的子类,通常在特定http urls中产生。
1.urlerror
通常,urlerror在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生。
这种情况下,异常同样会带有reason属性,它是一个tuple(可以理解为不可变的数组),
包含了一个错误号和一个错误信息。
我们建一个urllib2_test06.py来感受一下异常的处理:
[python] view plaincopy
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来感受一下:
[python] view plaincopy
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来示范一下第一种异常处理的方案:
[python] view plaincopy
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来示范一下第二种异常处理的方案:
[python] view plaincopy
from urllib2 import request, urlopen, urlerror, httperror    req = request('http://bbs.csdn.net/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]网络爬虫(三):异常的处理和http状态码的分类,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
其它类似信息

推荐信息