注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

^_^ china.ygw的博客

软件开发/c/c++/数据库/开源/linux/windows/安全/网络...

 
 
 

日志

 
 
 
 

C#使用webclient获取搜狐网页内容的乱码问题  

2014-01-13 23:05:49|  分类: c# |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

        这几天使用c#的webclient进行网站页面内容的获取,但是在获取搜狐网页内容时,总是乱码。开始以为是编码的问题,但是不管使用gb2312、gbk、utf8,最终的结果都是乱码,代码如下:
                        WebClient wc = new WebClient();
                        byte[] btWeb = wc.DownloadData(strUrl);
                        string strWeb = System.Text.Encoding.GetEncoding("GBK").GetString(btWeb);
        最后通过google发现是因为搜狐网站页面进行了压缩导致,为便于学习与保存,以下内容摘抄自扩展WebClient支持gzip,deflate压缩页面的自解压,解决乱码问题页面内容:

       为了加快页面的下载速度,提升WEB服务器的性能,现在的很多网站,都开启了页面的压缩输出功能,常用的 gzip 和 deflate 。 

        在 .NET 平台上,做网页采集,常用的方式是使用 HttpWebRequest 和 WebClient。

        HttpWebRequest 是对 WebRequest 的http协议的实现。而WebClient是对HttpWebRequest的一个轻量级的封装。

        HttpWebRequest 功能完备,强大,但是使用较繁琐,相比之下,WebClient 就简单易用多了,但是,这个简单也是必定有代价的,那就是精简了很多HttpWebRequest具备的功能,例如:WebClient对Cookie的支持就被砍掉了。本文作者δCat http://rtmd.net

        从 .NET 2.0 开始,WebRequest就具备了对压缩网页自解压的功能。实现的代码,大致如下:  

        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,完成获取网页内容的工作

  评论这张
 
阅读(1214)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018