python3?requests中文亂碼之壓縮格式問(wèn)題解析
我們?cè)谂老x(chóng)時(shí),經(jīng)常會(huì)遇見(jiàn)中文亂碼問(wèn)題,之前都是編碼格式的問(wèn)題,很少遇見(jiàn)由于壓縮格式造成的編碼混亂問(wèn)題,特記錄下。先看下混亂的編碼樣式。
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,我們的數(shù)據(jù)是jason格式,這時(shí)要考慮中文轉(zhuǎn)換問(wèn)題,用utf-8來(lái)把中文從unicode轉(zhuǎn)過(guò)來(lái)。
我們轉(zhuǎn)了后發(fā)現(xiàn)解析出來(lái)的數(shù)據(jù)還是亂碼,這是什么情況呢?我們先看下請(qǐng)求頭和響應(yīng)頭關(guān)于字段的解釋
| 請(qǐng)求頭字段 | 說(shuō)明 | 響應(yīng)頭字段 |
| Accept | 告知服務(wù)器發(fā)送何種媒體類型 | Content-Type |
| Accept-Language | 告知服務(wù)器發(fā)送何種語(yǔ)言 | Content-Language |
| Accept-Charset | 告知服務(wù)器發(fā)送何種字符集 | Content-Type |
| Accept-Encoding | 告知服務(wù)器采用何種壓縮方式 | Content-Encoding |
我們?cè)倏?quot;Accept-Encoding",這個(gè)意思就是返回的數(shù)據(jù)使用的是什么壓縮格式,平常我們經(jīng)常使用"gzip, deflate",這是我們發(fā)現(xiàn)后面還跟了個(gè)br,br是什么格式呢?
br 指的是 Brotli,是一種全新的數(shù)據(jù)格式,無(wú)損壓縮,壓縮比極高(比gzip高的)
這需要單獨(dú)導(dǎo)入brotil庫(kù)
安裝
pip install Brotli
安裝后我們使用brotli來(lái)解析數(shù)據(jù)即可,
data = brotli.decompress(res.content)
還有一種最簡(jiǎn)單的方法,我們修改請(qǐng)求頭,高速服務(wù)器,我不支持br格式,這樣服務(wù)器就不會(huì)用br來(lái)壓縮數(shù)據(jù)了
"Accept-Encoding": "gzip, deflate",
補(bǔ)充下:BrotliDecompress failed錯(cuò)誤問(wèn)題
剛開(kāi)始我用request庫(kù)時(shí)發(fā)現(xiàn),對(duì)返回的response數(shù)據(jù)必須要引入brotli,這樣才能解壓縮數(shù)據(jù),如果不引入無(wú)法解析數(shù)據(jù),還是會(huì)反回亂碼數(shù)據(jù)
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后,發(fā)先再使用brotli.decompress()方法,會(huì)造成報(bào)錯(cuò)
Traceback (most recent call last):
File "/****", line 61, in <module>
data = brotli.decompress(res.content)
brotli.error: BrotliDecompress failed
這時(shí)無(wú)需引入brotli庫(kù),httpx會(huì)自動(dòng)引入,自動(dòng)調(diào)用
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)到此這篇關(guān)于python3 requests中文亂碼問(wèn)題之壓縮格式問(wèn)題的文章就介紹到這了,更多相關(guān)python3 requests中文亂碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解決Keras中循環(huán)使用K.ctc_decode內(nèi)存不釋放的問(wèn)題
這篇文章主要介紹了解決Keras中循環(huán)使用K.ctc_decode內(nèi)存不釋放的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06
Python+Appium實(shí)現(xiàn)自動(dòng)化測(cè)試的使用步驟
這篇文章主要介紹了Python+Appium實(shí)現(xiàn)自動(dòng)化測(cè)試的使用步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Python?copy()與deepcopy()方法之間有什么區(qū)別
這篇文章主要介紹了Python中的copy()和deepcopy(),下面詳細(xì)介紹該內(nèi)容并附上詳細(xì)代碼,需要的朋友可以參考一下文章的具體內(nèi)容,希望對(duì)你有所幫助2022-10-10
Python中的遠(yuǎn)程調(diào)試與性能優(yōu)化技巧分享
Python 是一種簡(jiǎn)單易學(xué)、功能強(qiáng)大的編程語(yǔ)言,廣泛應(yīng)用于各種領(lǐng)域,包括網(wǎng)絡(luò)編程、數(shù)據(jù)分析、人工智能等,在開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到需要遠(yuǎn)程調(diào)試和性能優(yōu)化的情況,本文將介紹如何利用遠(yuǎn)程調(diào)試工具和性能優(yōu)化技巧來(lái)提高 Python 應(yīng)用程序的效率和性能2024-05-05
詳解用pyecharts Geo實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)熱力圖城市找不到問(wèn)題解決
這篇文章主要介紹了詳解用pyecharts Geo實(shí)現(xiàn)動(dòng)態(tài)數(shù)據(jù)熱力圖城市找不到問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06

