【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即可完成操作。 執行結果正常的話,會輸出百度網頁的原始碼。 通過以上的方法,我們可以實現絕大多數請求功能的設定了。