Accept-Encoding學習
阿新 • • 發佈:2019-01-03
今天使用python的 urlilib2訪問天氣介面的時候一直亂碼,原因是內容被gzip壓縮了,對內容解壓縮即可。python2的urllib2讀取網頁亂碼
問題是解決了,可是為什麼訪問這個介面會因為gzip壓縮亂碼,而訪問百度等其他網站不會亂碼。
之前以為是urllib2在read前自己判斷了meta的一些內容,然後做了gzip解壓縮。檢視原始碼後,未找到該操作。
轉而把注意力放到gzip本身上,gzip除了在Response的Header上有出現,在Request的Header上也有。
Response Headers Content-Encoding:gzip Request Headers Accept-Encoding:gzip, deflate, sdch, br
查詢得知:
當客戶端傳送Accept-Encoding:gzip這個request header,伺服器即認為其能接受gzip壓縮,就響應一個Content-Encoding:gzip,併發送壓縮內容;假如客戶端沒有傳送 Accept-Encoding,那麼伺服器就把原始碼老老實實地打印出去。
強制返回gzip壓縮的內容
由於之前未加header,百度直接返回了未壓縮的內容。
import urllib2 import gzip import StringIO headers={'Accept-Encoding':'gzip'} url='http://www.baidu.com' request = urllib2.Request(url,headers=headers) res = urllib2.urlopen(request) s = res.read() print(s) print('----------------------') s=StringIO.StringIO(s) gzipper=gzip.GzipFile(fileobj=s) ungzipStr=gzipper.read() print(ungzipStr)
解壓縮後內容才是正常的。
可見,當客戶端傳送Accept-Encoding:gzip這個request header的時候,伺服器會返回gzip壓縮後的內容。之前的天氣預報介面不過是強制返回了gzip的內容而已。
還有很多要學習的呀。
參考資料: