首頁 > 軟體

python3 requests中文亂碼之壓縮格式問題解析

2022-08-19 22:02:05

我們在爬蟲時,經常會遇見中文亂碼問題,之前都是編碼格式的問題,很少遇見由於壓縮格式造成的編碼混亂問題,特記錄下。先看下混亂的編碼樣式。

b'axd4lx00 G6xb5xaaxdfxeaAyx0fxa0xcaoZx92I&x88x14$pxd8Nxb8xaaux02xabxdfxebxacx89rx112qx91x99xd8tx1bxa1"x0b]xb7xf2xeexde[xe8x8a.xd1xa5xe9(ZqExa1qx08x9dVx0fxbax90x11x16Kx10^~xc5|7x02x17xd6xeftx17xea5xe6}xb6x95xf1x91xf6Hxa9o+sxd3xadvxa9xffxb3xadxec

 我們先看下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中文亂碼內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com