核心概念

无论使用哪种方法,其基本流程都是相似的:

vb.net 读取网页源码
(图片来源网络,侵删)
  1. 创建请求:告诉服务器你想获取哪个网页。
  2. 发送请求:向服务器发送请求。
  3. 获取响应:接收服务器返回的数据。
  4. 读取响应内容:将返回的数据(即网页源码)读取出来。

使用 HttpClient (推荐,现代标准)

这是目前 .NET (包括 VB.NET) 官方推荐的方式,它功能强大、性能优越,并且是异步编程的首选,对于新项目,强烈建议使用此方法

优点:

  • 性能高:支持异步操作 (Async/Await),不会阻塞应用程序主线程,适合桌面应用和Web应用。
  • 功能丰富:提供了丰富的API来处理HTTP请求、响应、Cookie等。
  • 灵活:可以轻松配置请求头、超时时间、代理等。

示例代码 (同步版本 - 简单直接)

' 需要导入以下命名空间
Imports System.Net.Http
Imports System.IO
Imports System.Threading.Tasks
Public Class Form1
    Private Async Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
        ' 禁用按钮,防止重复点击
        ButtonGetSource.Enabled = False
        TextBoxSource.Text = "正在获取,请稍候..."
        Try
            ' 1. 创建 HttpClient 实例
            Using client As New HttpClient()
                ' 设置一个合理的超时时间(例如10秒)
                client.Timeout = TimeSpan.FromSeconds(10)
                ' 2. 创建请求的 URL
                Dim url As String = "https://www.example.com"
                ' 3. 发送 GET 请求并获取响应
                ' GetStringAsync 是一个便捷方法,它会自动将响应内容读取为字符串
                Dim sourceCode As String = Await client.GetStringAsync(url)
                ' 4. 在文本框中显示源码
                TextBoxSource.Text = sourceCode
            End Using
        Catch ex As Exception
            ' 捕获并显示可能发生的错误,例如网络连接失败、超时等
            TextBoxSource.Text = $"发生错误: {ex.Message}"
        Finally
            ' 无论成功或失败,都重新启用按钮
            ButtonGetSource.Enabled = True
        End Try
    End Sub
End Class

示例代码 (异步版本 - 更专业,推荐用于UI应用)

上面的 Async Sub 例子已经包含了异步的核心,下面是一个更完整的 Async Function 版本,通常用于类库或非UI场景。

Imports System.Net.Http
Imports System.Threading.Tasks
Public Class WebFetcher
    Public Shared Async Function GetWebPageSourceAsync(url As String) As Task(Of String)
        Using client As New HttpClient()
            ' 可以设置 User-Agent,模拟浏览器访问,防止被某些网站屏蔽
            client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
            client.Timeout = TimeSpan.FromSeconds(15)
            ' 发送请求并获取响应流
            Using response As HttpResponseMessage = Await client.GetAsync(url)
                ' 确保响应状态码是成功的 (200 OK)
                response.EnsureSuccessStatusCode()
                ' 将响应内容作为字符串读取
                Return Await response.Content.ReadAsStringAsync()
            End Using
        End Using
    End Function
End Class
' 在窗体中调用
Private Async Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
    ButtonGetSource.Enabled = False
    TextBoxSource.Text = "正在获取..."
    Try
        Dim source As String = Await WebFetcher.GetWebPageSourceAsync("https://www.example.com")
        TextBoxSource.Text = source
    Catch ex As HttpRequestException
        TextBoxSource.Text = $"HTTP请求错误: {ex.Message}"
    Catch ex As TaskCanceledException
        TextBoxSource.Text = "请求超时或被取消。"
    Catch ex As Exception
        TextBoxSource.Text = $"发生未知错误: {ex.Message}"
    Finally
        ButtonGetSource.Enabled = True
    End Try
End Sub

使用 WebClient (简单易用,但已过时)

WebClient 是 .NET Framework 中一个非常简单的类,用于发送和接收数据,它的语法非常简洁,适合快速实现简单的下载功能。

优点:

  • 语法简单:代码量少,易于上手。
  • 同步/异步支持:提供了 DownloadString (同步) 和 DownloadStringAsync (异步) 方法。

缺点:

  • 已过时:微软官方文档已将其标记为“已过时”(obsolete),并推荐使用 HttpClient
  • 功能有限:不如 HttpClient 灵活,配置选项较少。
  • 性能问题:在大量并发请求时,性能不如 HttpClient

示例代码

Imports System.Net
Public Class Form1
    Private Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
        ButtonGetSource.Enabled = False
        TextBoxSource.Text = "正在获取..."
        Try
            ' 1. 创建 WebClient 实例
            Using client As New WebClient()
                ' 可以设置编码,防止中文乱码
                client.Encoding = System.Text.Encoding.UTF8
                ' 2. 下载网页源码
                ' DownloadString 是同步方法,会阻塞当前线程
                Dim sourceCode As String = client.DownloadString("https://www.example.com")
                ' 3. 显示结果
                TextBoxSource.Text = sourceCode
            End Using
        Catch ex As Exception
            TextBoxSource.Text = $"发生错误: {ex.Message}"
        Finally
            ButtonGetSource.Enabled = True
        End Try
    End Sub
End Class

使用 HttpWebRequest / HttpWebResponse (底层灵活,但繁琐)

这是最底层、最传统的方式,它提供了对HTTP协议的完全控制,你可以手动设置请求头、内容、方法(GET, POST等)。

vb.net 读取网页源码
(图片来源网络,侵删)

优点:

  • 控制力最强:可以精确控制HTTP请求的每一个细节。
  • 兼容性最好:在非常古老的 .NET Framework 版本中也能使用。

缺点:

  • 代码繁琐:需要手动管理请求流、响应流,代码量多,容易出错。
  • 使用复杂:相比前两种方法,使用起来更麻烦。

示例代码

Imports System.IO
Imports System.Net
Public Class Form1
    Private Sub ButtonGetSource_Click(sender As Object, e As EventArgs) Handles ButtonGetSource.Click
        ButtonGetSource.Enabled = False
        TextBoxSource.Text = "正在获取..."
        Try
            ' 1. 创建 HttpWebRequest 对象
            Dim request As HttpWebRequest = WebRequest.Create("https://www.example.com")
            request.Method = "GET"
            request.Timeout = 10000 ' 10秒超时
            ' 2. 获取响应
            Using response As HttpWebResponse = request.GetResponse()
                ' 检查响应状态码
                If response.StatusCode = HttpStatusCode.OK Then
                    ' 3. 获取响应流
                    Using stream As Stream = response.GetResponseStream()
                        ' 4. 使用 StreamReader 读取流内容
                        Using reader As New StreamReader(stream)
                            ' 5. 读取到字符串
                            Dim sourceCode As String = reader.ReadToEnd()
                            TextBoxSource.Text = sourceCode
                        End Using
                    End Using
                Else
                    TextBoxSource.Text = $"服务器返回错误: {response.StatusCode}"
                End If
            End Using
        Catch ex As WebException
            TextBoxSource.Text = $"网络请求错误: {ex.Message}"
        Catch ex As Exception
            TextBoxSource.Text = $"发生错误: {ex.Message}"
        Finally
            ButtonGetSource.Enabled = True
        End Try
    End Sub
End Class

总结与选择建议

特性 HttpClient (推荐) WebClient (简单) HttpWebRequest (底层)
推荐度 ⭐⭐⭐⭐⭐ ⭐⭐
易用性 简单 非常简单 复杂
性能 高 (支持异步) 一般 一般
灵活性 非常高
状态 现代标准 已过时 传统方法
适用场景 所有新项目,特别是需要高性能和异步的场景。 快速原型、简单的脚本任务。 需要精细控制HTTP协议的复杂场景。

对于绝大多数情况,请直接选择 HttpClient,它既现代又高效,是 .NET 生态系统的未来,除非你有特殊理由(例如维护旧代码),否则不应该再使用 WebClientHttpWebRequest 来开发新功能。

vb.net 读取网页源码
(图片来源网络,侵删)