抓取网页上公开可见的图片。涉及知识点:
- 异步编程:async和await进行异步编程,将耗时的操作放在后台线程中进行,并使用await关键字等待操作完成,不阻塞主线程的执行。
- HttpClient:用来发送http请求,并获取响应。可以使用GetAsync发送Get请求,并使用ReadAsStringAsync方法将响应内容读取为字符串。
- HttpResponseMessage:http响应的消息,其中包含响应的状态码、头信息、内容等。使用IsSuccessStatusCode判断响应是否成功。
- HtmlAgilityPack库:用来解析HTML文档,使用LoadHtml方法从字符串中加载html内容,并创建HtmlDocument对象。使用Descendants方法获取指定标签元素。
- Linq查询:获取img元素进行筛选和转换,使用Select获取每个img元素的src属性值,并使用Where进行过滤。
- 图片下载:使用HttpClient.GetAsync方法下载图片,并使用ReadAsStreamAsync方法将下载的图片内容作为流进行处理。使用Path类获取图片文件名和指定保存路径,使用FileStream类创建文件流将图片保存到本地。
- 异常处理:try-catch
csusing HtmlAgilityPack; public async void GetImagesFromWeb(string ip,string webPage)//ip,webPage:html网页 { string webUrl = ip+webPage; //抓取图片的网页url string saveDir = "E:\\File_work\\files\\ResultSaveDir\\ImagesFromWeb"; HttpClient httpClient = new HttpClient(); try { //向指定url发送HttpGet请求,并返回一个表示http响应的httpResponseMessage对象 HttpResponseMessage response =await httpClient.GetAsync(webUrl); //HttpResponseMessage包含了响应的状态码、头信息、内容等 if (response.IsSuccessStatusCode) //状态码为200-299,,则IsSuccessStatusCode属性为true { string htmlContent=await response.Content.ReadAsStringAsync();//将http响应的内容作为字符串读取 //使用HtmlAgilityPack解析html文档 HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(htmlContent);//从字符串中加载html内容,并创建HtmlDocument对象 //获取img元素中的src属性,html中的img元素用于向网页中插入图像,src属性制定了要显示的图片文件的url var imageUrls = doc.DocumentNode.Descendants("img") //从根节点开始获取所有的img标签 .Select(img => img.GetAttributeValue("src", null))//获取每个img的src属性值 .Where(src => !string.IsNullOrEmpty(src)); foreach(var imgUrl in imageUrls) { try { HttpResponseMessage imgResponse=await httpClient.GetAsync(ip+imgUrl); if (imgResponse.IsSuccessStatusCode) { Stream imgStream=await imgResponse.Content.ReadAsStreamAsync(); //获取图片文件名 string imgName = Path.GetFileName(imgUrl); //指定保存路径 string savePath = Path.Combine(saveDir, imgName); FileStream fileStream = new FileStream(savePath,FileMode.Create); await imgStream.CopyToAsync(fileStream); } else { Console.WriteLine($"图片下载失败: {imgUrl}. 状态码: {imgResponse.StatusCode}"); } } catch(Exception ex) { Console.WriteLine($"图片下载出错: {imgUrl}: {ex.Message}"); } } Console.WriteLine($"{imageUrls.Count()} 图片下载成功."); } else { Console.WriteLine($"页面请求失败. 错误码: {response.StatusCode}"); } } catch(Exception ex) { Console.WriteLine(ex.Message); } }
C#语言练手小功能
赵 XiaoQin2024-01-11 17:27
相关推荐
iCxhust44 分钟前
Prj10--8088单板机C语言8259测试(1)枫叶kx1 小时前
1Panel运行的.net程序无法读取系统字体(因为使用了docker)крон4 小时前
【Auto.js例程】华为备忘录导出到其他手机zh_xuan4 小时前
c++ 单例模式老胖闲聊5 小时前
Python Copilot【代码辅助工具】 简介Blossom.1185 小时前
使用Python和Scikit-Learn实现机器学习模型调优曹勖之5 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新豆沙沙包?6 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版军训猫猫头6 小时前
96.如何使用C#实现串口发送? C#例子liuyang-neu6 小时前
java内存模型JMM