【Python开发】urllib2异常处理

 1、urllib2模块回顾css

       urllib2模块中最重要的函数是urlopen()函数,用于获取URLs资源(Uniform Resorce Locators)。urlopen函数不只能够用于简单的状况,还能够进行复杂状况下的资源获取如认证(authentication)、cookies、代理等。urlopen支持多种协议,如http、ftp、file等。html

        HTTP是基于请求、响应的协议,客户端发出请求、服务器端做出响应。urllib2经过Request对象反映发出的HTTP请求,调用urlopen()时就会发出请求,函数返回值就是相应的响应对象。python

     一、POST数据浏览器

import urllib,urllib2

url="http://www.example.com/"
datas={"email":user,"password":password}
req=urllib2.Request(url,urllib.encode(datas))
response=urllib2.urlopen(req)

     二、增长Header头部服务器

     因为一些网站不但愿被程序访问,或网站会发送不一样的内容给不一样的浏览器类型,所以须要修改HTTP头部来将程序伪形成相应的浏览器,而浏览器一般经过头部的User-Agent来识别,所以一般只改User-Agent便可。方法是传递一个headers头部字典给Request对象。cookie

import urllib2

url="http://www.example.com/"
headers={"User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}
req=urllib2.Request(url,headers=headers)
response=urllib2.urlopen(req)

                                                             2、异常处理网络

          当urlopen()不能处理响应时会引发URLError异常。HTTPError异常是URLError的一个子类,只有在访问HTTP类型的URL时才会引发。函数

一、URLError异常网站

    一般引发URLError的缘由是:无网络链接(没有到目标服务器的路由)、访问的目标服务器不存在。在这种状况下,异常对象会有reason属性(是一个(错误码、错误缘由)的元组)。url

#! /usr/bin/env python
#coding=utf-8
import urllib2

url="http://www.baidu.com/"
try:
    response=urllib2.urlopen(url)
except urllib2.URLError,e:
    print e.reason

二、HTTPError

    每个从服务器返回的HTTP响应都有一个状态码。其中,有的状态码表示服务器不能完成相应的请求,默认的处理程序能够为咱们处理一些这样的状态码(如返回的响应是重定向,urllib2会自动为咱们从重定向后的页面中获取信息)。有些状态码,urllib2模块不能帮咱们处理,那么urlopen函数就会引发HTTPError异常,其中典型的有404/401。

   HTTPError异常的实例有整数类型的code属性,表示服务器返回的错误状态码。

    urllib2模块默认的处理程序能够处理重定向(状态码是300范围),并且状态码在100-299范围内表示成功。所以,可以引发HTTPError异常的状态码范围是:400-599.

    当引发错误时,服务器会返回HTTP错误码和错误页面。你能够将HTPError实例做为返回页面,这意味着,HTTPError实例不只有code属性,还有read、geturl、info等方法。

#! /usr/bin/env python
#coding=utf-8
import urllib2

url="http://cs.scu.edu.cn/~duanlei"
try:
    response=urllib2.urlopen(url)
except urllib2.HTTPError,e:
    print e.code
    print e.read()

三、总结

    若是想在代码中处理URLError和HTTPError有两种方法,代码以下:

#! /usr/bin/env python
#coding=utf-8
import urllib2
url="xxxxxx"  #须要访问的URL
try:
    response=urllib2.urlopen(url)
except urllib2.HTTPError,e:    #HTTPError必须排在URLError的前面
    print "The server couldn't fulfill the request"
    print "Error code:",e.code
    print "Return content:",e.read()
except urllib2.URLError,e:
    print "Failed to reach the server"
    print "The reason:",e.reason
else:
    #something you should do
    pass  #其余异常的处理
#! /usr/bin/env python
#coding=utf-8
import urllib2
url="http://xxx"  #须要访问的URL
try:
    response=urllib2.urlopen(url)
except urllib2.URLError,e:
    if hasattr(e,"reason"):
        print "Failed to reach the server"
        print "The reason:",e.reason
    elif hasattr(e,"code"):
        print "The server couldn't fulfill the request"
        print "Error code:",e.code
        print "Return content:",e.read()
else:
    pass  #其余异常的处理

   相比较而言,第二种异常处理方法更优。

相关文章
相关标签/搜索