zoukankan      html  css  js  c++  java
  • 请求错误[Python]网络爬虫(三):异常的处理和HTTP状态码的分类

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下请求错误

        先来说一说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('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  
    

    文章结束给大家分享下程序员的一些笑话语录: PC软件体积大,是因为一个PC软件功能往往较多,能够满足你一个方面的需求,而一个iphone软件往往没几行代码,干一件很小的事情,自然需要的软件就多。就像吃西瓜和吃瓜子的来比数目,单位不同啊。

  • 相关阅读:
    算法之冒泡排序
    实现秒杀的几个想法(续)
    乐观锁
    wifi-sdio接口
    解压vmlinuz和解压initrd(initramfs)
    supplicant
    wpa_supplicant测试
    qu
    netlink
    wpa_supplicant安装
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3078582.html
Copyright © 2011-2022 走看看