【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  #其餘異常的處理

   相比較而言,第二種異常處理方法更優。

相關文章
相關標籤/搜索