这几天使用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,则使用这句