• 解密gzip压缩的网页数据流(转)


    因为采集某个网页遇到问题,一直无法获取页面数据。

    经过一番排查,发现该网站会检查客户端的Header信息,如果遇到不明确的Header信息就直接否定,返回0数据。

    如果Header信息正确,就会返回经过GZip压缩的数据,这样直接获取网页数据的想法破灭了。

     

    实际上.NET已经为我们封装好了GZip和Deflate加解压算法类,都位于 System.IO.Compression 命名空间内。

    下面我来演示如何分析并提取经过GZIP压缩的网页数据流。

    复制代码
    Imports System.Net
    Imports System.IO
    Imports System.IO.Compression
    Imports System.Text



    Function GZip2Html(ByVal url AsString) AsString

    ' HTTP请求
    Dim req As HttpWebRequest = HttpWebRequest.Create(url)
    req.Method ="GET"'GET 或 POST
    req.Accept ="*/*"
    req.UserAgent ="Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1;)"'这里模拟 XP系统 IE7 的请求字段
    req.Referer ="来源地址"

    ' 一些头信息的模拟
    req.Headers("Accept-Language") ="zh-cn"
    req.Headers("UA-CPU") ="x86"
    req.Headers("Accept-Encoding") ="gzip, deflate"

    ' HTTP获取
    Dim res As HttpWebResponse = req.GetResponse
    ' 获取数据文本编码
    'Dim enc As Encoding = Encoding.GetEncoding(res.CharacterSet) '如果出现乱码请换下面这种方式
    Dim enc As Encoding = Encoding.Default

    ' 创建一个GZip解压流
    Dim gz AsNew GZipStream(res.GetResponseStream, CompressionMode.Decompress)
    ' 用一个临时内存流来保存解压数据
    Dim ms AsNew MemoryStream
    ' 缓冲数据
    Dim buf(99) AsByte, i AsInteger=0
    ' 不断从流中解压数据
    WhileTrue
    i = gz.Read(buf, 0, 100)
    If i =0ThenExitWhile
    ms.Write(buf, 0, i)
    EndWhile
    ' 将数据转换为字符
    Dim ret AsString= enc.GetString(ms.ToArray)

    ' 关闭所有的流
    gz.Close()
    ms.Close()
    res.Close()

    Return ret
    End Function
    复制代码



    本人测试解压数据成功,其他环境未进行测试,请自行修改。

  • 相关阅读:
    常用资源
    printf打印颜色
    Vue开发中踩坑-Day3
    Vue开发踩坑-Day2
    Vue开发中的踩坑-day1
    Python中virtualenv的使用
    第十一章:Python高级编程-协程和异步IO
    第十章:Python高级编程-多线程、多进程和线程池编程
    第九章:Python高级编程-Python socket编程
    自定义Element父子不关联的穿梭树
  • 原文地址:https://www.cnblogs.com/rainbowzc/p/4321943.html
Copyright © 2020-2023  润新知