python3.8 brotli brotli.error: BrotliDecompress başarısız oldu?
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
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.