[Python]網路爬蟲(四):Opener與Handler的介紹與實例應用

黄舟
發布: 2017-01-21 13:50:52
原創
1325 人瀏覽過

在開始後面的內容之前,先來解釋一下urllib2中的兩個個方法:info and 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()
登入後複製

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

[Python]網路爬蟲(四):Opener與Handler的介紹與實例應用

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()
登入後複製

運行的結果如下,可以看到頁面的相關資訊:

[Python]網路爬蟲(四):Opener與Handler的介紹與實例應用

重要概念: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”。

後者包含了連接埠號碼。

以上是 [Python]網路爬蟲(四):Opener與Handler的介紹和實例應用的內容,更多相關內容請關注PHP中文網(www.php.cn)!


來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板