在開始后面的內容之前,先來解釋一下urllib2中的兩個個方法:info / geturl
urlopen返回的應答對象response(或者HTTPError實例)有兩個很有用的方法info()和geturl()
1.geturl():
這個返回獲取的真實的URL,這個很有用,因為urlopen(或者opener對象使用的)或許會有重定向。獲取的URL或許跟請求URL不同。
以人人中的一個超級鏈接為例,
我們建一個urllib2_test10.py來比較一下原始URL和重定向的鏈接:
運行之后可以看到真正的鏈接指向的網址:

2.info():
這個返回對象的字典對象,該字典描述了獲取的頁面情況。通常是服務器發送的特定頭headers。目前是httplib.HTTPMessage 實例。
經典的headers包含"Content-length","Content-type",和其他內容。
我們建一個urllib2_test11.py來測試一下info的應用:
運行的結果如下,可以看到頁面的相關信息:

下面來說一說urllib2中的兩個重要概念:Openers和Handlers。
1.Openers:
當你獲取一個URL你使用一個opener(一個urllib2.OpenerDirector的實例)。
正常情況下,我們使用默認opener:通過urlopen。
但你能夠創建個性的openers。
2.Handles:
Openers使用處理器handlers,所有的“繁重”工作由handlers處理。
每個handlers知道如何通過特定協議打開URLs,或者如何處理URL打開時的各個方面。
例如HTTP重定向或者HTTP cookies。
如果你希望用特定處理器獲取URLs你會想創建一個openers,例如獲取一個能處理cookie的opener,或者獲取一個不重定向的opener。
要創建一個 opener,可以實例化一個OpenerDirector,
然后調用.add_handler(some_handler_instance)。
同樣,可以使用build_opener,這是一個更加方便的函數,用來創建opener對象,他只需要一次函數調用。
build_opener默認添加幾個處理器,但提供快捷的方法來添加或更新默認處理器。
其他的處理器handlers你或許會希望處理代理,驗證,和其他常用但有點特殊的情況。
install_opener 用來創建(全局)默認opener。這個表示調用urlopen將使用你安裝的opener。
Opener對象有一個open方法。
該方法可以像urlopen函數那樣直接用來獲取urls:通常不必調用install_opener,除了為了方便。
說完了上面兩個內容,下面我們來看一下基本認證的內容,這里會用到上面提及的Opener和Handler。
Basic Authentication 基本驗證
為了展示創建和安裝一個handler,我們將使用HTTPBasicAuthHandler。
當需要基礎驗證時,服務器發送一個header(401錯誤碼) 請求驗證。這個指定了scheme 和一個‘realm',看起來像這樣:Www-authenticate: SCHEME realm="REALM".
例如
Www-authenticate: Basic realm="cPanel Users"
客戶端必須使用新的請求,并在請求頭里包含正確的姓名和密碼。
這是“基礎驗證”,為了簡化這個過程,我們可以創建一個HTTPBasicAuthHandler的實例,并讓opener使用這個handler就可以啦。
HTTPBasicAuthHandler使用一個密碼管理的對象來處理URLs和realms來映射用戶名和密碼。
如果你知道realm(從服務器發送來的頭里)是什么,你就能使用HTTPPasswordMgr。
通常人們不關心realm是什么。那樣的話,就能用方便的HTTPPasswordMgrWithDefaultRealm。
這個將在你為URL指定一個默認的用戶名和密碼。
這將在你為特定realm提供一個其他組合時得到提供。
我們通過給realm參數指定None提供給add_password來指示這種情況。
最高層次的URL是第一個要求驗證的URL。你傳給.add_password()更深層次的URLs將同樣合適。
說了這么多廢話,下面來用一個例子演示一下上面說到的內容。
我們建一個urllib2_test12.py來測試一下info的應用:
新聞熱點
疑難解答
圖片精選