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

智能推荐

Log4j2配置自动清除指定日期前的日志-程序员宅基地

文章浏览阅读2.4k次。关注其中的DefaultRolloverStrategy配置内容,按照此配置会自动清除Delete元素中指定basePath下超出30天的info-*.log.gz配置文件。由于是指定目录,指定文件名格式,指定日期范围,所以是可以清除非工程目录下的文件,所以一定不要配置错了。当按照日期归档日志的时候,由于日志会一直存在,导致磁盘空间占用,如果服务器磁盘空间不足,且日志又没有长期保留的必要,可以直接在log4j2.xml中增加配置实现自动清理历史日志。

python中insert函数怎么用_python insert_Python列表| 带示例的insert()方法-程序员宅基地

文章浏览阅读4.3k次。python insertlist.insert()方法 (list.insert() Method)insert() is an inbuilt method in python, which is used to add an element /item at specified index to the list.insert()是python中的内置方法,用于将指定索引处的元素/ item..._python inserted

QT中GraphicsView编程_qgraphicsscene-程序员宅基地

文章浏览阅读1.4k次,点赞2次,收藏19次。QGraphicsItem是图元的基类。自定义图元,首先应该继承QGraphicsItem,然后重写他的两个纯虚公共函数boundingRect()和paint(),boundingRect()函数返回绘制图元大概的区域,paint()函数用来绘制图元内容。_qgraphicsscene

Building a phoneME Feature Software Reference Port (MR4)_hm(16.9)的reference software manual(参考软件手册)-程序员宅基地

文章浏览阅读2.3k次。Building a phoneME Feature Software Reference Port (MR4)The phoneME Feature Software is the Open Source version of Sun Microsystems commercial implementation, the Sun Java Wireless Client software._hm(16.9)的reference software manual(参考软件手册)

SQLALCHEMY的简单使用_sqlalchemy别名分组查询-程序员宅基地

文章浏览阅读764次。SQLAlchemy声明写这篇文章的目的只是为了自己在遇到问题时方便查找,文中会有SqlAlchemy官方文档中的内容。sqlalchemy是一个对象关系映射器, 提供了一种将用户定义的Python类与数据库表以及这些类(对象)的实例与相应表中的行关联起来的方法。ORM即Object - Relation - Mapping创建连接使用SQLAlchemy的第一步是创建一个数据库连接,这里使用的是mysql数据库from sqlalchemy import create_engineeng_sqlalchemy别名分组查询

Dell戴尔G7 7588换m.2 nvme固态硬盘+系统迁移_戴尔g7 7588是否支持nvme-程序员宅基地

文章浏览阅读2.2w次,点赞24次,收藏75次。先科普一下SATA是一种时下非常流行的串行硬盘接口规范, 是这个样子的PCIe是一种高速串行计算机扩展总线标准, 几乎任何扩展都可以通过PCIe连接, 比如显卡网卡硬盘磁盘阵列卡, 是这个样子的m.2接口是一种新的主机接口方案,可以兼容多种通信协议,如sata、PCIe、USB、HSIC、UART、SMBus等, 大概长这样nvme是一种用于PCIe的附加存储的接口和指令集标准, 数..._戴尔g7 7588是否支持nvme

随便推点

怎么能跳过苹果服务器降级系统,iPhone手机可以降级任意系统版本?大神有话说...-程序员宅基地

文章浏览阅读9k次。原标题:iPhone手机可以降级任意系统版本?大神有话说说到iPhone手机降级这话题,我相信每位果粉都是很激动的,为什么激动呢?因为iPhone5以上手机只要系统验证关闭了你已升级,意味着就永久不能返回之前系统版本了。最近比较火的降级大神发话了,该大神简称:“tihmstar”宣布了一款新的工具为:Prometheus ,并且声明该工具支持苹果手机64位,可降级到任意固件。 如果真的能降级到任意..._怎么绕过shsh刷机

Using WebDAV with IIS -- http://www.windowsnetworking.com/ - Easy Company 的 .Net 开发博客 - 博客园-程序员宅基地

文章浏览阅读1.9k次。导读: Using WebDAV with IIS This article walks you through the process of using Web-based Distributed Authoring and Versioning (WebDAV) to publish content to an Internet Information Services (II

opencv中角点排序_opencv 棋盘格角点排序-程序员宅基地

文章浏览阅读6k次。// 角点检测.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #include using namespace std;using namespace cv;#include #define max_corners 100 //初始定义角点个数typedef struct Corn_opencv 棋盘格角点排序

ActiveX 控件测试容器 (tstcon32.exe)_微软ocx控件容器 tstcon.exe的官方介绍-程序员宅基地

文章浏览阅读1.3k次。从 IDE 运行 tstcon32.exe在“工具”菜单上单击“ActiveX 控件测试容器”。随即出现“ActiveX 控件测试容器”工具。_微软ocx控件容器 tstcon.exe的官方介绍

web前端入门到实战:仿美团详情页与购物车源码-首页实现_商家列表 h5-程序员宅基地

文章浏览阅读1.3k次,点赞3次,收藏21次。效果图首先是index.html<!DOCTYPE html><html><head> <title>首页</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-..._商家列表 h5

PASCAL Visual Object Classes Challenge 2007(VOC 2007)数据集预处理_voc2007 trainval 提取图片-程序员宅基地

文章浏览阅读1.4k次。VOC 2007[1] 是一个多标签数据集,有 20 类。这里为 multi-label classification 任务做预处理,包括:将图片移到同一个目录(方便读取);数据划分(本身就已经分好 train/val 和 test 两部分);处理标签。Prepare[1] 有下载链,train/val 450M,test 430M。下下来就是 VOCtrainval_06-Nov-2007.tar 和 VOCtest_06-Nov-2007.tar 两个文件。以 test set 的文件为例_voc2007 trainval 提取图片