• 下载网页并保存


    一直以来,都没有什么下载网页的概念,我请求一个URL地址,浏览器给我显现一个页面啊,怎么就关下载什么事了呢?

    其实不是不懂,是没有细想,因为这好像天经地义的事,你会经常纠结为什么饿了要吃饭,太阳为什么从东边升起么?

    事实上,浏览器输入一个URL地址,浏览器是先把这个页面下载下来了,再进行的渲染,一般人都知道的吧。这里别的不多说,记录几个下载网页的方法。

    1、使用WebClient下载

    /// <summary>
    /// 下载一个简单的网页然后通过浏览器打开
    /// </summary>
    private static void WebClientTest()
    {
          WebClient client = new WebClient();
          //WebClient可多次使用?
          client.Proxy = null;//可设置代理
          client.DownloadFile("http://www.cnblogs.com/lihan829/p/5222537.html", "nginx.html");
          client.DownloadFile("http://www.cnblogs.com/lihan829/p/5248952.html", "log4net.html");
          Process.Start("nginx.html");//启动本地浏览器访问刚刚下载的页面这个受教了
    }

    2、使用WebClient异步下载

    /// <summary>
    /// 异步下载,可在控制台打印进度,下载网页与下载资源都叫下载,难道不是吗?
    /// </summary>
    public async static void WebClientAsyncTest()
    {
          var client = new WebClient();
          client.Proxy = null;//可设置代理
          client.DownloadProgressChanged += (sender, args) =>
          Console.WriteLine(args.ProgressPercentage + "% complete");
          //await Task.Delay(5000).ContinueWith(ant => client.CancelAsync());//下载过程超过5秒则取消下载,取消下载时会抛出WebException异常并说当前请求已取消
          await client.DownloadFileTaskAsync("http://www.cnblogs.com/lihan829/p/5248952.html", "log4net.exe");
    }

    3、使用WebRequest

    private static void WebRequestTest()
    {
         WebRequest req = WebRequest.Create("http://www.linqpad.net");
         //一个WebRequest对象只能使用一次
         req.Proxy = null;//可设置代理
         using (var res = req.GetResponse())
         using (Stream rs = res.GetResponseStream())
         using (FileStream fs = File.Create("linqpad.html"))
             rs.CopyTo(fs);
    }

    4、使用

            /// <summary>
            /// 使用HttpClient获取网页源码字符串
            /// </summary>
            public async static void HttpClientTest()
            {
                var client = new HttpClient();
    
                #region 也能使用代理,如
                //var handler = new HttpClientHandler { UseProxy = true };
                //handler.Proxy = XXX;
                //var client = new HttpClient(handler); 
                #endregion
    
                #region 直接读取响应中的字符串
                var task1 = client.GetStringAsync("http://www.cnblogs.com/lihan829/p/5248952.html");
                var task2 = client.GetStringAsync("http://www.cnblogs.com/lihan829/p/5222537.htm");
                Console.WriteLine(await task1);
                Console.WriteLine(await task2);
                #endregion
    
                #region 使用GetAsync方法读取
                HttpResponseMessage response = await client.GetAsync("http://www.cnblogs.com/lihan829/p/5248952.html");
                response.EnsureSuccessStatusCode();
    
                #region 读取响应中的字符串
                string result = await response.Content.ReadAsStringAsync();
                Console.WriteLine(result);
    
                #region 读取响应中的流并保存成html文件
                var stream = await response.Content.ReadAsStreamAsync();
                using (FileStream fs = File.Create("ReadAsStreamAsync.html"))
                    stream.CopyTo(fs); 
                #endregion
                #endregion
                #endregion
            }

    以上,未完待续。。。

  • 相关阅读:
    《吊打面试官》系列-缓存雪崩、击穿、穿透
    WebGL学习之纹理贴图
    小试小程序云开发
    关于socket.io的使用
    动画函数的绘制及自定义动画函数
    canvas实现俄罗斯方块
    Redis集群
    手工搭建基于ABP的框架
    手工搭建基于ABP的框架(3)
    手工搭建基于ABP的框架(2)
  • 原文地址:https://www.cnblogs.com/lihan829/p/5252377.html
Copyright © 2020-2023  润新知