下载网页并保存

一直以来,都没有什么下载网页的概念,我请求一个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
        }

以上,未完待续。。。

原文地址:https://www.cnblogs.com/lihan829/p/5252377.html