2015.3.6
urllib2的使用方法大體以下
# 定製Handler處理函數
opener = urllib2.build_opener(ProxyHandler, HTTPHandler)
urllib2.install_opener(opener)
# 定製URL參數
request = urllib2.Request()
request.add_headers(xxx)
# 打開URL,返回file-like對象
response = urllib2.urlopen(req)
# 得到結果
print response.read()
關鍵的處理機制分析
urlopen()函數
是處理的入口函數。
獲取 OpenerDirector 對象,調用 Opener.open()。
默認的OpenerDirector 對象保存在變量 _open中。
採用了Singleton模式。
是一個對象工廠函數,建立OpenerDirector對象。
內部提供了默認的handler列表,函數傳入的handler參數取代默認的handlers。
調用OpenerDirector.add_handler()函數,註冊handlers。先註冊默認的handler,再註冊定製的handler。按照在參數中的順序進行註冊。
install_opener()
將OpenerDirector對象保存到變量_opener中,做爲默認opener使用。
class OpenerDirector
採用了Composite模式。
add_handler():註冊handler對象到內部列表中。
open():調用handler列表中每一個對象的open方法,觸發處理操做。
class Request
做爲一個信息對象,保存和url相關的參數,包括headers、data、proxy等。用於url參數的傳遞。
class HTTPHandler
類繼承關係:BaseHandler -> AbstractHTTPHandler ->
HTTPHandler
調用 httplib.HTTPConnection 完成 HTTP的處理。