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 #其餘異常的處理
相比較而言,第二種異常處理方法更優。