• python3 requests中文乱码问题之压缩格式问题


    我们在爬虫时,经常会遇见中文乱码问题,之前都是编码格式的问题,很少遇见由于压缩格式造成的编码混乱问题,特记录下。先看下混乱的编码样式。

    b'a\xd4l\x00 G6\xb5\xaa\xdf\xeaAy\x0f\xa0\xcaoZ\x92I&\x88\x14$p\xd8N\xb8\xaau\x02\xab\xdf\xeb\xac\x89r\x112q\x91\x99\xd8t\x1b\xa1"\x0b]\xb7\xf2\xee\xde[\xe8\x8a.\xd1\xa5\xe9(ZqE\xa1q\x08\x9dV\x0f\xba\x90\x11\x16K\x10^~\xc5|7\x02\x17\xd6\xef\t\x17\xea5\xe6}\xb6\x95\xf1\x91\xf6H\xa9o+s\xd3\xadv\xa9\xff\xb3\xad\xec\

     我们先看下header

    1. header = {
    2. "Content-Type":"application/json",
    3. "Accept": "application/json",
    4. "Accept-Encoding": "gzip, deflate, br",
    5. "Accept-Language": "zh-CN,zh;q=0.9",
    6. "Agw-Js-Conv": 'str',
    7. "Connection": "keep-alive",
    8. "Cookie":"***",
    9. "Host": "life.douyin.com",
    10. "Referer": "https://life.douyin.com/p/login",
    11. "sec-ch-ua": '"Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"',
    12. "sec-ch-ua-platform": "Android",
    13. "Sec-Fetch-Dest": "empty",
    14. "Sec-Fetch-Mode": "cors",
    15. "Sec-Fetch-Site": "same-origin",
    16. "User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Mobile Safari/537.36",
    17. "x-secsdk-csrf-token": "*",
    18. }

    我们注意到Content-Type是application/json,我们的数据是jason格式,这时要考虑中文转换问题,用utf-8来把中文从unicode转过来。

    我们转了后发现解析出来的数据还是乱码,这是什么情况呢?我们先看下请求头和响应头关于字段的解释

    请求头字段说明响应头字段
    Accept告知服务器发送何种媒体类型Content-Type
    Accept-Language告知服务器发送何种语言Content-Language
    Accept-Charset告知服务器发送何种字符集Content-Type
    Accept-Encoding告知服务器采用何种压缩方式Content-Encoding

    我们再看"Accept-Encoding",这个意思就是返回的数据使用的是什么压缩格式,平常我们经常使用"gzip, deflate",这是我们发现后面还跟了个br,br是什么格式呢?

    br 指的是 Brotli,是一种全新的数据格式,无损压缩,压缩比极高(比gzip高的)

    这需要单独导入brotil库

    安装

    pip install Brotli

    安装后我们使用brotli来解析数据即可,

    data = brotli.decompress(res.content)

    还有一种最简单的方法,我们修改请求头,高速服务器,我不支持br格式,这样服务器就不会用br来压缩数据了

    "Accept-Encoding": "gzip, deflate",

    补充下:BrotliDecompress failed错误问题

    刚开始我用request库时发现,对返回的response数据必须要引入brotli,这样才能解压缩数据,如果不引入无法解析数据,还是会反回乱码数据

    1. import brotli
    2. res = requests.get(url,headers = header,verify=False)
    3. print(res.content)
    4. print(res.text)
    5. if res.headers.get('Content-Encoding') == 'br':
    6. data = brotli.decompress(res.content)
    7. print(data.decode('utf-8'))
    8. else:
    9. print(res.text)
    但是在我使用httpx后,发先再使用brotli.decompress()方法,会造成报错

    Traceback (most recent call last):
      File "/****", line 61, in
        data = brotli.decompress(res.content)
    brotli.error: BrotliDecompress failed

    这时无需引入brotli库,httpx会自动引入,自动调用

    1. import json
    2. finish_data = []
    3. with httpx.Client(http2=True, verify=False) as client:
    4. cookies = httpx.Cookies()
    5. res = client.get(url,headers = header)
    6. if res.headers.get('Content-Encoding') == 'br':
    7. data = res.content.decode('utf-8')
    8. print(data)
    9. else:
    10. print(res.text)

  • 相关阅读:
    国内啤酒行业数据浅析
    从单体到微服务:使用Spring Boot构建事件驱动的Java应用程序
    【附源码】Python计算机毕业设计社区卫生预约挂号系统
    【虚拟机栈】
    24深圳杯数学建模挑战赛A题6页初步思路+参考论文+保姆级答疑!!!
    甘露糖-聚乙二醇-叠氮,mannose-PEG-N3,叠氮-PEG-甘露糖
    4.JS高级和promise
    支持导入ics文件的提醒待办类工具
    【数据分析】Python:处理缺失值的常见方法
    【代数学习题4.2】从零理解范数与迹 —— 求数域元素的范数与迹
  • 原文地址:https://blog.csdn.net/Jason_WangYing/article/details/126374604