1 httplib簡介html
httplib 是python中http協議的客戶端實現,可使用該模塊來與 HTTP 服務器進行交互python
httplib是一個相對底層的http請求模塊,其上有專門的包裝模塊,如urllib內建模塊,goto等第三方模塊,可是封裝的越高就越不靈活,好比urllib模塊裏請求錯誤時就不會返回結果頁的內容,只有頭信息,對於某些須要檢測錯誤請求返回值的場景就不適用,因此就得用這個模塊了。web
httplib實現了HTTP和HTTPS的客戶端協議,通常不直接使用,在python更高層的封裝模塊中(urllib,urllib2)使用了它的HTTP和HTTPS實現。其中HTTPS須要socket編譯了SSL支持。HTTP類僅僅是和python1.5.2及之前的版本兼容,不推薦使用。chrome
2 httplib 詳解安全
下面介紹一下 httplib經常使用的類服務器
2.1 class httplib.HTTPConnectioncookie
HTTPConnection類 有兩種常見方式:dom
1 HTTPConnectionsocket
class httplib.HTTPConnection(host[,port[, strict[, timeout[, source_address]]]]) 用法: 該類用於建立一個http類型的請求連接 參數: host: 請求的服務器host,不能帶http://開頭 port: 服務器web服務端口 strict: 是否嚴格檢查請求的狀態行,就是http1.0/1.1 協議版本的那一行,即請求的第一行,默認爲False,爲True時檢查錯誤會拋異常 timeout: 單次請求的超時時間,沒有時默認使用httplib模塊內的全局的超時時間 返回: HTTPConnection類會實例並返回一個HTTPConnection對象 詳解: HttpConnection的實例表示與HTTP服務器的事務。實例化時須要傳遞主機和可選的端口號。若是沒有端口號,試圖以host:port格式從主機字符串提取,若是提取失敗則使用默認的HTTP端口(80)。參數strict默認爲false,表示在沒法解析狀態行時(status line)不能被HTTP/1.0或1.1解析時不拋出BadStatusLine異常;可選參數timeout表示即阻塞在多少秒後超時,若是沒有給出默認使用全局超時設置。可選參數source_address表示HTTP的源地址(host, port)。
2 HTTPSConnectionide
class httplib.HTTPSConnection(host[, port[, key_file[,cert_file[, strict[, timeout[, source_address]]]]]]) 用法: 該類用於建立一個https類型的請求連接 參數: key_file:一個包含PEM格式的私鑰文件 cert_file:一個包含PEM格式的認證文件 other:其它同http參數 返回: 一樣返回一個HTTPSConnection對象 注意: 要建立https連接,必需要保證底層的socket模塊是支持ssl的編譯模式,即編譯時ssl選項的開關是開着的 詳解: HttpConnection的子類,使用SSL與安全服務器通訊。默認端口爲443。key_file是包含PEM格式私鑰的文件名稱。 cert_file中是PEM格式的證書鏈文件。
附代碼:
HTTP:
>>> import httplib >>> conn =httplib.HTTPConnection('www.baidu.com') >>> conn = httplib.HTTPConnection('www.baidu.com:80') >>> conn =httplib.HTTPConnection('www.baidu.com','80') >>> conn =httplib.HTTPConnection('www.baidu.com','80',True) >>> conn =httplib.HTTPConnection('www.baidu.com','80',True,10)
錯誤示例:
>>> conn =httplib.HTTPConnection('www.baidu.com:80',True,10)
HTTPS:
>>> conn = httplib.HTTPSConnection('www.baidu.com',443,key_file,cert_file,True,10)
如下爲 關於 HTTPConnection 類的方法
2.1.1 HTTPConnection.request()
HTTPConnection.request( method , url [ , body [ , headers ]] ) 用法: 調用request方法會向服務器發送一次請求 參數: method: 請求的方式,如'GET','POST','HEAD','PUT','DELETE'等 url: 請求的網頁路徑。如:'/index.html' body: 請求是否帶數據,該參數是一個字典 headers: 請求是否帶頭信息,該參數是一個字典,不過鍵的名字是指定的http頭關鍵字 返回: 無返回,其實就是相對於向服務其發送數據,可是沒有最後回車
附代碼:
>>> import httplib >>>conn=httplib.HTTPConnection('www.baidu.com',80,False,10) >>> conn.request('get','/','',{'user-agent':'test'})
2.1.2 HTTPConnection.getresponse()
說明: 獲取一個http響應對象,至關於執行最後的2個回車 返回: HTTPResponse對象(下面會用到)
附代碼:
>>> import httplib >>> conn=httplib.HTTPConnection('www.baidu.com',80,False,10) >>> conn.request('get','/','',{'user-agent':'test'}) >>>res = conn.getresponse()
2.1.3 HTTPConnection.connect()
對象建立以後鏈接到指定的服務器
2.1.4 HTTPConnection.close()
關閉與服務器的鏈接
附代碼:
>>> import httplib >>> conn=httplib.HTTPConnection('www.baidu.com',80,False,10) >>> conn.request('get','/','',{'user-agent':'test'}) >>> res = conn.getresponse() >>>conn.close()
2.1.5 HTTPConnection.set_debuglevel( level )
設置高度的級別。參數level 的默認值爲0 ,表示不輸出任何調試信息
2.2 class httplib.HTTPResponse
HTTPResponse表示服務器對客戶端請求的響應。每每經過調用HTTPConnection.getresponse()來建立,實例鏈接成功以後返回的類,不能由用戶實例化。
它有以下方法和屬性:
2.2.1 HTTPResponse.read([amt])
說明: 得到http響應的內容部分,即網頁源碼 原型: body = res.read([amt])amt: 讀取指定長度的字符,默認爲空,即讀取全部內容 返回: 網頁內容字符串
獲取響應的消息體。若是請求的是一個普通的網頁,那麼該方法返回的是頁面的html。可選參數amt表示從響應流中讀取指定字節的數據。
附代碼:
>>>conn=httplib.HTTPConnection('www.baidu.com',80,False,10) >>> conn.request('GET','') >>> res = conn.getresponse() >>>res.read() #下面的爲網頁信息 '<!DOCTYPE html><!--STATUSOK-->\r\n<html>\r\n<head>\r\n\t<metahttp-equiv="content-type"content="text/html;charset=utf-8">\r\n\t<metahttp-equiv="X-UA-Compatible" content="IE=Edge">\r\n\t<linkrel="dns-prefetch"href="//s1.bdstatic.com"/>\r\n\t<linkrel="dns-prefetch" href="//t1.baidu.com"/>\r\n\t<linkrel="dns-prefetch" href="//t2.baidu.com"
2.2.2 HTTPResponse.getheader(name[, default])
獲取執指定的響應頭。Name表示頭域(headerfield)名,可選參數default在頭域名不存在的狀況下做爲默認值返回。
2.2.3 HTTPResponse.getheaders()
得到全部的響應頭內容,是一個元組列表[(name,value),(name2,value2)]
附代碼:
>>>res.getheaders() [('content-length', '14613'), ('bdqid','0x9d3801010001675e'), ('set-cookie','BAIDUID=9ACDF7C2DF8C2EA720CBD97636829343:FG=1; expires=Thu, 31-Dec-37 23:55:55GMT; max-age=2147483647; path=/; domain=.baidu.com,BIDUPSID=9ACDF7C2DF8C2EA720CBD97636829343; expires=Thu, 31-Dec-37 23:55:55 GMT;max-age=2147483647; path=/; domain=.baidu.com, PSTM=1436858070; expires=Thu,31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com,BDSVRTM=0; path=/'), ('accept-ranges', 'bytes'), ('vary', 'Accept-Encoding'),('bduserid', '0'), ('server', 'BWS/1.1'), ('last-modified', 'Wed, 03 Sep 201402:48:32 GMT'), ('connection', 'Keep-Alive'), ('x-ua-compatible', 'IE=Edge,chrome=1'),('pragma', 'no-cache'), ('cache-control', 'no-cache'), ('date', 'Tue, 14 Jul2015 07:14:30 GMT'), ('p3p', 'CP=" OTI DSP COR IVA OUR IND COM "'),('content-type', 'text/html'), ('bdpagetype', '1')]
2.2.4 HTTPResponse.msg
獲取全部的響應頭信息。包含響應頭的mimetools.Message實例
>>>res.msg <httplib.HTTPMessage instance at0x1959e60>
2.2.5 HTTPResponse.msg
獲取服務器所使用的http協議版本。11表示http/1.1;10表示http/1.0
>>> res.version 11
2.2.6 HTTPResponse.status
獲取響應的狀態碼。如:200表示請求成功
>>> res.status 200
2.2.6 HTTPResponse.reason
返回服務器處理請求的結果說明。通常爲」OK」
>>> res.reason 'OK'
2.3 class httplib.HTTPMessage
HTTPMessage實例用於保存HTTP響應頭。它使用mimetools.Message類實現,並提供了處理HTTP頭的工具函數。它不直接實例化的用戶。不能由用戶實例化。
2.4 異常
exception httplib.HTTPException
Exception的子類,此模塊中的其餘異常的基類。下面的類默認是該類的直接子類。
httplib.NotConnected
httplib.InvalidURL
httplib.UnknownProtocol
httplib.UnknownTransferEncoding
httplib.UnimplementedFileMode
httplib.IncompleteRead
httplib.ImproperConnectionState
httplib.CannotSendRequest
ImproperConnectionState的一個子類。
httplib.CannotSendHeader
ImproperConnectionState的一個子類。
httplib.ResponseNotReady
ImproperConnectionState的一個子類。
httplib.BadStatusLine
服務器返回的HTTP狀態碼不認識時產生。
2.5 常量和類變量
httplib.HTTP_PORT:HTTP協議的默認端口,恆爲80。
httplib.HTTPS_PORT:HTTPS協議的默認端口,恆爲443。
httplib.responses:映射HTTP1.1狀態代碼映射到W3C的名字的字典。