企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

C#爬虫之旅:异步编程之美!我如何成为网络探险家?

wudianyun 2025-04-30 20:19:24 精选文章 13 ℃

那是一个风和日丽的周一,老板走到我桌前,神秘兮兮地说:“我们需要一个爬虫程序,你来搞个爬虫吧!你能不能用C#写一个爬虫程序?

“C#爬虫?”我瞪大了眼睛,“老板,你确定不是开玩笑?这好像不合规定的”。

老板一听,笑了:“别害怕!是我们自己的网站有的内容需要定时保存下来,一页页的保存太麻烦了,有没有办法自动保留有用的信息?你行吗?”

“那我试试吧!”,嘴上这么说,心里却想:“这不是小菜一碟吗?这是我大展身手的时候了,哈哈!”

下面我来讲一下我怎么实现的,内容太多,我分几次分别讲解,今天先讲如何获取页面代码的,后面再讲如何处理页面内容的。

首先我们要用到的核心是:HttpClient类
HttpClient 是 .NET Framework 和 .NET Core 中的一个类,位于 System.Net.Http 命名空间下。
它提供了一种简单且强大的方式来发送 HTTP 请求和接收 HTTP 响应,
支持 GET、POST、PUT、DELETE 等多种 HTTP 方法,
并能处理 JSON、XML 及其他内容类型的数据。

由于头条写文章限制各种字符,我只好把有的介绍放到代码块中了。

编写代码创建实例:

编写代码创建了一个静态的 HttpClient 实例:
static readonly HttpClient client = new HttpClient();//它使用了底层的网络连接
//readonly关键字确保这个实例在创建后不会被修改
//static关键字使得这个实例在类的所有方法中都是可用的。

第二个重要代码是:

static async Task<string> GetFileContentAsync(string url)
    {
        HttpResponseMessage response = await client.GetAsync(url);
        string content = await response.Content.ReadAsStringAsync();
        return content;
    }
//static async Task<string> GetFileContentAsync(string url) 是一个异步方法,用于下载文件内容。
//它使用HttpClient的GetAsync方法发起GET请求,然后使用ReadAsStringAsync方法异步地读取
//响应内容,并返回这个内容。

最后调用代码就可以了:

        try
        {
            string fileContent = await GetFileContentAsync(url);
            Console.WriteLine(fileContent);
        }
        catch (HttpRequestException)
        {
            Console.WriteLine("无法下载文件,请检查网络连接或URL是否正确。");
        }
        catch (Exception ex)
        {
            Console.WriteLine(#34;发生错误: {ex.Message}");
        }
//try 和 catch 块用于异常处理。如果下载过程中出现HttpRequestException(通常是网络问题),
//则会捕获这个异常并提示用户检查网络连接或URL。
//如果出现其他类型的异常,也会被捕获并显示错误信息。

实现效果:


//由于 HttpClient 的方法是异步的(async),我们使用 await 关键字来等待操作完成,而不是阻塞线程。
//这种异步编程模式在 .NET 中非常普遍,特别是在与 I/O 相关的操作中,如网络请求。
//HttpClient 还支持其他类型的 HTTP 请求,如 POST、PUT、DELETE 等,
//通过调用相应的方法(如 PostAsync、PutAsync、DeleteAsync)
//并传递必要的请求内容(如 JSON、表单数据等)即可。


这个代码优点明显:

异步处理:使得程序能够非阻塞地执行网络请求。这提高了应用程序的响应性和性能。

资源复用:创建一个静态的实例,在整个应用程序生命周期内共享使用。

异常处理:对可能出现的错误进行了适当的捕获和处理。

简洁易读:代码结构清晰,逻辑简单明了,易于理解和维护。

模块化设计:将获取网页内容的任务封装在独立的 方法中利于代码重用和逻辑组织。

需要完整代码的请关注留言。欢迎和我交流提出更好的建议。

Tags:

最近发表
标签列表