urllib的高級用法

Handler簡介

咱們能夠把他理解爲各類處理器,有專門處理登陸驗證的,有處理cookies的,有處理代理設置的。利用他們,咱們幾乎能夠作到HTTP請求中的全部事情。html

首先,介紹一下 urllib.request模塊裏的 BaseHandler 類,它是全部其餘 Handler 的父類,它提供了最基本的方法,例如 default_open ()、 protocol_request ()等。python

接下來,就有各類Handler子類繼承這個BaseHandler類,舉例以下。瀏覽器

HTTPDefaultErrorHandler: 用於處理HTTPError類型的異常。cookie

HTTPRedirectHandler:用於處理重定向。函數

HTTPCookiesProcessor:用於處理cookies。網站

ProxyHandler:用於設置代理,默認代理爲空。ui

HTTPpasswordMgr:用於管理密碼,它維護了用戶名和密碼的表。url

HTTPBasicAuthHandler:用於管理認證,若是一個瞭解打開時須要認證,那麼能夠用它來解決認證問題。spa

 

另外,還有其餘的Handler類,這裏就不一一舉例了,詳情能夠參考官方文檔:https://docs.python.org/3/library/urllib.request.html#urllib.request.BaseHandler.3d

 

關於怎麼使用它們,如今先不用着急,後面會有實例演示 。
另外一個比較重要的類就是 Op enerDirector ,咱們能夠稱爲 Opener 。 咱們以前用過 urlopen ()這個
方法,實際上它就是 urllib 爲咱們提供的一個 Opener 。
那麼,爲何要引人 Opener 呢?由於須要實現更高級的功能 。 以前使用的 Request 和 urlopen( )
至關於類庫爲你封裝好了極其經常使用的請求方法,利用它們能夠完成基本的請求,可是如今不同了,
咱們須要實現更高級的功能,因此須要深刻一層進行配置,使用更底層的實例來完成操做,因此這裏
就用到了 Opener 。
Opener 可使用 open ()方法,返回的類型和 urlopen ()如出 一轍 。 那麼,它和 Handler 有什麼關
系呢?簡而言之,就是利用 Handler 來構建 Opener 。

下面用幾個實例來看看它們的用法 。

 

 

那麼,若是要請求這樣的頁面,該怎麼辦呢?藉助 HTTPBasicAuthHandler 就能夠完成,相關代碼
以下:

 

from urllib.request import HTTPPasswordMgrWithDefaultRealm, HTTPBasicAuthHandler, build_opener
from urllib.error import URLError
username = username
password =’ password ’
url = ’ http: //localhost:sooo/'
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None, url, username , password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)

try:
    result = opener.open(url)
    html = result. read(). decode (’ utf 8 ’)
    print(html)
except URLError as e:
    print(e.reason)

  

這裏首先實例化 HTTPBasicAuthHandler 對象,其參數是 HTTPPasswordMgrWithDefaultRealm 對象,
它利用 add_password ()添加進去用戶名和密碼,這樣就創建了一個處理驗證的 Handler.

 

接下來,利用這個 Handler 並使用 build_opener ()方法構建一個 Opener ,這個 Opener 在發送請求
時就至關於已經驗證成功了 。
接下來,利用 Opener 的 open ()方法打開連接,就能夠完成驗證了 。 這裏獲取到的結果就是驗證
後的頁面源碼內容 。

#·代理
#在作爬蟲的時候,免不了要使用代理,若是要添加代理,能夠這樣作:
from urllib.error import URLError
from urllib.request import ProxyHandler, build opener
proxy _handler = ProxyHandler({
'http':’ http://127.0.0.1:9743',
'https':'https://127.0 .0.1:9743'
})
opener = build_opener(proxy_handler)
try:
    response = opener.open (’ https://www.baidu.com')
    print(response.read() .decode (’ utf-8'))
except URLError as e:
    print(e.reason)

 

 

這裏咱們在本地搭建了一個代理,它運行在 9743 端口上 。
這裏使用了 ProxyHand l er ,其參數是一個字典,鍵名是協議類型(好比 HTTP 或者 HTTPS 等),
鍵值是代理連接,能夠添加多個代理。
而後,利用這個 Handler 及 build_opener ()方法構造一個 Opener ,以後發送請求便可 。

 


Cookies
Cookies 的處理就須要相關的 Handler 了 。
咱們先用實例來看看怎樣將網站的 Cookies 獲取下來,相關代碼以下:

 

import http .cookiejar, urllib.request
cookie = http. cookie jar. CookieJar()
handler = urllib . request.HTTPCookieProcessor (cookie)
opener = urllib.request . build opener(handler )
response = opener. open (’ http://www.baidu.com')
for item in cookie:
    print(item.name +」= 」+ i tem.value)

 

 

首先 ,咱們必須聲 明一個 CookieJar 對象 。 接下來,就須要利用 HTTPCookieProcessor 來構建一個
Handler ,最後利用 build_opener ()方法構建出 Opener ,執行 open () 函數便可 。

BAIDUID=2E6SA683F8A8BA3DF521469DF8EFF1E1 :FG=1
BIDUPSID=2E6SA683F8A8BA3DF521469DF8EFF1E1
H PS PSSID=20987 1421 18282 17949 21122 17001 21227 21189 21161 20927
PST問= 1474900615
BDSVRTM=O
BD HOME=O

 

 

能夠看到,這裏輸州了每條 Cookie 的名稱和值 。
不過既然能輸出,那可不能夠輸出成文件格式呢?咱們知道 Cookies 實際上也是以文本形式保存
的。
答案固然是確定的,這裏經過下面 的實例來看看:

filename = 'cookies. txt ’
cookie = http.cookiejar.MozillaCookieJar(filename)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open (’ http://www .baidu.com')
cookie.save(ignore_discard=True , ignore_expires=True)

這時 CookieJar 就須要換成問ozillaCookieJar ,它在生成文件時會用到,是 CookieJar 的子類,可
以用來處理 Cookies 和文件相關的事件,好比讀取和保存 Cookies ,能夠將 Cookies 保存成 Mozilla 型
瀏覽器的 Cookies 格式 。
運行以後,可 以發現生成了一個 cookies.txt 文件,其內容以下:

另外, LWPCookieJar 一樣能夠讀取和保存 Cookies ,可是保存的格式和 MozillaCookieJar 不同,
它會保存成 libwww-perl(LWP)格式的 Cookies 文件 。
要保存成 LWP 格式的 Cookies 文件,能夠在聲明時就改成:
cookie = http. cookiejar. LWPCookieJar (filename)
此時生成的內容以下:

由此看來,生成的格式仍是有比較大差別的 。
那麼,生成了 Cookies 文件後,怎樣從文件中讀取並利用呢?
下面咱們以 LWPCookieJar 格式爲例來看一下:

能夠看到,這裏調用 load ()方法來讀取本地的 Cookies 文件,獲取到了 Cookies 的內容 。 不過前提是咱們首先生成了 LWPCooki eJar 格式的 Cookies ,並保存成文件,而後讀取 Cookies 以後使用一樣的方法構建 Handler 和l Opener 便可完成操做 。運行結果正常的話,會輸出百度網頁的源代碼 。經過上面的方法,咱們能夠實現絕大多數請求功能的設置了 。這即是 urllib 庫中 request 模塊的基本用法,若是想實現更多的功能,能夠參考官方文檔的說明:https ://docs. p ython.org/3/library/urllib . request.html#basehandler-objects 。

相關文章
相關標籤/搜索