V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
nyxsonsleep
V2EX  ›  问与答

请教一下爬虫问题,有的 response 为什么不能在 Python 上解析?

  •  
  •   nyxsonsleep · 62 天前 · 983 次点击
    这是一个创建于 62 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教一下爬虫问题,有的 response 为什么不能在 python 上解析?

    同样的请求在网页的 network 里面可以解析,在 fiddler 里面也能解析。

    fiddler 获取截取到了 python 的 response ,可以正常解析,

    response = requests.get(url, headers=headers, proxies=proxies, verify=False)
    response.encoding = 'utf-8'
    print(response.text) #乱码
    print(response.content.decode('utf-8')) #乱码
    

    试了 utf8 、gbk 、gb180xx 、gb23xx 、ISO-xxx 之类的都无法正确解析。

    5 条回复    2024-02-25 23:54:42 +08:00
    NotFoundEgg
        1
    NotFoundEgg  
       62 天前   ❤️ 1
    请求头里 Accept-Encoding 的 br 去掉试试
    给出的信息太少了没法猜原因
    nyxsonsleep
        2
    nyxsonsleep  
    OP
       62 天前
    @NotFoundEgg 🐂🐂🐂感谢大佬。
    以前我好像也遇到过,但是没想起来哈,这个是压缩方式的原因吧?请教一下 br 是什么压缩方式,为什么 requests 默认不支持呀,还是说我的实现方式有问题。
    NotFoundEgg
        3
    NotFoundEgg  
       62 天前
    @nyxsonsleep br 压缩体积更小,但要额外解析
    NotFoundEgg
        4
    NotFoundEgg  
       62 天前
    @NotFoundEgg 我之前踩过这个坑,好像安个依赖就好了。但最简单粗暴的方法就是把 Accept-Encoding 里的 br 去掉
    zsh2517
        5
    zsh2517  
       62 天前   ❤️ 2
    @nyxsonsleep @NotFoundEgg 关键词 brotli ,HTTP 传输的时候可选的一种方式(以前是 gzip ,现在在往 br 过渡,br 压缩后的体积要比 gzip 小一些)。

    搜了一下,requests 库有一个相关的 issue: https://github.com/psf/requests/issues/4525 ,大概要点是

    1. python requests 库支持 br 依赖于 urllib3
    2. 根据时间,两三年前已经支持了
    3. “#5783 proposes a patch to request and decode in brotli, transparently by Requests, whenever the package brotli or brotlicffi are installed.”,似乎安装了 brotli 或者 brotlicffi 之后,才会自动解码

    综上,结合 #4 提到的“好像安个依赖”,应该是 python 没有内置 br 相关算法,然后 requests 依赖的 urllib3 会根据当前环境是否额外装了 brotli ,决定是否自动解压缩
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   894 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 20:25 · PVG 04:25 · LAX 13:25 · JFK 16:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.