python爬虫的异常处理

进行异常处理我们经常使用try....except语句,在try中执行主要代码,在except中捕获异常信息,并进行相应的异常处理。

一、爬虫中异常主要有两大类:

    (1)URLError类

    (2)HTTPError类

def error_process():
    try:
        import urllib.request
        import urllib.error
        urllib.request.urlopen("http://blog.csdn.net")
        print ("OK")
    except urllib.error.URLError as e:
        print (e.code)          #异常状态
        print (e.reason)        #异常原因

一般产生Error的原因有如下几种可能:

  • 链接不上服务器
  • 远程URL不存在
  • 无网络
  • 触发了HTTPError

注意:HTTPError无法处理以上前三种错误,要用URLError!

比如我们现在构造一个不存在的网址,引发远程URL不存在的异常,此时不能通过HTTPError处理,要用URLError

def error_process():
    try:
        import urllib.request
        import urllib.error
        urllib.request.urlopen("http://blog.baiducsdn.net")
        print ("OK")
    except urllib.error.URLError as e:
        #用HTTPError会报错的
        #print (e.code)
        print (e.reason)

if __name__ =='__main__':
    error_process()
输出异常原因:

                    

但素!!!在实际处理异常过程中,我们并不知道HTTPError是不是能处理,我们可以先让其用HTTPError子类进行处理,若无法处理,再让其用URLError进行处理,代码如下:

def error_process():
    try:
        import urllib.request
        import urllib.error
        urllib.request.urlopen("http://blog.baiducsdn.net")
        print ("OK")
    except urllib.error.HTTPError as e:
        print (e.code)
        print (e.reaoson)       
    except urllib.error.URLError as e:
        print (e.reason)
if __name__ =='__main__':
    error_process()

在上述代码中,我们先用子类进行异常处理,若无法处理,再用父类进行异常处理,此时,不管发生的是哪种异常,都能够进行完美处理。

def error_process():
    try:
        import urllib.request
        import urllib.error
        urllib.request.urlopen("http://www.baiducsdn.net")
        print ("OK")
    except urllib.error.URLError as e:
        print (e.code)
        print (e.reason)
if __name__ =='__main__':
    error_process()

e.code会报错,因为e.code这时候不存在

            

处理方法:可以用hasattr()函数来判断是非具有这些属性,这样就不会出错,也就是,有e.code 就输出,没有就自动忽略;e.reason同理。

修改后代码:

def error_process():
    try:
        import urllib.request
        import urllib.error
        urllib.request.urlopen("http://www.baiducsdn.net")
        print ("OK")
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print (e.code)
        if hasattr(e, "reason"):
            print (e.reason)
if __name__ =='__main__':
    error_process()

运行结果:


二、常见的状态码及含义

200    OK         一切正常

301    Moved Permanently        重定向到心的URL,永久性

303    Found    重新定向到新的URL,非永久性(临时的)

304    Not Modified    请求的资源未更新

400    Bad Request    非法请求

总结:

        (1)如果是引发了HTTPError异常,则判断出有e.code ,就会既输出状态码也输出错误原因

        (2)若引发异常的原因是“连接不上服务器”、“远程URL不存在”、“无网络”等异常中的一个,则判断没有e.code。所以只会输出e.rason .不管是何种原因。都能得到解决。

        (3)学会使用try....except语句进行异常处理,在try 中执行主要代码,在except中捕获异常信息,并进行相应的处理。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值