原文: https://zetcode.com/csharp/readwebpage/

在本文中,我们展示了如何在 C# 中抓取网页。 C# 教程是有关 C# 语言的综合教程。

本教程显示了如何使用HttpWebRequestWebClientHttpClientFlurl.HttpRestSharp读取页面。

在本教程的示例中,我们从一个小型网页 webcode.me 中读取了一个网页。

C# 使用HttpClient读取网页

HttpClient提供了一个基类,用于从 URI 标识的资源发送 HTTP 请求和接收 HTTP 响应。

Program.cs

  1. using System;
  2. using System.Net.Http;
  3. using System.Threading.Tasks;
  4. namespace DownloadPageHttpClient
  5. {
  6. class Program
  7. {
  8. static async Task Main(string[] args)
  9. {
  10. using var client = new HttpClient();
  11. client.DefaultRequestHeaders.Add("User-Agent", "C# console program");
  12. var content = await client.GetStringAsync("http://webcode.me");
  13. Console.WriteLine(content);
  14. }
  15. }
  16. }

该代码示例使用HttpClient异步抓取网页。

  1. var content = await client.GetStringAsync("http://webcode.me");

await运算符将awaitable作为参数; 检查是否已经完成等待; 如果等待已完成,则该方法继续运行。 GetStringAsync()将内容读取为字符串,作为异步操作。

  1. $ dotnet run
  2. <!DOCTYPE html>
  3. <html lang="en">
  4. <head>
  5. <meta charset="UTF-8">
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  7. <title>My html page</title>
  8. </head>
  9. <body>
  10. <p>
  11. Today is a beautiful day. We go swimming and fishing.
  12. </p>
  13. <p>
  14. Hello there. How are you?
  15. </p>
  16. </body>
  17. </html>

这是输出。

WebClient读取网页

WebClient提供了用于向 URI 标识的资源发送数据和从中接收数据的通用方法。

Program.cs

  1. using System;
  2. using System.Net;
  3. namespace DownloadPageWebClient
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. using var client = new WebClient();
  10. client.Headers.Add("User-Agent", "C# console program");
  11. string url = "http://webcode.me";
  12. string content = client.DownloadString(url);
  13. Console.WriteLine(content);
  14. }
  15. }
  16. }

该代码示例使用WebClient获取网页。

  1. string content = client.DownloadString(url);

DownloadString()方法检索指定的资源。 此方法在下载资源时阻塞。

在第二个示例中,我们为WebClient提供了一种非阻塞方法。

Program.cs

  1. using System;
  2. using System.Net;
  3. using System.Threading.Tasks;
  4. namespace DownloadPageWebClientAsync
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. using var client = new WebClient();
  11. client.DownloadStringCompleted += (sender, e) =>
  12. {
  13. Console.WriteLine(e.Result);
  14. };
  15. string url = "http://www.webcode.me";
  16. client.DownloadStringAsync(new Uri(url));
  17. Console.ReadLine();
  18. }
  19. }
  20. }

该代码示例使用WebClient获取网页的 HTML 代码。 这次操作是异步的。

  1. client.DownloadStringCompleted += (sender, e) =>
  2. {
  3. Console.WriteLine(e.Result);
  4. };

DownloadStringCompleted事件在异步资源下载操作完成时发生。

  1. client.DownloadStringAsync(new Uri(url));

DownloadStringAsync方法下载指定为StringUri的资源。 该方法不会阻塞调用线程。

C# 使用HttpWebRequest读取网页

HttpWebRequest类提供对属性和方法的支持,这些属性和方法使用户可以使用 HTTP 直接与服务器进行交互。 此 API 现在已标记为过时。

Program.cs

  1. using System;
  2. using System.Net;
  3. using System.IO;
  4. namespace DownloadPageHttpWebRequest
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. string html = string.Empty;
  11. string url = "http://webcode.me";
  12. HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
  13. request.UserAgent = "C# console client";
  14. using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())
  15. using (Stream stream = response.GetResponseStream())
  16. using (StreamReader reader = new StreamReader(stream))
  17. {
  18. html = reader.ReadToEnd();
  19. }
  20. Console.WriteLine(html);
  21. }
  22. }
  23. }

该示例读取站点的内容并将其打印到控制台中。

  1. HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);

WebRequest.Create()方法创建一个HttpWebRequest。 它以 URL 作为参数。

  1. using (HttpWebResponse response = (HttpWebResponse) request.GetResponse())

从请求中,我们使用GetResponse()方法获得了HttpWebResponse

  1. using (Stream stream = response.GetResponseStream())
  2. using (StreamReader reader = new StreamReader(stream))
  3. {
  4. html = reader.ReadToEnd();
  5. }

我们将网页的内容读入字符串。

  1. Console.WriteLine(html);

数据被打印到控制台。

C# 使用Flurl.Http读取网页

Flurl.Http 是用于 C# 语言的流畅,可移植,可测试的 HTTP 第三方客户端库。

  1. $ dotnet add package Flurl.Http

我们安装Flurl.Http包。

DownloadPageFlurl.cs

  1. using System;
  2. using System.Threading.Tasks;
  3. using Flurl.Http;
  4. namespace DownloadPageFlurl
  5. {
  6. class Program
  7. {
  8. static async Task Main(string[] args)
  9. {
  10. string result = await "http://webcode.me".GetStringAsync();
  11. Console.WriteLine(result);
  12. }
  13. }
  14. }

该示例读取一个小型网页并将其内容打印到终端。

  1. string result = await "http://webcode.me".GetStringAsync();

await运算符应用于异步方法中的任务,以暂停该方法的执行,直到等待的任务完成为止。 该任务代表正在进行的工作。 使用GetStringAsync()扩展方法检索数据。

RestSharp读取网页

RestSharp 是.NET 的简单 REST 和 HTTP API 客户端。 它是一个第三方库。

  1. $ dotnet add package RestSharp

我们安装RestSharp包。

Program.cs

  1. using System;
  2. using RestSharp;
  3. namespace DownloadPageRestSharp
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var client = new RestClient("http://webcode.me");
  10. var request = new RestRequest("", Method.GET);
  11. client.ExecuteAsync(request, response =>
  12. {
  13. Console.WriteLine(response.Content);
  14. });
  15. Console.ReadLine();
  16. }
  17. }
  18. }

该代码示例使用 RestSharp 库获取网页的内容。 该网页是异步下载的。

  1. var client = new RestClient("http://www.something.com");

使用RestClient类创建一个其他客户端。

  1. var request = new RestRequest("", Method.GET);

使用RestRequest创建 GET 请求。

  1. client.ExecuteAsync(request, response => {
  2. Console.WriteLine(response.Content);
  3. });

该请求使用ExecuteAsync()方法异步执行。

在本文中,我们展示了如何使用 C# 读取网页。 您可能也对以下相关教程感兴趣: MySQL C# 教程C# 中的日期和时间用 C# 读取文本文件C# Winforms 教程