多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 在 C# 中读取网页 > 原文: [https://zetcode.com/csharp/readwebpage/](https://zetcode.com/csharp/readwebpage/) 在本文中,我们展示了如何在 C# 中抓取网页。 [C# 教程](http://zetcode.com/lang/csharp/)是有关 C# 语言的综合教程。 本教程显示了如何使用`HttpWebRequest`,`WebClient`,`HttpClient`,`Flurl.Http`和`RestSharp`读取页面。 在本教程的示例中,我们从一个小型网页 [webcode.me](http://www.webcode.me) 中读取了一个网页。 ## C# 使用`HttpClient`读取网页 `HttpClient`提供了一个基类,用于从 URI 标识的资源发送 HTTP 请求和接收 HTTP 响应。 `Program.cs` ```cs using System; using System.Net.Http; using System.Threading.Tasks; namespace DownloadPageHttpClient { class Program { static async Task Main(string[] args) { using var client = new HttpClient(); client.DefaultRequestHeaders.Add("User-Agent", "C# console program"); var content = await client.GetStringAsync("http://webcode.me"); Console.WriteLine(content); } } } ``` 该代码示例使用`HttpClient`异步抓取网页。 ```cs var content = await client.GetStringAsync("http://webcode.me"); ``` `await`运算符将`awaitable`作为参数; 检查是否已经完成等待; 如果等待已完成,则该方法继续运行。 `GetStringAsync()`将内容读取为字符串,作为异步操作。 ```cs $ dotnet run <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>My html page</title> </head> <body> <p> Today is a beautiful day. We go swimming and fishing. </p> <p> Hello there. How are you? </p> </body> </html> ``` 这是输出。 ## 用`WebClient`读取网页 `WebClient`提供了用于向 URI 标识的资源发送数据和从中接收数据的通用方法。 `Program.cs` ```cs using System; using System.Net; namespace DownloadPageWebClient { class Program { static void Main(string[] args) { using var client = new WebClient(); client.Headers.Add("User-Agent", "C# console program"); string url = "http://webcode.me"; string content = client.DownloadString(url); Console.WriteLine(content); } } } ``` 该代码示例使用`WebClient`获取网页。 ```cs string content = client.DownloadString(url); ``` `DownloadString()`方法检索指定的资源。 此方法在下载资源时阻塞。 在第二个示例中,我们为`WebClient`提供了一种非阻塞方法。 `Program.cs` ```cs using System; using System.Net; using System.Threading.Tasks; namespace DownloadPageWebClientAsync { class Program { static void Main(string[] args) { using var client = new WebClient(); client.DownloadStringCompleted += (sender, e) => { Console.WriteLine(e.Result); }; string url = "http://www.webcode.me"; client.DownloadStringAsync(new Uri(url)); Console.ReadLine(); } } } ``` 该代码示例使用`WebClient`获取网页的 HTML 代码。 这次操作是异步的。 ```cs client.DownloadStringCompleted += (sender, e) => { Console.WriteLine(e.Result); }; ``` `DownloadStringCompleted`事件在异步资源下载操作完成时发生。 ```cs client.DownloadStringAsync(new Uri(url)); ``` `DownloadStringAsync`方法下载指定为`String`或`Uri`的资源。 该方法不会阻塞调用线程。 ## C# 使用`HttpWebRequest`读取网页 `HttpWebRequest`类提供对属性和方法的支持,这些属性和方法使用户可以使用 HTTP 直接与服务器进行交互。 此 API 现在已标记为过时。 `Program.cs` ```cs using System; using System.Net; using System.IO; namespace DownloadPageHttpWebRequest { class Program { static void Main(string[] args) { string html = string.Empty; string url = "http://webcode.me"; HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); request.UserAgent = "C# console client"; using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { html = reader.ReadToEnd(); } Console.WriteLine(html); } } } ``` 该示例读取站点的内容并将其打印到控制台中。 ```cs HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url); ``` 用`WebRequest.Create()`方法创建一个`HttpWebRequest`。 它以 URL 作为参数。 ```cs using (HttpWebResponse response = (HttpWebResponse) request.GetResponse()) ``` 从请求中,我们使用`GetResponse()`方法获得了`HttpWebResponse`。 ```cs using (Stream stream = response.GetResponseStream()) using (StreamReader reader = new StreamReader(stream)) { html = reader.ReadToEnd(); } ``` 我们将网页的内容读入字符串。 ```cs Console.WriteLine(html); ``` 数据被打印到控制台。 ## C# 使用`Flurl.Http`读取网页 Flurl.Http 是用于 C# 语言的流畅,可移植,可测试的 HTTP 第三方客户端库。 ```cs $ dotnet add package Flurl.Http ``` 我们安装`Flurl.Http`包。 `DownloadPageFlurl.cs` ```cs using System; using System.Threading.Tasks; using Flurl.Http; namespace DownloadPageFlurl { class Program { static async Task Main(string[] args) { string result = await "http://webcode.me".GetStringAsync(); Console.WriteLine(result); } } } ``` 该示例读取一个小型网页并将其内容打印到终端。 ```cs string result = await "http://webcode.me".GetStringAsync(); ``` `await`运算符应用于异步方法中的任务,以暂停该方法的执行,直到等待的任务完成为止。 该任务代表正在进行的工作。 使用`GetStringAsync()`扩展方法检索数据。 ## 用`RestSharp`读取网页 RestSharp 是.NET 的简单 REST 和 HTTP API 客户端。 它是一个第三方库。 ```cs $ dotnet add package RestSharp ``` 我们安装`RestSharp`包。 `Program.cs` ```cs using System; using RestSharp; namespace DownloadPageRestSharp { class Program { static void Main(string[] args) { var client = new RestClient("http://webcode.me"); var request = new RestRequest("", Method.GET); client.ExecuteAsync(request, response => { Console.WriteLine(response.Content); }); Console.ReadLine(); } } } ``` 该代码示例使用 RestSharp 库获取网页的内容。 该网页是异步下载的。 ```cs var client = new RestClient("http://www.something.com"); ``` 使用`RestClient`类创建一个其他客户端。 ```cs var request = new RestRequest("", Method.GET); ``` 使用`RestRequest`创建 GET 请求。 ```cs client.ExecuteAsync(request, response => { Console.WriteLine(response.Content); }); ``` 该请求使用`ExecuteAsync()`方法异步执行。 在本文中,我们展示了如何使用 C# 读取网页。 您可能也对以下相关教程感兴趣: [MySQL C# 教程](/db/mysqlcsharptutorial/), [C# 中的日期和时间](/articles/csharpdatetime/),[用 C# 读取文本文件](/articles/csharpreadtext/)或 [C# Winforms 教程](/gui/csharpwinforms/)。