1. 程式人生 > >【Python3 爬蟲學習筆記】基本庫的使用 2

【Python3 爬蟲學習筆記】基本庫的使用 2

1.3 高階用法

urllib.request模組裡的BaseHandler類,是所有其他Handler的父類,它提供了最基本的方法,例如default_open()、protocol_request()等。

  • HTTPDefaultErrorHandler:用於處理HTTP響應錯誤,錯誤都會丟擲HTTPError型別的異常。
  • HTTPRedirectHandler:用於處理重定向。
  • HTTPCookieProcessor:用於處理Cookies。
  • ProxyHandler:用於設定代理,預設代理為空。
  • HTTPPasswordMgr:用於管理密碼,它維護了使用者名稱和密碼的表。
  • HTTPBasicAuthHandler:
    用於管理認證,如果一個連結開啟時需要認證,那麼可以用它來解決認證問題。

另一個比較重要的類就是OpenerDirector,我們可以稱為Opener。urlopen()這個方法,實際上是urllib為我們提供的一個Opener。

幾個例項:

1.3.1 代理

在做爬蟲的時候,免不了要使用代理,如果要新增代理,可以如此:

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埠上。 這裡使用了ProxyHandler,其引數是一個詞典,鍵名是協議型別(比如HTTP或者HTTPS等),鍵值是代理連結,可以新增多個代理。 然後,利用這個Handler及build_opener()方法構造一個Opener,之後傳送請求即可。

1.3.2 Cookies

Cookies的處理就需要相關的Handler了。 一個例項,如何將網站的Cookies獲取下來:

import http.cookiejar, urllib.request

cookie = http.cookiejar.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+"="+item.value)

首先,要宣告一個CookieJar物件。接下來需要利用HTTPCookieProcessor來構建一個Handler,最後利用build_opener()方法構建出Opener,執行open()函式即可。 執行結果如下: 這裡寫圖片描述

可以看出,這裡輸出了每條Cookie的名稱和值。 同樣可以以文字方式儲存下來:

import http.cookiejar, urllib.request

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就需要換成MozillaCookieJar,它在生成檔案時會用到,是CookieJar的子類,可以用來處理Cookies和檔案相關的事件,比如讀取和儲存Cookies,可以將Cookies儲存成Mozilla型瀏覽器的Cookies格式。 生成的cookies.txt檔案內容如下: 這裡寫圖片描述

另外,LWPCookieJar同樣可以讀取和儲存Cookies,但是儲存的格式和MozillaCookiesJar不一樣,它會儲存成libwww-perl(LWP)格式的Cookies檔案。 要儲存成LWP格式的Cookies檔案,可以在宣告時改成:

cookie = http.cookiejar.LWPCookieJar(filename)

讀取Cookies檔案的方法:

cookie = http.cookiejar.LWPCookieJar()
cookie.load('cookies.txt', ignore_discard=True, ignore_expires=True)
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
print(response.read().decode('utf-8'))

可以看出,這裡呼叫load()方法來讀取本地的Cookies檔案,獲取到了Cookies的內容。不過前提是我們生成了LWPCookieJar格式的Cookies,並儲存成檔案,然後讀取Cookies之後使用同樣的方法構建Handler和Opener即可完成操作。 執行結果正常的話,會輸出百度網頁的原始碼。 通過以上的方法,我們可以實現絕大多數請求功能的設定了。