你是否曾想过通过命令行浏览网页?是的,我也没有。但你是否曾经需要从网页中提取信息、监视网站或通过自动化提交信息?我有,并且我使用 Invoke-Webrequest 来完成!
PowerShell cmdlet 的 Invoke-WebRequest 是 Web 的瑞士军刀。该 cmdlet 可以向 Web 服务发送任何 HTTP 动词,以及常见的内容,如 HTTP 参数,指定不同的 HTTP 标头等。Invoke-WebRequest 以及它的兄弟 Invite-RestMethod 是你在需要进行任何类型的 Web 自动化时需要熟悉的两个 PowerShell cmdlet。
Invoke-WebRequest cmdlet 是随 Windows PowerShell 和 PowerShell Core 一起提供的 Microsoft.PowerShell.Utility 模块的一部分。自 PowerShell v3 以来,该 cmdlet 就已经包含在 PowerShell 中,并且它是一个非常强大而易于使用的工具。
通过使用 Invoke-WebRequest,PowerShell 允许开发人员以多种不同的方式处理网站、Web 服务和 REST API。
基本用法
在其最基本的用法中,Invoke-WebRequest cmdlet 向终结点发送 HTTP 请求方法,如 URI 或 URL。该 cmdlet 支持所有常见的请求方法请求方法。
迄今为止,最常见的方法是GET方法。该方法读取来自网站的信息,或者可能查询REST API的信息。该方法是通过使用Method
参数定义的。由于我们需要查询一个端点,因此我们还需要一个URI。为了简化,我将选择任何网站。为了不要脸地宣传 TechSnips,我将选择 techsnips.io。
假设我想获取所有最新发布的视频列表,如下所示。

I can get an HTML representation of this page by running Invoke-WebRequest -Uri 'https://techsnips.io' -Method GET
. When I do this, Invoke-WebRequest
downloads the entire web page and returns an output with various parsed information around the elements of the page.

要获取视频,我需要进行一些挖掘。当我查看链接属性时,我看到所有视频链接都具有ng-binding
类似性,如下所示。

一旦我知道这一点,我就可以找到所有这些元素,并只返回innerHTML
属性,大功告成!

使用 Invoke-WebRequest 下载文件
我们还可以使用Invoke-WebRequest
从网上下载文件,而且非常简单!我们可以通过简单地将Invoke-WebRequest
指向文件的URI,并使用OutFile
参数告诉cmdlet将文件保存到本地磁盘来下载文件。
例如,下面我正在下载 SysInternals Handle 实用程序并在下载后展开 zip 文件。就是这么简单!
提交表单和处理会话
我们可以使用Invoke-WebRequest
来填写表单。不过,为了做到这一点,通常需要使用网络会话。HTTP是一种天然无状态的协议,你的浏览器(在这种情况下是PowerShell)必须能够创建一个会话,用于跟踪诸如 cookie 等内容。一个常见的表单是登录/密码表单,所以让我们登录到一个虚构的网站吧!
假设我们的虚构登录表单位于URLhttp://somewebsite.com。我们首先需要运行Invoke-WebRequest
来下载HTML结构并创建一个会话。
一旦我们这样做了,响应将有一个Forms
属性,我们可以用用户名和密码填充它。在这种情况下,用户名由名为user
的字段表示,密码应该在名为password
的字段中。这将取决于网页。
一旦表单被填充,我们就可以再次使用Invoke-WebRequest
,但这次我们要重用刚刚创建的会话,并通过读取表单上的Action
属性来自动找出要发送到的URI,如下所示。
如果你已经把所有正确的字段名称都搞对了,并且网页没有做任何花哨的事情,你应该已经用$rb
网页会话中的用户名和密码登录了。在这一点上,如果你使用$rb
网页会话变量,你可以阅读认证之后的各种页面。
解析短链接URI
最后,Invoke-WebRequest
的另一个绝佳用途是解析短链接。也许你想知道缩短 URL 背后的内容,但又不想点击查看!没问题。使用 Invoke-WebRequest
,我们可以从解析后的响应中读取 AbsoluteUri
属性!
请注意下面我还使用了 UseBasicParsing
参数。默认情况下,Invoke-WebRequest
尝试使用 Internet Explorer (IE) 来解析返回的 HTML。但在没有 IE 的系统上无法使用。为了解决这个问题,我们可以使用 UseBasicParsing
参数来仍然下载内容,但仅轻量解析。
总结
Invoke-WebRequest
cmdlet 是 PowerShell 自带的最通用的 cmdlet 之一。如果通过典型的图形浏览器可以执行某个动作,Invoke-WebRequest
cmdlet 也可以做到。你可以通过查看这篇文章上的示例来了解如何使用这个 cmdlet 进行监控 REST APIs。