下载网页并保存
一直以来,都没有什么下载网页的概念,我请求一个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 }
以上,未完待续。。。