C#使用webclient獲取搜狐網頁內容的亂碼問題

這幾天使用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/

相關文章
相關標籤/搜索