zoukankan      html  css  js  c++  java
  • 关于 ContentEncoding: gzip 知道创宇

    关于 Content-Encoding: gzip - 知道创宇

    关于 Content-Encoding: gzip

    2012-04-20

    背景
    ===
    如果你的网页抓取程序(例如爬虫)在抓取网页时没有发送 Accept-Encoding: gzip,那么你 out 了:
    因为今天超过  99% 的网页抓取程序都会声明支持 gzip (或 deflate) 编码。

    如果你的程序属于这 99%,那么恭喜,但别高兴的太早。 你的程序是否正确处理了 Content-Encoding: gzip?

    问题
    ===
    典型的处理 Content-Encoding: gzip 的代码片段 (python):

    html_data = GzipFile(fileobj=StringIO(html_data), mode="r").read()

    假设 html_data 为 Web 服务器返回的Content-Encoding 为 gzip 的数据。

    那么在大多数情况下,上述代码都能正确处理。 但很不幸,你会发现,对有些 url,浏览器可以正常显示内容,
    但是你的网页抓取程序会出错!

    分析
    ===
    不是所有 Web 服务器(或应用)都是遵纪守法的公民。 极少数应用,会在 gzip 压缩后的数据后面,添加一些“尾巴”数据。
    一些数据解压模块(如Python 的 GzipFile 模块)在这种情况下会出现处理异常。

    例外的是浏览器。它们充分体会和考虑到了现实世界的复杂,会自动抛弃多出的“尾巴”,正常解压和处理页面数据。

    解决
    ===
    Python GzipFile 模块有个未公开属性: extrabuf, 负责保存已经成功解压的数据。 因此,下面的代码有更好的兼容性:

    try:
        gf = GzipFile(fileobj=StringIO(html_data), mode="r")
        html_data = gf.read()
    except:
        html_data = gf.extrabuf
  • 相关阅读:
    微信小程序退款【证书的使用】
    生成随机位数的UUID
    弹出层-layui
    load加载层-layui
    form-layui
    table-layui
    下拉列表模仿placeholder效果
    .net core 2.0 Unable to convert MySQL date/time to System.DateTime
    .net core Include问题
    .net core 2.0 配置Session
  • 原文地址:https://www.cnblogs.com/lexus/p/2997451.html
Copyright © 2011-2022 走看看