這幾天使用c#的webclient進行網站頁面內容的獲取,可是在獲取搜狐網頁內容時,老是亂碼。開始覺得是編碼的問題,可是無論使用gb23十二、gbk、utf8,最終的結果都是亂碼,代碼以下:
WebClient wc = new WebClient();
byte[] pageData = web.DownloadData(url);
string strWeb = Encoding.Default.GetStringGetString(pageData );
最後發現是由於搜房網站頁面進行了壓縮致使,爲便於學習與保存,如下內容摘抄自擴展WebClient支持gzip,deflate壓縮頁面的自解壓,解決亂碼問題頁面內容:html
爲了加快頁面的下載速度,提高WEB服務器的性能,如今的不少網站,都開啓了頁面的壓縮輸出功能,經常使用的 gzip 和 deflate 。 java
在 .NET 平臺上,作網頁採集,經常使用的方式是使用 HttpWebRequest 和 WebClient。web
HttpWebRequest 是對 WebRequest 的http協議的實現。而WebClient是對HttpWebRequest的一個輕量級的封裝。c#
HttpWebRequest 功能完備,強大,可是使用較繁瑣,相比之下,WebClient 就簡單易用多了,可是,這個簡單也是一定有代價的,那就是精簡了不少HttpWebRequest具有的功能,例如:WebClient對Cookie的支持就被砍掉了。 服務器
從 .NET 2.0 開始,WebRequest就具有了對壓縮網頁自解壓的功能。實現的代碼,大體以下: ide
HttpWebRequest hwr = (HttpWebRequest)WebRequest.Create(url);性能
hwr.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;學習
很明顯,就是 AutomaticDecompression 這個屬性的使用,可是這個屬性的默認值是 DecompressionMethods.None 。網站
正是這個功能,在 WebClient 的實現裏,也被精簡掉了,致使 WebClient 繼承來的 WebRequest 的 AutomaticDecompression 屬性不能被更改。編碼
從而出現了,使用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,完成獲取網頁內容的工做
XWebClient web = new XWebClient(); byte[] pageData = web.DownloadData(url); string pageHtml = Encoding.Default.GetString(pageData); //若是獲取網站頁面採用的是GB2312,則使用這句