解密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
復制代碼



本人測試解壓數據成功,其他環境未進行測試,請自行修改。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM