你曾经想过通过命令行浏览网页吗?是的,我也没有。但是你曾经需要从网页中获取信息、监控网站或通过自动化提交信息吗?我有,并且我使用 Invoke-Webrequest 来完成!
Invoke-WebRequest PowerShell cmdlet 是网络的瑞士军刀。这个 cmdlet 可以发送任何 HTTP 动词到一个 Web 服务,还可以包括常见的 HTTP 参数,指定不同的 HTTP 头等等。如果你需要进行任何类型的网络自动化操作,你需要熟悉 Invoke-WebRequest 和它的兄弟 cmdlet Invite-RestMethod。
Invoke-WebRequest cmdlet 是 Microsoft.PowerShell.Utility 模块的一部分,它随着 Windows PowerShell 和 PowerShell Core 一起提供。自 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)必須能夠創建一個會話,用於跟踪例如 cookies 等信息。一個常見的表單是登錄/密碼表單,所以讓我們登錄到一個虛構的網站吧!
假設我們虛構的登錄表單位於 URL http://somewebsite.com。我們首先需要運行 Invoke-WebRequest
來下載 HTML 結構並創建一個會話。
這樣做後,響應將具有一個 Forms
屬性,我們可以通過它來填充用戶名和密碼。在這種情況下,用戶名由名為 user
的字段表示,密碼應該在名為 password
的字段中。這將取決於網頁。
表單填充完畢後,我們可以再次使用 Invoke-WebRequest
,但這次重複使用我們剛剛創建的會話,並通過讀取表單上的 Action
屬性自動找出要發送的 URI,如下所示。
如果你已經正確設置了所有適當的字段名,並且網頁沒有做任何花哨的操作,那麼你應該已經使用 $rb
網頁會話變量成功登錄。此時,如果你使用 $rb
網頁會話變量,你可以閱讀身份驗證後的各種頁面。
解析短網址
最後,Invoke-WebRequest
的另一個很棒的用途是解析短網址。也許您想知道那個縮短的網址背後是什麼,但又不想點擊它去查看!沒問題。使用 Invoke-WebRequest
,我們可以從它返回的解析響應中讀取 AbsoluteUri
屬性!
請注意下面我還使用了 UseBasicParsing
參數。預設情況下,Invoke-WebRequest
嘗試使用 Internet Explorer (IE) 解析返回的 HTML。但在沒有 IE 的系統上無法使用。為了解決這個問題,我們可以使用 UseBasicParsing
參數來下載內容,但只進行輕量級的解析。
總結
Invoke-WebRequest
命令是 PowerShell 中最多用途的命令之一。如果在典型的圖形瀏覽器中可以執行的操作,Invoke-WebRequest
命令也可以做到。您可以通過查看這篇關於 監控 REST API 的文章來找到使用該命令的示例。