原文來自網絡摘抄,參考網址:
http://6226001001.blog.51cto.com/9243584/1911472
主要對原文進行了縮減,方便查看,勿噴,謝謝。
5 主要功能
request處理客戶端的請求
response處理服務端的響應
parse會解析url
下面討論的是request
urllib.request模塊定義了一些打開URLs(一般是HTTP協議)複雜操作像是basic 和摘要模式認證,重定向,cookies等的方法和類。這個模塊式模擬文件模塊實現的,將本地的文件路徑改爲遠程的url。因此函數返回的是類文件對象(file-like object)
urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)
url可以是一個字符串形式或者Request 對象
如果data參數有值就是用post方式響應否則默認爲GET 方式
urllib.request 模塊使用HTTP/1.1 的無連接的狀態協議
5.2 urlopen()函數返回類文件對象,提供以下內建方法:
read() , readline() ,readlines() , fileno() , close() 這些方法的使用方式與文件對象完全一樣
info():返回一個httplib.HTTPMessage對象,表示遠程服務器返回的頭信息
getcode():返回Http狀態碼。(詳情參考https://tools.ietf.org/html/rfc7231#section-6)
如果是http請求:
1xx(informational):請求已經收到,正在進行中
2xx(successful):請求成功接收,解析,完成
3xx(Redirection):需要重定向
4xx(Client Error):客戶端問題,請求存在語法錯誤,網址未找到
5xx(Server Error):服務器問題
geturl():返回請求的url
5.3 urllib2 簡介
1:與urllib相比,顯著區別之處在於:
1) urllib2可以接受一個Request類的實例來設置URL請求的headers,urllib僅可以接受URL。這意味着,用urllib時不可以僞裝User Agent字符串等。
2) urllib提供urlencode方法用來encode發送的data,而urllib2沒有。這是爲何urllib常和urllib2一起使用的原因。
2: urllib2 常用方法
2.1 urllib2.urlopen
urlopen()是最簡單的請求方式,它打開url並返回類文件對象,並且使用該對象可以讀取返回的內容
urllib2.urlopen(url[, data][, timeout])
參數:
url: 可以是包含url的字符串,也可以是urllib2.request類的實例。
data: 是經過編碼的post數據(一般使用urllib.urlencode()來編碼)。
沒有data參數時爲GET請求,設置data參數時爲POST請求
timeout: 是可選的超時期(以秒爲單位),設置請求阻塞的超時時間,如果沒有設置的話,會使用全局默認timeout參數,該參數只對HTTP、HTTPS、FTP生效
假設urlopen()返回的文件對象u,它支持下面的這些常用的方法:
u.read([nbytes]) 以字節字符串形式讀取nbytes個數據
u.readline() 以字節字符串形式讀取單行文本
u.readlines() 讀取所有輸入行然後返回一個列表
u.close() 關閉鏈接
u.getcode() 返回整數形式的HTTP響應代碼,比如成功返回200,未找到文件時返回404
u.geturl() 返回所返回的數據的實際url,但是會考慮發生的重定向問題
u.info() 返回映射對象,該對象帶有與url關聯的信息。
對HTTP來說,返回的服務器響應包含HTTP包頭。
對於FTP來說,返回的報頭包含'content-length'。
對於本地文件,返回的報頭包含‘content-length’和'content-type'字段。
注意:
類文件對象u以二進制模式操作。如果需要以文本形式處理響應數據,則需要使用codecs模塊或類似
方式解碼數據。
2.2 urllib2.request
新建Request實例
Request (url [data,headers[,origin_req_host ,[unverifiable]]]])
說明:
對於比較簡單的請求,urlopen()的參數url就是一個代表url的,但如果需要執行更復雜的操作,如修改HTTP報頭,可以創建Request實例並將其作爲url參數
參數:
url: 爲url字符串,
data: 是伴隨url提交的數據(比如要post的數據)。不過要注意,提供data參數時,它會將HTTP請求從'GET'改爲‘POST’。
headers: 是一個字典,包含了可表示HTTP報頭的鍵值映射(即要提交的header中包含的內容)。
origin_req_host: 通常是發出請求的主機的名稱,如果請求的是無法驗證的url(通常是指不是用戶直接輸入的url,比如加載圖像的頁面中鑲入的url),則後一個參數unverifiable設爲TRUE
假設Request實例r,其比較重要的方法有下面幾個:
r.add_data(data) 向請求添加數據。如果請求是HTTP請求,則方法改爲‘POST’。
data是向指定url提交的數據,要注意該方法不會將data追教導之前已經設置的任何數據上,而是使用現在的data替換之前的。
r.add_header(key, val) 向請求添加header信息,key是報頭名,val是報頭值,兩個參數都是字符串。
r.addunredirectedheader(key,val) 作用基本同上,但不會添加到重定向請求中。
r.set_proxy(host, type) 準備請求到服務器。使用host替換原來的主機,使用type替換原來的請求類型。
2.3 異常處理
不能處理一個respons時,urlopen拋出一個urlerror
urllib2.URLError:
urllib2.HTTPError:
HTTPerror是HTTP URL在特別的情況下被拋出的URLError的一個子類。
urlerror:
通常,urlerror被拋出是因爲沒有網絡 連接(沒有至特定服務器的連接)或者特定的服務器不存在。在這種情況下,含有reason屬性的異常將被拋出,以一種包含錯誤代碼 和文本錯誤信息的tuple形式。