asp.net 利用HttpWebRequest自动获取网页编码并获取网页源代码

     /// <summary>
    /// 获取源代码
    /// </summary>
    /// <param name="url"></param>
    /// <returns></returns>
    public static string GetHtml(string url, Encoding encoding)
    {
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        StreamReader reader = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(url);
            request.Timeout = 20000;
            request.AllowAutoRedirect = false;

            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
            {
                if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                    reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress), encoding);
                else
                    reader = new StreamReader(response.GetResponseStream(), encoding);
                string html = reader.ReadToEnd();

                return html;
            }
        }
        catch
        {
        }
        finally
        {

            if (response != null)
            {
                response.Close();
                response = null;
            }
            if (reader != null)
                reader.Close();

            if (request != null)
                request = null;

        }

        return string.Empty;
    }
    public static string GetEncoding(string url)
    {
        HttpWebRequest request = null;
        HttpWebResponse response = null;
        StreamReader reader = null;
        try
        {
            request = (HttpWebRequest)WebRequest.Create(url);
            request.Timeout = 20000;
            request.AllowAutoRedirect = false;

            response = (HttpWebResponse)request.GetResponse();
            if (response.StatusCode == HttpStatusCode.OK && response.ContentLength < 1024 * 1024)
            {
                if (response.ContentEncoding != null && response.ContentEncoding.Equals("gzip", StringComparison.InvariantCultureIgnoreCase))
                    reader = new StreamReader(new GZipStream(response.GetResponseStream(), CompressionMode.Decompress));
                else
                    reader = new StreamReader(response.GetResponseStream(), Encoding.ASCII);

                string html = reader.ReadToEnd();

                Regex reg_charset = new Regex(@"charset\b\s*=\s*(?<charset>[^""]*)");
                if (reg_charset.IsMatch(html))
                {
                    return reg_charset.Match(html).Groups["charset"].Value;
                }
                else if (response.CharacterSet != string.Empty)
                {
                    return response.CharacterSet;
                }
                else
                    return Encoding.Default.BodyName;
            }
        }
        catch
        {
        }
        finally
        {

            if (response != null)
            {
                response.Close();
                response = null;
            }
            if (reader != null)
                reader.Close();

            if (request != null)
                request = null;

        }
    }
 using System;
 using System.Net;
 using System.Text;
 using System.Text.RegularExpressions; 

 class Program
 {
   // 获取网页的HTML内容,根据网页的charset自动判断Encoding
   static string GetHtml(string url)
   {
     return GetHtml(url, null);
   } 

   // 获取网页的HTML内容,指定Encoding
   static string GetHtml(string url, Encoding encoding)
   {
     byte[] buf = new WebClient().DownloadData(url);
     if (encoding != null) return encoding.GetString(buf);
     string html = Encoding.UTF8.GetString(buf);
     encoding = GetEncoding(html);
     if (encoding == null || encoding == Encoding.UTF8) return html;
     return encoding.GetString(buf);
   } 

   // 根据网页的HTML内容提取网页的Encoding
   static Encoding GetEncoding(string html)
   {
     string pattern = @"(?i)\bcharset=(? <charset>[-a-zA-Z_0-9]+)";
     string charset = Regex.Match(html, pattern).Groups["charset"].Value;
     try { return Encoding.GetEncoding(charset); }
     catch (ArgumentException) { return null; }
   } 

   // 根据网页的HTML内容提取网页的Title
   static string GetTitle(string html)
   {
     string pattern = @"(?si) <title(?:\s+(?:""[^""]*""|‘[^‘]*‘|[^""‘>])*)?>(? <title>.*?) </title>";
     return Regex.Match(html, pattern).Groups["title"].Value.Trim();
   } 

   // 打印网页的Encoding和Title
   static void PrintEncodingAndTitle(string url)
   {
     string html = GetHtml(url);
     Console.WriteLine("[{0}] [{1}]", GetEncoding(html), GetTitle(html));
   } 

   // 程序入口
   static void Main()
   {
     PrintEncodingAndTitle("http://www.msdn.net/");
     PrintEncodingAndTitle("http://www.cnblogs.com/");
     PrintEncodingAndTitle("http://www.cnblogs.com/skyiv/");
     PrintEncodingAndTitle("http://www.csdn.net/");
     PrintEncodingAndTitle("http://news.163.com/");
   }
 }
 /* 程序输出:
 [] [MSDN: Microsoft Developer Network]
 [System.Text.UTF8Encoding] [博客园 - 程序员的网上家园]
 [System.Text.UTF8Encoding] [空间/IV - 博客园]
 [System.Text.UTF8Encoding] [CSDN.NET - 中国最大的IT技术社区,为IT专业技术人员提供最全面的信息传播和服务平台]
 [System.Text.DBCSCodePageEncoding] [新闻中心_网易新闻]
 */
时间: 2024-10-05 23:13:41

asp.net 利用HttpWebRequest自动获取网页编码并获取网页源代码的相关文章

Asp.Net利用HttpWebRequest发送复杂的HTTP GET请求并且取回响应

最近在学习微信公众平台的开发用到 使用接口创建自定义菜单后,开发者还可使用接口查询自定义菜单的结构. 请求说明 http请求方式:GET https://api.weixin.qq.com/cgi-bin/menu/get?access_token=ACCESS_TOKEN 得到响应后的菜单(如下代码) 1 string uri = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token="+AccessToken.IsExis

利用HttpWebRequest和HttpWebResponse获取Cookie

之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java. C#没有JSoup这样方便的东西,我也没有仔细去找,因为只要利用正则表达式,同样可以很好的解析网页内容而不需要其他帮助.现在做前端的程序员,如果正则表达式不熟悉,反而去依赖第三方的话,感觉很可惜! 这是我们学校图书馆的登录界面的body: <body onload="bodyload()"> <for

利用HttpWebRequest和HttpWebResponse获取Cookie并实现模拟登录

之前看过某个同学的一篇有关与使用JSoup解析学校图书馆的文章,仔细一看,发现竟然是同校!!既然对方用的是java,那么我也就来个C#好了,虽然我的入门语言是java. C#没有JSoup这样方便的东西,我也没有仔细去找,因为只要利用正则表达式,同样可以很好的解析网页内容而不需要其他帮助.现在做前端的程序员,如果正则表达式不熟悉,反而去依赖第三方的话,感觉很可惜! 这是我们学校图书馆的登录界面的body: <body onload="bodyload()"> <for

微信网页授权认证获取用户的详细信息,实现自动登陆-微信公众号开发干货

原创声明:本文为本人原创作品,绝非他处转账,转载请联系博主 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开发公众号需要准备或了解什么 web开发工具:官方提供的开发工具,使用自己的微信号来调试微信网页授权.调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入和输出.下载地址:web开发工具下载 开发文档:https://mp.weixin.qq.com/wiki

微信公众号开发之网页授权认证获取用户的详细信息,实现自动登陆

原创声明:本文转来源本人另一博客[http://blog.csdn.net/liaohaojian/article/details/70175835]绝非他人处转载 从接触公众号到现在,开发维护了2个公众号,开发过程中遇到很多问题,现在把部分模块功能在这备案一下,做个总结也希望能给其他人帮助 工欲善其事,必先利其器,先看看开发公众号需要准备或了解什么 web开发工具:官方提供的开发工具,使用自己的微信号来调试微信网页授权.调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入

利用Powershell自动部署asp.net mvc网站项目 (一)

这一篇中我们会写一些关于自动化部署的代码.我们会使用 Powershell 书写这类代码. 你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性.这是因为部署从来都是跟环境打交道,部署过程中协作的组建太多,相互之间的交集不可能太大.可能唯一能够通用的是自动化部署的基本原则(只是这篇文章的基本原则): 每一次自动化部署结束之后,应用程序都会有相同的初始状态. 自动化部署的机器非常干净,只有相应的 Windows Server 系统和 .NET Framework.尤其是,不

利用HttpWebRequest抓取网页数据

根据运单号来获取运单状态 以EMS快递为例: 第一步首先分析要抓取网站的入口及参数 http://www.ems.com.cn 第二部利用httpwebRequest 模拟浏览器请求来获取网页内容 上图可以看到 获取验证码请求 http://www.ems.com.cn/ems/rand 查询 可以看到 发送的 post请求 http://www.ems.com.cn/ems/order/singleQuery_t public void getcode() { string code = "&

减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术)

原文:减少HTTP请求之将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片(大型网站优化技术) 在网站开发过程中,对于页面的加载效率一般都想尽办法求快.那么,怎么让才能更快呢?减少页面请求 是一个优化页面加载速度很好的方法.上一篇博文我们讲解了 “利用将小图标合成一张背景图来减少HTTP请求”,那么,这一篇博文将讲解  “ 将图片转成二进制并生成Base64编码,可以在网页中通过url查看图片”. 一.为何选择将图片转成二进制并生成Base64编码,可以在网页中通过url查看

Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina等网页的小demo,如果对swift的语法不感兴趣的同学可以直接跳到第二部分来感受下Swift的魅力-(本文的demo源码已上传至github:https://github.com/iOSGeek0829/XSurfing) 一.Swift常用语法 Swift是Apple去年推出的一门新的语言,基于C和Objective-C,而没有C的一些兼容约束,它采用了安全的编程模式和添加现代的功能