python中urllib和urllib2小結

原文來自網絡摘抄,參考網址:

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 簡介

1urllib相比,顯著區別之處在於:

1) urllib2可以接受一個Request類的實例來設置URL請求的headersurllib僅可以接受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參數,該參數只對HTTPHTTPSFTP生效

 

假設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

HTTPerrorHTTP URL在特別的情況下被拋出的URLError的一個子類。

urlerror

    通常,urlerror被拋出是因爲沒有網絡 連接(沒有至特定服務器的連接)或者特定的服務器不存在。在這種情況下,含有reason屬性的異常將被拋出,以一種包含錯誤代碼 和文本錯誤信息的tuple形式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章