1. 程式人生 > >Accept-Encoding學習

Accept-Encoding學習

今天使用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的內容而已。

還有很多要學習的呀。

參考資料: