零基礎寫python爬蟲之urllib2中的兩個重要概念:Openers和Handlers_python

來源:互聯網
上載者:User

在開始後面的內容之前,先來解釋一下urllib2中的兩個個方法:info / geturl
urlopen返回的應答對象response(或者HTTPError執行個體)有兩個很有用的方法info()和geturl()

1.geturl():

這個返回擷取的真實的URL,這個很有用,因為urlopen(或者opener對象使用的)或許會有重新導向。擷取的URL或許跟請求URL不同。
以人人中的一個超級連結為例,
我們建一個urllib2_test10.py來比較一下原始URL和重新導向的連結:

複製代碼 代碼如下:

from urllib2 import Request, urlopen, URLError, HTTPError 
old_url = 'http://rrurl.cn/b1UZuP' 
req = Request(old_url) 
response = urlopen(req)   
print 'Old url :' + old_url 
print 'Real url :' + response.geturl() 

運行之後可以看到真正的連結指向的網址:

2.info():

這個返回對象的字典對象,該字典描述了擷取的頁面情況。通常是伺服器發送的特定頭headers。目前是httplib.HTTPMessage 執行個體。
經典的headers包含"Content-length","Content-type",和其他內容。
我們建一個urllib2_test11.py來測試一下info的應用:

複製代碼 代碼如下:

from urllib2 import Request, urlopen, URLError, HTTPError 
old_url = 'http://www.baidu.com' 
req = Request(old_url) 
response = urlopen(req)   
print 'Info():' 
print response.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的應用:

複製代碼 代碼如下:

# -*- coding: utf-8 -*- 
import urllib2 
# 建立一個密碼管理者 
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm() 
# 添加使用者名稱和密碼 
top_level_url = "http://example.com/foo/" 
# 如果知道 realm, 我們可以使用他代替 ``None``. 
# password_mgr.add_password(None, top_level_url, username, password) 
password_mgr.add_password(None, top_level_url,'why', '1223') 
# 建立了一個新的handler 
handler = urllib2.HTTPBasicAuthHandler(password_mgr) 
# 建立 "opener" (OpenerDirector 執行個體) 
opener = urllib2.build_opener(handler) 
a_url = 'http://www.baidu.com/' 
# 使用 opener 擷取一個URL 
opener.open(a_url) 
# 安裝 opener. 
# 現在所有調用 urllib2.urlopen 將用我們的 opener. 
urllib2.install_opener(opener) 

  
注意:以上的例子我們僅僅提供我們的HHTPBasicAuthHandler給build_opener。
預設的openers有正常狀況的handlers:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler, HTTPRedirectHandler,FTPHandler, FileHandler, HTTPErrorProcessor。
代碼中的top_level_url 實際上可以是完整URL(包含"http:",以及主機名稱及可選的連接埠號碼)。
例如:http://example.com/。
也可以是一個“authority”(即主機名稱和可選的包含連接埠號碼)。
例如:“example.com” or “example.com:8080”。
後者包含了連接埠號碼。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.