c#抓取网页内容,基本解决乱码问题;适配各类网页-程序员宅基地

技术标签: .net;c#;乱码;抓取网页;  babyjoycry  

private string GetHtmlCode(string url)
        {
            string htmlCode;
            HttpWebRequest webRequest = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(url);
            webRequest.Timeout = 30000;
            webRequest.Method = "GET";
            webRequest.UserAgent = "Mozilla/4.0";
            webRequest.Headers.Add("Accept-Encoding", "gzip, deflate");
            HttpWebResponse webResponse = (System.Net.HttpWebResponse)webRequest.GetResponse();
            if (webResponse.ContentEncoding.ToLower() == "gzip")//如果使用了GZip则先解压
            {
                using (System.IO.Stream streamReceive = webResponse.GetResponseStream())
                {
                    using (var zipStream =
                        new System.IO.Compression.GZipStream(streamReceive, System.IO.Compression.CompressionMode.Decompress))
                    {
                        Encoding enc = GetEncoding(url);
                        using (StreamReader sr = new System.IO.StreamReader(zipStream, enc))
                        {
                            htmlCode = sr.ReadToEnd();
                        }
                    }
                }
            }
            else
            {
                using (System.IO.Stream streamReceive = webResponse.GetResponseStream())
                {
                    Encoding enc = GetEncoding(url);
                    using (System.IO.StreamReader sr = new System.IO.StreamReader(streamReceive, enc))
                    {
                        htmlCode = sr.ReadToEnd();
                    }
                }
            }

            return htmlCode;
        }
        public Encoding GetEncoding(string strurl)
        {
            string urlToCrawl = strurl;
            //generate http request
            if (urlToCrawl != null && urlToCrawl != "")
            {
                HttpWebRequest req = (HttpWebRequest)WebRequest.Create(urlToCrawl);
                //use GET method to get url's html
                req.Method = "GET";
                req.Accept = "*/*";
                req.Headers.Add("Accept-Language", "zh-cn,en-us;q=0.5");
                req.ContentType = "text/xml";
                //use request to get response
                HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                Encoding enc;
                try
                {
                    if (resp.CharacterSet != "ISO-8859-1")
                        enc = Encoding.GetEncoding(resp.CharacterSet);
                    else
                        enc = Encoding.UTF8;
                }
                catch
                {
                    // *** Invalid encoding passed
                    enc = Encoding.UTF8;
                }
                string sHTML = string.Empty;
                using (StreamReader read = new StreamReader(resp.GetResponseStream(), enc))
                {
                    sHTML = read.ReadToEnd();
                    Match charSetMatch = Regex.Match(sHTML, "charset=(?<code>[a-zA-Z0-9\\-]+)", RegexOptions.IgnoreCase);
                    string sChartSet = charSetMatch.Groups["code"].Value;
                    //if it's not utf-8,we should redecode the html.
                    if (!string.IsNullOrEmpty(sChartSet) && !sChartSet.Equals("utf-8", StringComparison.OrdinalIgnoreCase))
                    {
                        enc = Encoding.GetEncoding(sChartSet);
                    }
                }
                return enc;
            }
            return Encoding.Default;
        }

 使用C#抓取网页时遇到乱码问题,找了各种办法都没有妥善解决的,发现存在gzip压缩的问题;于是乎,在参考CSDN上两位达人的帖子以后,我把代码进行了修正,基本妥善解决页面代码错误问题;欢迎大家使用上面的代码尝试;

 

以下为参考贴:

http://blog.csdn.net/wsc449/article/details/7280646

http://bbs.csdn.net/topics/320213776

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/babyjoycry/article/details/84756884

智能推荐

【云原生 | 01】docker容器引擎_docker cpuset.cpu_exclusive-程序员宅基地

文章浏览阅读6.4w次,点赞161次,收藏305次。容器技术显然不是什么新概念,最早的容器技术可以追溯到 1979 年诞生的 chroot 技术 ,容器技术又称为容器虚拟化,这是虚拟化技术中的一种 ,目前虚拟化技术主要有硬件虚拟化、半虚拟化和操作系统虚拟化等 。本系列文章讲述的容器虚拟化属于操作系统虚拟化,其相较于其他主流虚拟化技术更为轻量。............_docker cpuset.cpu_exclusive

《剑指offer》第7题:斐波那契数列_for 1071:菲波那契数 【题目描述1071:菲波那契数 【题目描述】 菲波那契数列是指-程序员宅基地

文章浏览阅读291次。斐波那契数列1 题目描述2 分析及题解2.1 方法一:递归2.2 方法二:递归2.3 方法三:循环迭代1 题目描述  大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=392 分析及题解2.1 方法一:递归之前写过一题是需要返回整个斐波那契数列的,所以此次递归借助一个初始化列表class Solution1: def __init__(self): self.fibList = [0, 1] #_for 1071:菲波那契数 【题目描述1071:菲波那契数 【题目描述】 菲波那契数列是指

Tex Live & TeXstudio安装及配置_texstudio下载-程序员宅基地

文章浏览阅读2.8w次,点赞8次,收藏42次。目录1 TeXlive下载2 TeXstudio下载3 TeXstudio配置3.1 命令设置3.2 测试生成pdf设置中文可以这样说,TeXlive是TeX的一个发行版,适用于Windows和Linux系统,给TeX的使用提供了工作环境,大概可以理解为Java的JDK?TeXstudio则优于TeXlive自带的TeXwork editor编辑器,大概可以理解为Java的各种编译器?1 TeXlive下载https://www.tug.org/texlive/也可以在镜像网站下载,更加快,挑一个_texstudio下载

前端开发:JS的解构_前端解构-程序员宅基地

文章浏览阅读2k次,点赞7次,收藏8次。在前端开发过程中,关于数据处理是一个非常重要的操作,尤其是遇到一些复杂的业务场景情况,涉及到数据的处理也是非常麻烦的事情。从后台拿到的数据源,处理成前端需要的格式或者形式,这就需要前端开发者做中转的一系列逻辑处理,甚至涉及到算法处理,所以不要单纯的觉得数据处理就是从后台拿数据然后展示渲染处理即可,其实远不止这些,尤其是在ES6之后,新增了一种从数组或者对象中获取指定元素的方式,也就是本篇博文所要介绍的内容:解构。..._前端解构

倒置函数reverse的用法_reverse ( char *s )在c语言中代表什么-程序员宅基地

文章浏览阅读3k次。倒置字符串函数reverse:用于倒置字符串s中的各个字符的位置,如原来字符串中如果初始值为123456,则通过reverse函数可将其倒置为654321,程序如下:#include#includevoid reverse(char s[]){ int c,j,i; for(i=0,j=strlen(s)-1;i

配置vue-router报错_error in setup: "error: [vue-router]: missing curr-程序员宅基地

文章浏览阅读95次。配置vue-router报错_error in setup: "error: [vue-router]: missing current instance. userouter()

随便推点

Android findViewById与findViewWithTag()-程序员宅基地

文章浏览阅读1.1k次。2019独角兽企业重金招聘Python工程师标准>>> ..._findviewwithtag

QT关于回调函数_qt 回调函数-程序员宅基地

文章浏览阅读5.5k次。.h文件#ifndef CALLBACK_H#define CALLBACK_Htypedef void (* Callback )( void *n_obj, void *user_data );//callbackstruct Timer{ void *user_data; void *user_obj; Callback n_cb;};cla_qt 回调函数

splice和slice的差别_splice改变原数组-程序员宅基地

文章浏览阅读502次。前端js基础:splice和slice的差别_splice改变原数组

实验6:6-5_write(str(i))-程序员宅基地

文章浏览阅读71次。f=open('sy6-5.txt','w')n=0for i in range(20): for j in range(0,2): n+=1 if n%5==0: f.write(str(i)+'\n') else: f.write(str(i)+' ')f.close()_write(str(i))

安装Anaconda_anaconda安装pytorch环境 environment location: c:\users-程序员宅基地

文章浏览阅读1.2k次。遗留问题:环境目录 Anaconda安装路径默认了,装在了C盘,环境目录也默认在了C:\Users\dell\.conda\envs配置库的时候,该环境占用空间接近1G,会对后续计算有什么影响?一、Anaconda安装时出现的问题和目前解决方式Anaconda自带Python 3.7.61.1 CMD中Warning,环境未激活暂时解决:CMD中输入 conda info --envs,enter,activate base就正常了但是,不影响Jupyter和Sp..._anaconda安装pytorch环境 environment location: c:\users\dell\.conda\envs\

HTML富文本编辑器wangEditor的使用_wangeditor html本地引用-程序员宅基地

文章浏览阅读4.6k次,点赞3次,收藏10次。HTML富文本编辑器wangEditor的使用官网http://www.wangeditor.com/用法官方文档已经讲得很清楚了,我这里只贴出代码,方便以后自己粘贴复制用用到的CSSwangEditor-fullscreen-plugin.css@CHARSET "UTF-8";.w-e-toolbar { flex-wrap: wrap; -webkit-box-lin..._wangeditor html本地引用

推荐文章

热门文章

相关标签