C#语言练手小功能

抓取网页上公开可见的图片。涉及知识点:

  1. 异步编程:async和await进行异步编程,将耗时的操作放在后台线程中进行,并使用await关键字等待操作完成,不阻塞主线程的执行。
  2. HttpClient:用来发送http请求,并获取响应。可以使用GetAsync发送Get请求,并使用ReadAsStringAsync方法将响应内容读取为字符串。
  3. HttpResponseMessage:http响应的消息,其中包含响应的状态码、头信息、内容等。使用IsSuccessStatusCode判断响应是否成功。
  4. HtmlAgilityPack库:用来解析HTML文档,使用LoadHtml方法从字符串中加载html内容,并创建HtmlDocument对象。使用Descendants方法获取指定标签元素。
  5. Linq查询:获取img元素进行筛选和转换,使用Select获取每个img元素的src属性值,并使用Where进行过滤。
  6. 图片下载:使用HttpClient.GetAsync方法下载图片,并使用ReadAsStreamAsync方法将下载的图片内容作为流进行处理。使用Path类获取图片文件名和指定保存路径,使用FileStream类创建文件流将图片保存到本地。
  7. 异常处理:try-catch
cs 复制代码
using 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);
            }
        }
相关推荐
XiaoLeisj15 分钟前
Android Kotlin 全链路系统化指南:从基础语法、类型系统与面向对象,到函数式编程、集合操作、协程并发与 Flow 响应式数据流实战
android·开发语言·kotlin·协程
dapeng28701 小时前
分布式系统容错设计
开发语言·c++·算法
qq_417695051 小时前
代码热修复技术
开发语言·c++·算法
badhope6 小时前
Mobile-Skills:移动端技能可视化的创新实践
开发语言·人工智能·git·智能手机·github
码云数智-园园7 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡
开发语言
C++ 老炮儿的技术栈8 小时前
volatile使用场景
linux·服务器·c语言·开发语言·c++
hz_zhangrl8 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析
开发语言·c++·gesp·gesp2026年3月·gespc++一级
Liu628888 小时前
C++中的工厂模式高级应用
开发语言·c++·算法
IT猿手8 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码
开发语言·matlab·无人机·openclaw·多无人机动态避障路径规划·无人机编队
AI科技星8 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证
c语言·开发语言·人工智能·opencv·算法·机器学习·数据挖掘