python3.8 brotli brotli.error: BrotliDecompress falhou?
mycode python3.8
brotli = 1.0.9
use request get url, headers use Accept-Encoding = "br" Eu preciso usar decode br, porque eu acho que use accept-encoding = br mais bom
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 ""
aumentar o erro
data = brotli.decompress(response.content)
brotli.error: BrotliDecompress failed
Respostas
Isso não é mencionado em nenhum lugar na documentação de solicitações, mas uma vez que o brotli é instalado, é diretamente tratado por Solicitações.
Isso significa que response.content será decodificado automaticamente (de forma semelhante ao gzip). Você não precisa fazerbrotli.decompress(response.content)
se o brotli não estiver instalado, você não receberá nenhuma mensagem de erro. Em vez disso, response.content permanecerá codificado ...
editar :
pesquisando no código de Requests, descobri que Requests usam urllib3.response, que implementa o uso de Brotli.
ao carregar, urllib3.response procurará uma importação de Brotli:
try:
import brotli
except ImportError:
brotli = None
então, ao decodificar uma resposta, ele usará o decodificador apropriado:
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()
portanto, se o Brotli estiver instalado, a decodificação ocorrerá senão nada acontecerá e nenhum aviso ao usuário.