文档章节

C#使用webclient获取搜房html内容的乱码问题

可达鸭眉头一皱
 可达鸭眉头一皱
发布于 2018/07/26 10:43
字数 676
阅读 11
收藏 0

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

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

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

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

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

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

        XWebClient web = new XWebClient();
        byte[] pageData = web.DownloadData(url);
        string pageHtml = Encoding.Default.GetString(pageData);  //如果获取网站页面采用的是GB2312,则使用这句     

 

© 著作权归作者所有

共有 人打赏支持
可达鸭眉头一皱
粉丝 3
博文 75
码字总数 33248
作品 0
广州
私信 提问
ASP.NET抓取其他网页代码

在.Net 平台下,创建一个ASP.Net的程序 1、引用两个NAMESPACE using System.Text //因为用了Encoding类 using System.Net //因为用了WebClient 类 2、整个程序用了三个控件 txtUrl //输入你要...

晨曦之光
2012/03/09
214
0
一个c#的与web服务器交互的HttpClient类

.Net类库里提供了HttpWebRequest等类,方便我们编程与Web服务器进行交互. 但是实际使用中我们经常会遇到以下需求, 基础类里没有直接提供相应的功能 (WebClient类包含这些功能,只是用起来稍微麻...

鉴客
2011/12/16
3.1K
1
HttpClient, 使用C#操作Web

我们知道, .Net类库里提供了HttpWebRequest等类,方便我们编程与Web服务器进行交互. 但是实际使用中我们经常会遇到以下需求, 基础类里没有直接提供相应的功能 ( WebClient类包含这些功能,只是...

鉴客
2011/12/16
980
0
c# HtmlAgilityPack类 采集问题

我想提取 下图 红色框的 信息 可是从浏览器 复制 xpath 的 代码 采集不到这个信息 显示为null 为什么啊? 这种方法有些简单的网页可以采集到的,但是采集这种页面就采集不到 HtmlAgilityPac...

扣扣群发软件
2017/02/28
100
0
闭包客/Less.Html

一个犀利的 HTML 解析器 —— Less.Html 我写了这个解析器之后才知道,原来 C# 写的 html 解析器有很多。但是因为我没有参照别人的做法,Less.Html 有一个特点,就是它的用法是最接近 jQuery...

闭包客
2017/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

CSS,JavaScript实现手风琴导航菜单

<!DOCTYPE html><html><head> <title>Side Navigator Demo</title> <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"> </script> <link re......

yuewawa
22分钟前
1
0
mysql 系统设置SQL

打开、关闭日志 SET GLOBAL general_log = 'Off'; SET GLOBAL general_log = 'On'; 查看日志是否打开 show variables like '%general%';...

jingshishengxu
今天
2
0
转行学大数据,如何选择如何学习大数据开发?

大数据火了几年了,但是今年好像进入了全民大数据时代,本着对科学的钻(zhun)研(bei)精(tiao)神(cao),我在17年年初开始自学大数据,后经过系统全面学习,于这个月跳槽到现任公司。 现在已经...

董黎明
今天
4
0
RadosClient OSDC

RadosClient.h class librados::RadosClient : public Dispatcher//继承自Dispatcher(消息分发类){public: using Dispatcher::cct; md_config_t *conf;//配置文件private: ......

banwh
今天
3
0
如果让你写一个消息队列,该如何进行架构设计?

面试题 如果让你写一个消息队列,该如何进行架构设计?说一下你的思路。 面试官心理分析 其实聊到这个问题,一般面试官要考察两块: 你有没有对某一个消息队列做过较为深入的原理的了解,或者...

李红欧巴
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部