用C#写代码去获取网页内容。
其中request的header中,设置Accept-Encoding为gzip,deflate:
req = (HttpWebRequest)WebRequest.Create(gSkydriveUrl);
req.Headers.Add("Accept-Encoding", "gzip,deflate");
结果始终返回是乱码:
其中,此处之所以加此header,是因为看到网页分析工具中所得到的浏览器浏览该网页,对应的http的header的内容中,就是这样设置的。
所以,代码中,也是模拟浏览器去访问网页,就设置了对应的Accept-Encoding为gzip,deflate了。
【解决过程】
1.刚开始以为是编码的问题,所以去尝试了不同的编码:
req.Headers["Accept-Charset"] = "GBK,utf-8;q=0.7,*;q=0.3";
req.Headers["Accept-Charset"] = "utf-8";
结果始终无法解决问题。
2.后来无意间,把Accept-Encoding取消了,没有设置为gzip,deflate:
//req.Headers.Add("Accept-Encoding", "gzip,deflate");
结果,获得的网页,就正常了。
3.后来网上找到了具体的解释,那就是,
普通浏览器访问网页,之所以添加:
"Accept-Encoding" = "gzip,deflate"
那是因为,浏览器对于从服务器中返回的对应的gzip压缩的网页,会自动解压缩,所以,其request的时候,添加对应的头,表明自己接受压缩后的数据。
而此代码中,如果也添加此头信息,结果就是,返回的压缩后的数据,没有解码,而将压缩后的数据当做普通的html文本来处理,当前显示出来的内容,是乱码了。
【后记 2012-02-14】
后来调试过程中,突然发现,原来对于HttpWebRequest的参数设置中,还有一个选项是AutomaticDecompression,对于新创建的HttpWebRequest:
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); |
其默认值是None,然后去试了试,该设置为Gzip,然后同时Accept-Encoding为对应的gzip:
req.Headers["Accept-Encoding"] = "gzip,deflate"; req.AutomaticDecompression = DecompressionMethods.GZip; |
结果证明,这样也是可以获得对应的格式正确的数据,而不是乱码的。
这就意味着,如果你获取网页内容太大的话,那么还是可以用这个办法的,这样就可以让HttpWebRequest自动帮你实现对应的解压缩了,可以减少数据数据传输量,节省时间,提高效率。
需要注意的是,我这里的实测结果,如果是请求的网页返回的内容不多的话,比如只有几K,那么用了此自动解压缩的设置,也没啥效率的提高,因为毕竟自动解压,也是要花时间的。所以,就是个权衡问题了。自己以实测结果为准,觉得是否采用自动解压。
【总结】
想要获得正确网页内容,而非乱码的话,就有两种方式了:
1.不要设置Accept-Encoding的Header
//req.Headers.Add("Accept-Encoding", "gzip,deflate");
2.设置Accept-Encoding的Header,同时设置对应的自动解压缩的模式
req.Headers["Accept-Encoding"] = "gzip,deflate";
req.AutomaticDecompression = DecompressionMethods.GZip;
具体采用哪种方法,自己根据需要选择。