在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Python/ Opener 與 Handler 的介紹和實例應用
一個簡單的百度貼吧的小爬蟲
亮劍!爬蟲框架小抓抓 Scrapy 閃亮登場!
Opener 與 Handler 的介紹和實例應用
百度貼吧的網(wǎng)絡爬蟲(v0.4)源碼及解析
異常的處理和 HTTP 狀態(tài)碼的分類
利用 urllib2 通過指定的 URL 抓取網(wǎng)頁內(nèi)容
Python 中的正則表達式教程
爬蟲框架 Scrapy 的第一個爬蟲示例入門教程
抓取網(wǎng)頁的含義和 URL 基本構(gòu)成
urllib2 的使用細節(jié)與抓站技巧
一個爬蟲的誕生全過程(以山東大學績點運算為例)
糗事百科的網(wǎng)絡爬蟲(v0.3)源碼及解析(簡化更新)

Opener 與 Handler 的介紹和實例應用

在開始后面的內(nèi)容之前,先來解釋一下 urllib2 中的兩個個方法:info and geturl urlopen 返回的應答對象 response(或者 HTTPError 實例)有兩個很有用的方法 info()和 geturl()

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()  

運行之后可以看到真正的鏈接指向的網(wǎng)址:

http://wiki.jikexueyuan.com/project/python-crawler/images/2.png" alt="" />

info()

這個返回對象的字典對象,該字典描述了獲取的頁面情況。通常是服務器發(fā)送的特定頭 headers。目前是 httplib.HTTPMessage 實例。

經(jīng)典的 headers 包含"Content-length","Content-type",和其他內(nèi)容。

我們建一個 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()  

運行的結(jié)果如下,可以看到頁面的相關信息:

http://wiki.jikexueyuan.com/project/python-crawler/images/3.png" alt="" />

下面來說一說 urllib2 中的兩個重要概念:Openers 和 Handlers。

Openers

當你獲取一個 URL 你使用一個 opener(一個 urllib2.OpenerDirector 的實例)。正常情況下,我們使用默認 opener:通過 urlopen。但你能夠創(chuàng)建個性的 openers。

Handles

Openers 使用處理器 handlers,所有的“繁重”工作由 handlers 處理。每個 handlers 知道如何通過特定協(xié)議打開 URLs,或者如何處理 URL 打開時的各個方面。

例如 HTTP 重定向或者 HTTP cookies。

如果你希望用特定處理器獲取 URLs 你會想創(chuàng)建一個 openers,例如獲取一個能處理 cookie 的 opener,或者獲取一個不重定向的 opener。

要創(chuàng)建一個 opener,可以實例化一個 OpenerDirector,然后調(diào)用 .add\_handler(some\_handler\_instance)。同樣,可以使用 build_opener,這是一個更加方便的函數(shù),用來創(chuàng)建 opener 對象,他只需要一次函數(shù)調(diào)用。build_opener 默認添加幾個處理器,但提供快捷的方法來添加或更新默認處理器。 其他的處理器 handlers 你或許會希望處理代理,驗證,和其他常用但有點特殊的情況。

install_opener 用來創(chuàng)建(全局)默認 opener。這個表示調(diào)用 urlopen 將使用你安裝的 opener。 Opener 對象有一個 open 方法。該方法可以像 urlopen 函數(shù)那樣直接用來獲取 urls:通常不必調(diào)用 install_opener,除了為了方便。

說完了上面兩個內(nèi)容,下面我們來看一下基本認證的內(nèi)容,這里會用到上面提及的 Opener 和 Handler。

Basic Authentication 基本驗證

為了展示創(chuàng)建和安裝一個 handler,我們將使用 HTTPBasicAuthHandler。 當需要基礎驗證時,服務器發(fā)送一個 header(401 錯誤碼) 請求驗證。這個指定了 scheme 和一個‘realm’,看起來像這樣:Www-authenticate: SCHEME realm="REALM"。

例如

Www-authenticate: Basic realm="cPanel Users"

客戶端必須使用新的請求,并在請求頭里包含正確的姓名和密碼。這是“基礎驗證”,為了簡化這個過程,我們可以創(chuàng)建一個 HTTPBasicAuthHandler 的實例,并讓opener 使用這個 handler 就可以啦。

HTTPBasicAuthHandler 使用一個密碼管理的對象來處理 URLs 和 realms 來映射用戶名和密碼。如果你知道 realm(從服務器發(fā)送來的頭里)是什么,你就能使用 HTTPPasswordMgr。

通常人們不關心 realm 是什么。那樣的話,就能用方便的 HTTPPasswordMgrWithDefaultRealm。這個將在你為 URL 指定一個默認的用戶名和密碼。這將在你為特定 realm 提供一個其他組合時得到提供。我們通過給 realm 參數(shù)指定 None 提供給 add_password 來指示這種情況。

最高層次的 URL 是第一個要求驗證的 URL。你傳給 .add_password()更深層次的 URLs 將同樣合適。說了這么多廢話,下面來用一個例子演示一下上面說到的內(nèi)容。

我們建一個 urllib2_test12.py 來測試一下 info 的應用:

\# -*- coding: utf-8 -*-  
import urllib2  

\# 創(chuàng)建一個密碼管理者  
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')  

\# 創(chuàng)建了一個新的handler  
handler = urllib2.HTTPBasicAuthHandler(password_mgr)  

\# 創(chuàng)建 "opener" (OpenerDirector 實例)  
opener = urllib2.build_opener(handler)  

a_url = 'http://www.baidu.com/'  

\# 使用 opener 獲取一個URL  
opener.open(a_url)  

\# 安裝 opener.  
\# 現(xiàn)在所有調(diào)用 urllib2.urlopen 將用我們的 opener.  
urllib2.install_opener(opener)  

注意:以上的例子我們僅僅提供我們的 HHTPBasicAuthHandler 給 build_opener。默認的 openers 有正常狀況的 handlers:ProxyHandler,UnknownHandler,HTTPHandler,HTTPDefaultErrorHandler,HTTPRedirectHandler,F(xiàn)TPHandler, FileHandler, HTTPErrorProcessor。 代碼中的 top\_level\_url 實際上可以是完整 URL(包含"http:",以及主機名及可選的端口號)。

例如:http://example.com/。也可以是一個“authority”(即主機名和可選的包含端口號)。

例如:“example.com” or “example.com:8080”。后者包含了端口號。