淺談Python http庫 httplib2
淺談Python http庫 httplib2
- http.client 是實現了rfc 2616, http 協議的底層庫
- urllib.request 建立在http.client之上一個抽象層。 它為訪問http 和 ftp 服務器提供了一個標準的api,可以自動跟隨http 重定向, 并且處理了一些常見形式的http 認證 </ul>
httplib2,一個第三方的開源庫,它比http.client更完整的實現了http協議,同時比urllib.request提供了更好的抽象。
一個httplib2.Http 類的實例
#coding=utf8import httplib2
獲取HTTP對象
h =httplib2.Http()
發出同步請求,并獲取內容
resp, content = h.request(" 一旦你有了Http對象, 獲取數據非常簡單,以你要的數據的地址作為參數調用request()方法就可以了。這會對該url執行一個http GET請求
request() 方法返回兩個值。第一個是一個httplib2.Response對象,其中包含了服務器返回的所有http頭。比如, status為200 表示請求成功。
content 變量包含了http服務器返回的實際數據。數據以bytes對象返回,不是字符串。 如果你需要一個字符串,你需要確定字符編碼并自己進行轉換
httplib2 緩存處理
#coding=utf8 import httplib2 #獲取HTTP對象 h =httplib2.Http('.cache') #發出同步請求,并獲取內容 resp, content = h.request("http://www.weirdbird.net/sitemap.xml") print resp # print content print("......"*3) httplib2.debuglevel = 1 h1 = httplib2.Http('.cache') resp,content = h1.request('http://www.weirdbird.net/sitemap.xml') print(resp) print('debug',resp.fromcache)
此時debug 是true ,說明 是從 本地的.cache 進行讀取,沒經過原網站,若我不讀緩存怎么辦? head 上加:
resp,content = h1.request('http://www.weirdbird.net/sitemap.xml',headers={'cache-control':'no-cache' })
httplib2 允許你添加任意的http頭部到發出的請求里。為了跳過所有緩存(不僅僅是你本地的磁盤緩存,也包括任何處于你和遠程服務器之間的緩存代理服務器), 在headers字典里面加入no-cache頭就可以了。
</div>httplib2怎么處理Last-Modified和ETag頭
故名思議, 這個是當服務器的資源改變了,若本地的緩存還有,進行更新的
http 為這種目的定義了Last-Modified和Etag頭。 這些頭被稱為驗證器(validators)。如果本地緩存已經不是新鮮的,客戶端可以在下一個請求的時候發送驗證器來檢查數據實際上有沒有改變。如果數 據沒有改變,服務器返回304狀態碼,但不返回數據。 所以雖然還會在網絡上有一個來回,但是你最終可以少下載一點字節。
這可能會讓人有些困惑。這里實際上有兩個 狀態碼 — 304 (服務器這次返回的, 導致httplib2查看它的緩存), 和 200 (服務器上次返回的, 并和頁面數據一起保存在httplib2的緩存里)。response.status返回緩存里的那個
http2lib 處理壓縮
每一次httplib2 發送請求,它包含了Accept-Encoding頭來告訴服務器它能夠處理deflate 或者 gzip壓縮。
當request()方法返回的時候,httplib2就已經解壓縮了響應的體(body)并將其放在 content變量里。如果你想知道響應是否壓縮過, 你可以檢查response['-content-encoding']; 否則,不用擔心了.
httplib2 處理重定向
302臨時重定向
調用request()方法返回的response是最終url的響應 ttplib2 會將最終的 url以 content-location加入到 response字典中。這不是服務器返回的頭,而是httplib2 特點的特征
response.previous屬性持有前一個響應對象的引用,httplib2跟隨那個響應獲得了當前的響應對象。
response 和 response.previous 都是 httplib2.Response 對象。
這意味著你可以通過response.previous.previous 來反向跟蹤重定向鏈到更前的請求。(場景: 一個url 重定向到第二個url,它又重定向到第三個url。這可能發生!) 在這例子里,我們已經到達了重定向鏈的開頭,所有這個屬性是None.
我們再次請求同一個url 發現變回了第一次 那樣的返回
301 永久重定向
一旦 httplib2跟隨了一個永久重定向, 所有后續的對這個url的請求會被透明的重寫到目標url 而不會接觸網絡來訪問原始的url。 記住, 調試還開著, 但沒有任何網絡活動的輸出。
HTTP POST
POST 請求同GET 請求不同,因為是要提交到服務器的, 這個api方法必須的參數是status, 并且它應該是url編碼過的。 這是一種很簡單的序列化格式,將一組鍵值對(比如字典)轉化為一個字符串。
POST 構造數據發送
from urllib.parse import urlencodeimport httplib2
httplib2.debuglevel = 1
h = httplib2.Http('.cache')
data = {'status': 'Test update from Python 3'}
h.add_credentials('diveintomark', 'MY_SECRET_PASSWORD', 'identi.ca')
resp, content = h.request(' add_credentials()方法的第三個參數是該證書有效的域名。你應該總是指定這個參數! 如果你省略了這個參數,并且之后重用這個httplib2.Http對象訪問另一個需要認證的站點,可能會導致httplib2將一個站點的用戶名密碼泄 漏給其他站點。
記住, httplib2返回的數據總是字節串(bytes), 不是字符串。為了將其轉化為字符串,你需要用合適的字符編碼進行解碼 比如:
print(content.decode('utf-8'))</div>xml操作
from xml.etree import ElementTree as etree tree = etree.fromstring(content) status_id = tree.findtext('id') url = 'https://identi.ca/api/statuses/destroy/{0}.xml'.format(status_id) resp, deleted_content = h.request(url, 'DELETE')</div>
原文地址:http://www.weirdbird.net/Python_Httplib2.html本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!