python3 requests中文亂碼之壓縮格式問題解析
我們在爬蟲時,經常會遇見中文亂碼問題,之前都是編碼格式的問題,很少遇見由於壓縮格式造成的編碼混亂問題,特記錄下。先看下混亂的編碼樣式。
b'a\xd4l\x00 G6\xb5\xaa\xdf\xeaAy\x0f\xa0\xcaoZ\x92I&\x88\x14$p\xd8N\xb8\xaau\x02\xab\xdf\xeb\xac\x89r\x112q\x91\x99\xd8t\x1b\xa1"\x0b]\xb7\xf2\xee\xde[\xe8\x8a.\xd1\xa5\xe9(ZqE\xa1q\x08\x9dV\x0f\xba\x90\x11\x16K\x10^~\xc5|7\x02\x17\xd6\xef\t\x17\xea5\xe6}\xb6\x95\xf1\x91\xf6H\xa9o+s\xd3\xadv\xa9\xff\xb3\xad\xec\
我們先看下header
header = { "Content-Type":"application/json", "Accept": "application/json", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9", "Agw-Js-Conv": 'str', "Connection": "keep-alive", "Cookie":"***", "Host": "life.douyin.com", "Referer": "https://life.douyin.com/p/login", "sec-ch-ua": '"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"', "sec-ch-ua-platform": "Android", "Sec-Fetch-Dest": "empty", "Sec-Fetch-Mode": "cors", "Sec-Fetch-Site": "same-origin", "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Mobile Safari/537.36", "x-secsdk-csrf-token": "*", }
我們註意到Content-Type是application/json,我們的數據是jason格式,這時要考慮中文轉換問題,用utf-8來把中文從unicode轉過來。
我們轉瞭後發現解析出來的數據還是亂碼,這是什麼情況呢?我們先看下請求頭和響應頭關於字段的解釋
請求頭字段 | 說明 | 響應頭字段 |
Accept | 告知服務器發送何種媒體類型 | Content-Type |
Accept-Language | 告知服務器發送何種語言 | Content-Language |
Accept-Charset | 告知服務器發送何種字符集 | Content-Type |
Accept-Encoding | 告知服務器采用何種壓縮方式 | Content-Encoding |
我們再看"Accept-Encoding",這個意思就是返回的數據使用的是什麼壓縮格式,平常我們經常使用"gzip, deflate",這是我們發現後面還跟瞭個br,br是什麼格式呢?
br 指的是 Brotli,是一種全新的數據格式,無損壓縮,壓縮比極高(比gzip高的)
這需要單獨導入brotil庫
安裝
pip install Brotli
安裝後我們使用brotli來解析數據即可,
data = brotli.decompress(res.content)
還有一種最簡單的方法,我們修改請求頭,高速服務器,我不支持br格式,這樣服務器就不會用br來壓縮數據瞭
"Accept-Encoding": "gzip, deflate",
補充下:BrotliDecompress failed錯誤問題
剛開始我用request庫時發現,對返回的response數據必須要引入brotli,這樣才能解壓縮數據,如果不引入無法解析數據,還是會反回亂碼數據
import brotli res = requests.get(url,headers = header,verify=False) print(res.content) print(res.text) if res.headers.get('Content-Encoding') == 'br': data = brotli.decompress(res.content) print(data.decode('utf-8')) else: print(res.text)
但是在我使用httpx後,發先再使用brotli.decompress()方法,會造成報錯
Traceback (most recent call last):
File "/****", line 61, in <module>
data = brotli.decompress(res.content)
brotli.error: BrotliDecompress failed
這時無需引入brotli庫,httpx會自動引入,自動調用
import json finish_data = [] with httpx.Client(http2=True, verify=False) as client: cookies = httpx.Cookies() res = client.get(url,headers = header) if res.headers.get('Content-Encoding') == 'br': data = res.content.decode('utf-8') print(data) else: print(res.text)
到此這篇關於python3 requests中文亂碼問題之壓縮格式問題的文章就介紹到這瞭,更多相關python3 requests中文亂碼內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!