python3.8 brotli brotli.error: BrotliDecompress ล้มเหลว?

Sep 09 2020

mycode python3.8

brotli = 1.0.9

ใช้ request get url ส่วนหัวใช้ Accept-Encoding = "br" ฉันต้องใช้ decode br เพราะฉันคิดว่าใช้ accept-encoding = br ดีกว่า

import brotli
import requests 
headers = {}
headers['Accept'] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
headers['Accept-Encoding'] = "gzip, deflate, br"
headers['Host'] = "book.douban.com"
headers['Referer'] = "book.douban.com"
headers['Sec-Fetch-Dest'] = "document"
headers['Sec-Fetch-Mode'] = "navigate"
headers['Upgrade-Insecure-Requests'] = "1"

s=requests.Session()
url="https://book.douban.com/tag/%E5%B0%8F%E8%AF%B4"
try:
    response = s.get(url, headers=headers)
except:
    return ""
if response.status_code == 200:
    print(response.headers)
    if response.headers.get('Content-Encoding') == 'br':
        data = brotli.decompress(response.content)
        data1 = data.decode('utf-8')
        return data1
    else:
        return response.text
return ""

เพิ่มข้อผิดพลาด

data = brotli.decompress(response.content)
brotli.error: BrotliDecompress failed

คำตอบ

3 LaurentPinson Nov 03 2020 at 05:11

ไม่มีการกล่าวถึงสิ่งนี้ในเอกสารของคำขอแต่เมื่อติดตั้งbrotli แล้วคำขอจะจัดการโดยตรง

ซึ่งหมายความว่า response.content จะถูกถอดรหัสโดยอัตโนมัติ (คล้ายกับ gzip) คุณไม่จำเป็นต้องทำbrotli.decompress(response.content)

หากไม่ได้ติดตั้ง brotli คุณจะไม่ได้รับข้อความแสดงข้อผิดพลาดใด ๆ แต่ response.content จะยังคงเข้ารหัส ...

แก้ไข :

ขุดในรหัสคำขอฉันพบว่าคำขอใช้ urllib3.response ซึ่งดำเนินการใช้งาน Brotli

เมื่อโหลด urllib3.response จะค้นหาการนำเข้า Brotli:

try:
    import brotli
except ImportError:
    brotli = None

จากนั้นเมื่อถอดรหัสการตอบสนองจะใช้ตัวถอดรหัสที่เหมาะสม:

def _get_decoder(mode):
    if "," in mode:
        return MultiDecoder(mode)

    if mode == "gzip":
        return GzipDecoder()

    if brotli is not None and mode == "br":
        return BrotliDecoder()

    return DeflateDecoder()

ดังนั้นหากติดตั้ง Brotli การถอดรหัสจะไม่เกิดขึ้นอีกจะไม่มีอะไรเกิดขึ้นและจะไม่มีการเตือนผู้ใช้