【VB.NET】解密gzip压缩的网页数据流

vb.net

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

经过一番排查,发现该网站会检查客户端的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 As String ) As String

' 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 As New GZipStream(res.GetResponseStream, CompressionMode.Decompress)
' 用一个临时内存流来保存解压数据
Dim ms As New MemoryStream
' 缓冲数据
Dim buf( 99 ) As Byte , i As Integer = 0
' 不断从流中解压数据
While True
i
= gz.Read(buf, 0 , 100 )
If i = 0 Then Exit While
ms.Write(buf,
0 , i)
End While
' 将数据转换为字符
Dim ret As String = enc.GetString(ms.ToArray)

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

Return ret
End Function



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

转载于:https://www.cnblogs.com/clso/archive/2011/03/23/1992337.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值