python3.8 brotli brotli.error: BrotliDecompress gagal?
mycode python3.8
brotli = 1.0.9
gunakan request get url, header gunakan Accept-Encoding = "br" saya perlu menggunakan decode br, karena menurut saya gunakan accept-encoding = br lebih baik
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 ""
meningkatkan kesalahan
data = brotli.decompress(response.content)
brotli.error: BrotliDecompress failed
Jawaban
Ini tidak disebutkan di mana pun dalam dokumentasi permintaan tetapi setelah brotli dipasang, brotli langsung ditangani oleh Permintaan.
Artinya, response.content akan otomatis didekodekan (mirip dengan gzip). Anda tidak perlu melakukannyabrotli.decompress(response.content)
jika brotli tidak diinstal, Anda tidak akan mendapatkan pesan kesalahan apa pun. Sebaliknya, response.content akan tetap dienkode ...
edit :
menggali kode Permintaan, saya menemukan bahwa Permintaan menggunakan urllib3.response yang mengimplementasikan penggunaan Brotli.
setelah memuat, urllib3.response akan mencari impor Brotli:
try:
import brotli
except ImportError:
brotli = None
kemudian saat mendekode respons, itu akan menggunakan decoder yang sesuai:
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()
jadi jika Brotli diinstal, decoding akan terjadi, jika tidak, tidak akan terjadi apa-apa dan tidak ada peringatan kepada pengguna.