python3.8 brotli brotli.error: BrotliDecompress başarısız oldu?

Sep 09 2020

mycode python3.8

brotli = 1.0.9

istek get url kullanın, üstbilgiler Accept-Encoding = "br" kullanın br kod çözme kullanmam gerekiyor, çünkü kabul-kodlama kullanın = br daha iyi

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 ""

hata yapmak

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

Yanıtlar

3 LaurentPinson Nov 03 2020 at 05:11

Bu, isteklerin belgelerinde hiçbir yerde belirtilmemiştir, ancak brotli bir kez kurulduktan sonra, doğrudan İstekler tarafından ele alınır.

Bu, response.content öğesinin otomatik olarak kodunun çözüleceği anlamına gelir (gzip'e benzer şekilde). Yapmana gerek yokbrotli.decompress(response.content)

brotli kurulu değilse herhangi bir hata mesajı almazsınız. Bunun yerine, response.content kodlanmış kalacaktır ...

düzenle :

Requests kodunu araştırırken, Requests'in Brotli kullanımını uygulayan urllib3.response kullandığını öğrendim.

yükleme sırasında urllib3.response, Brotli içe aktarımı arayacaktır:

try:
    import brotli
except ImportError:
    brotli = None

daha sonra bir yanıtın kodunu çözerken, uygun kod çözücüyü kullanacaktır:

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()

bu nedenle, Brotli kurulursa, kod çözme gerçekleşecek, aksi takdirde hiçbir şey olmayacak ve kullanıcıya hiçbir uyarı olmayacaktır.