這幾天使用c#的webclient進行網站頁面內容的獲取,可是在獲取搜狐網頁內容時,老是亂碼。開始覺得是編碼的問題,可是無論使用gb23十二、gbk、utf8,最終的結果都是亂碼,代碼以下:
WebClient wc = new WebClient();
byte[] btWeb = wc.DownloadData(strUrl);
string strWeb = System.Text.Encoding.GetEncoding("GBK").GetString(btWeb);
最後經過google發現是由於搜狐網站頁面進行了壓縮致使,爲便於學習與保存,如下內容摘抄自擴展WebClient支持gzip,deflate壓縮頁面的自解壓,解決亂碼問題頁面內容:html
爲了加快頁面的下載速度,提高WEB服務器的性能,如今的不少網站,都開啓了頁面的壓縮輸出功能,經常使用的 gzip 和 deflate 。 java
在 .NET 平臺上,作網頁採集,經常使用的方式是使用 HttpWebRequest 和 WebClient。web
HttpWebRequest 是對 WebRequest 的http協議的實現。而WebClient是對HttpWebRequest的一個輕量級的封裝。c#
HttpWebRequest 功能完備,強大,可是使用較繁瑣,相比之下,WebClient 就簡單易用多了,可是,這個簡單也是一定有代價的,那就是精簡了不少HttpWebRequest具有的功能,例如:WebClient對Cookie的支持就被砍掉了。本文做者δCat http://rtmd.net服務器
從 .NET 2.0 開始,WebRequest就具有了對壓縮網頁自解壓的功能。實現的代碼,大體以下: ide
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(url);性能
hwr.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;學習
很明顯,就是 AutomaticDecompression 這個屬性的使用,可是這個屬性的默認值是 DecompressionMethods.None 。網站
正是這個功能,在 WebClient 的實現裏,也被精簡掉了,致使 WebClient 繼承來的 WebRequest 的 AutomaticDecompression 屬性不能被更改。google
從而出現了,使用WebClient獲取被壓縮的頁面時,雖然指定了正確的編碼,但返回的Html依舊是亂碼,而事實上這並非亂碼,而是壓縮後的html內容。
下面咱們對WebClient進行一個繼承並擴展,讓它支持自解壓。
public class XWebClient : WebClient {
protected override WebRequest GetWebRequest(Uri address) {
HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
return request;
}
}
上面的代碼,咱們新建了一個XWebClient類,繼承自WebClient,而後,重載了WebClient的GetWebRequest事件,將AutomaticDecompression屬性的值,改成默認支持壓縮。
剩下的,就使用XWebClient來代替WebClient,完成獲取網頁內容的工做
PS:源地址:http://china.ygw.blog.163.com/blog/static/687197462014013105742966/