使用 Invoke-WebRequest (最推荐)

这是 PowerShell 中最现代、最强大、最推荐的方法,它不仅能获取源代码,还能将网页内容解析成结构化的对象,方便后续处理。

powershell获取网页源代码
(图片来源网络,侵删)

基本用法

# 1. 最简单的用法,直接获取网页内容
# $response 是一个包含所有响应信息的对象
$response = Invoke-WebRequest -Uri "https://www.bing.com"
# 2. 获取并显示纯HTML源代码
# .Content 属性包含了网页的完整HTML源代码
$htmlContent = $response.Content
$htmlContent

常用参数和属性

Invoke-WebRequest 返回一个 WebResponseObject 对象,它包含了很多有用的属性:

  • Content: 获取网页的原始HTML内容(字符串)。
  • StatusCode: 获取HTTP状态码,200 (成功), 404 (未找到)。
  • Headers: 获取响应头信息。
  • Links: 一个包含页面所有链接 (<a>) 的对象数组,非常方便。
  • Images: 一个包含页面所有图片 (<img>) 的对象数组。
  • InputFields: 一个包含页面所有输入框 (<input>, <select>, <textarea>) 的对象数组。
  • Forms: 一个包含页面所有表单 (<form>) 的对象数组。

示例:获取页面上的所有链接

$response = Invoke-WebRequest -Uri "https://www.github.com"
# 遍历并显示所有链接的文本和地址
foreach ($link in $response.Links) {
    Write-Host "文本: $($link.innerText), 地址: $($link.href)"
}

示例:处理需要登录的网站

很多网站会检查 User-Agent (用户代理) 字段,最好手动设置一个。

powershell获取网页源代码
(图片来源网络,侵删)
# 设置自定义的 User-Agent
$headers = @{
    "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"
}
# 发送请求,并带上自定义的头部
$response = Invoke-WebRequest -Uri "https://www.example.com" -Headers $headers
# 获取源代码
$htmlContent = $response.Content
$htmlContent

使用 Invoke-RestMethod

这个方法和方法一非常相似,但有一个关键区别:当返回的内容是 JSON 格式时,Invoke-RestMethod 会自动将其解析为 PowerShell 对象(如哈希表或数组),如果目标是获取 HTML,它和方法一基本一样。

基本用法

# 获取HTML源代码,效果和方法一类似
$response = Invoke-RestMethod -Uri "https://www.bing.com"
$htmlContent = $response
$htmlContent

主要用途:获取 JSON 数据

这才是 Invoke-RestMethod 大显身手的地方。

# 这是一个返回JSON数据的API
$jsonUri = "https://api.github.com/users/microsoft"
# Invoke-RestMethod 会自动将JSON转换为PowerShell对象
$userInfo = Invoke-RestMethod -Uri $jsonUri
# 现在可以直接像操作对象一样访问数据
Write-Host "用户名: " + $userInfo.login
Write-Host "公开仓库数: " + $userInfo.public_repos
Write-Host "个人主页: " + $userInfo.blog

使用 .NET 类 (底层方法)

这种方法不依赖于 PowerShell 的 cmdlet,而是直接调用 .NET 框架中的 System.Net.HttpWebRequestSystem.Net.Http.HttpClient 类,它更底层,灵活性更高,但代码也更复杂。

使用 System.Net.Http.HttpClient (推荐在 .NET 方法中使用)

这是 .NET 中处理 HTTP 请求的现代标准。

powershell获取网页源代码
(图片来源网络,侵删)
# 1. 创建 HttpClient 实例
$client = [System.Net.Http.HttpClient]::new()
# 2. (可选) 设置 User-Agent
$client.DefaultRequestHeaders.Add('User-Agent', 'My-PowerShell-Script/1.0')
# 3. 发送 GET 请求并获取响应流
# 使用 .EnsureSuccessStatusCode() 来检查HTTP状态码,如果不是2xx会抛出异常
$response = $client.GetAsync('https://www.bing.com').Result
$response.EnsureSuccessStatusCode()
# 4. 从响应流中读取内容为字符串
$htmlContent = $response.Content.ReadAsStringAsync().Result
# 5. 显示源代码
$htmlContent
# 6. 释放资源 (重要!)
$client.Dispose()

使用旧版 Invoke-WebRequest (别名 iwr)

在 PowerShell 3.0 之前,获取网页的命令是 Invoke-WebRequest 的一个别名 iwr,虽然现在仍然可用,但返回的对象结构不同,功能也较弱。不推荐在新脚本中使用

# 使用旧版方法
$htmlContent = iwr "https://www.bing.com" | Select-Object -ExpandProperty Content
$htmlContent

总结与对比

方法 命令 优点 缺点 适用场景
推荐 Invoke-WebRequest 功能强大,返回结构化对象,易于解析链接、图片、表单等。 对于非常大的页面,可能会消耗较多内存。 绝大多数场景,特别是需要解析网页内容时。
API专用 Invoke-RestMethod 自动解析 JSON,直接得到 PowerShell 对象,非常方便。 对于非 JSON 内容(如 HTML),和处理方法一类似。 调用 RESTful API,处理 JSON 数据。
底层 [System.Net.Http.HttpClient] 灵活性最高,性能更好(尤其在多次请求时),可精细控制请求细节。 代码最复杂,需要手动处理异常和释放资源。 需要高度定制化请求、性能要求高的复杂脚本。
旧版 iwr 在非常古老的 PowerShell 版本中可用。 功能有限,返回对象结构陈旧,不推荐。 维护旧版 PowerShell 脚本。

最终建议

对于绝大多数用户和任务,直接使用 Invoke-WebRequest 是最佳选择,它简单、直观且功能强大。

# 一行代码搞定
(Invoke-WebRequest -Uri "https://www.bing.com").Content