如何将 PowerShell Invoke-WebRequest 与代理一起使用

PowerShell 中的 Invoke-WebRequest cmdlet 是一个用于向网站发出 HTTP 请求的便捷工具。如果你正在使用 Bright Data 的代理服务,可以通过指定 -Proxy 参数并在其后跟上你的代理详细信息,将此 cmdlet 与代理一起使用。
4 分钟阅读

在本篇 Invoke-WebRequest PowerShell 代理指南的最后,你将了解:

  • Invoke-WebRequest 是什么
  • 如何在 Windows、macOS 和 Linux 上使用它。
  • 在 PowerShell 中使用代理之前需要了解什么。
  • 如何在 Invoke-WebRequest 中指定 HTTP 代理。
  • 如何处理 HTTPS 和 SOCKS 代理。
  • 像专业人士一样在 PowerShell 中使用代理的提示和技巧。
  • 你应该选择哪种类型的代理。

让我们深入了解!

什么是 PowerShell Invoke-WebRequest?

Invoke-WebRequest 是一个 PowerShell cmdlet,用于向 Web 服务器和 Web 服务发送 HTTP、HTTPS 和 FTP 请求。默认情况下,它会自动解析服务器生成的响应,并返回表单、链接、图像或其他重要 HTML 元素的集合。

通常,它用于访问 REST API、从 Web 下载文件,或与 Web 服务交互。这是 Invoke-WebRequest 请求的基本语法:

Invoke-WebRequest [-Uri] <Uri> [-Method <WebRequestMethod>] [-Headers <IDictionary>] [-Body <Object>]

需要记住的关键参数是:

  • -Uri: 请求发送到的 Web 资源的 URI。
  • -Method: 请求使用的 HTTP 方法(例如 GET、POST、PUT、DELETE)。Invoke-WebRequest 默认发送 GET 请求。
  • -Headers: 要包含在请求中的附加 HTTP 标头。
  • -Body: 要发送到服务器的请求正文。

如你所见,唯一必需的参数是 。因此,简而言之,对给定 URI 执行 GET 请求的最简单语法是:

Invoke-WebRequest <Uri>

此 cmdlet 于 2012 年在 PowerShell 3.0 中引入。

安装 Invoke-WebRequest

要使用 Invoke-WebRequest,你需要 PowerShell。因此,让我们了解如何安装 PowerShell 并访问 Invoke-WebRequest cmdlet!

Windows

首先,你需要了解 Windows PowerShellPowerShell 是两回事。Windows PowerShell 是随 Windows 一起提供的 PowerShell 版本,其最新版本是 5.1。Windows Powershell 提供 Invoke-WebRequest cmdlet。这意味着如果你使用的是现代 Windows 版本,就已经可以开始了!对于较旧版本,请遵循官方 PowerShell 安装指南

与此同时,Invoke-WebRequest 的某些功能仅从 PowerShell 7.x 开始可用。有关如何安装它的更多详细信息,请遵循从 Windows PowerShell 5.1 迁移到 PowerShell 7 的官方迁移指南。请注意,PowerShell 7.x 会安装到一个新目录,并与 Windows PowerShell 5.1 并行运行。

你可以使用此命令验证 Windows 机器上当前安装的 PowerShell 版本:

$PSVersionTable

在 PowerShell 7.x 上,它应该会打印类似如下内容:

PSVersion                      7.4.1

PSEdition                      Core

GitCommitId                    7.4.1

OS                             Microsoft Windows 10.0.22631

Platform                       Win32NT

PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}

PSRemotingProtocolVersion      2.3

SerializationVersion           1.1.0.1

WSManStackVersion              3.0

macOS 和 Linux

PowerShell 7.x 可以安装在 macOS 和 Linux 上。但是,仅仅为了访问 Invoke-WebRequest cmdlet 而在操作系统中安装整个 PowerShell 生态系统并没有太大意义。相反,你应该使用 curl。这个库随 macOS 和大多数 Linux 发行版预装,提供与 Invoke-WebRequest 相同的能力。在我们的 curl 代理指南中了解更多信息。

在 PowerShell 中开始使用代理的先决条件

代理充当客户端和目标服务器之间的中介。它会拦截你的请求,将其转发给服务器,接收服务器的响应,并将其发送回给你。这样,目标服务器会看到请求来自所选代理服务器的 IP 和位置,而不是来自你。

要开始将 PowerShell 代理与 Invoke-WebRequest 一起使用,你需要了解代理服务器 URL 的样子。

这是 PowerShell Invoke-WebRequest 代理的 URL:

<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]

它由以下部分组成:

  • : 用于连接到代理服务器的协议。
  • : 代理服务器主机名的 IP 地址或 URL。
  • : 代理服务器监听的端口号。
  • : 需要代理身份验证时要指定的可选用户名。
  • : 需要代理身份验证时要指定的可选密码。

请注意,Invoke-WebRequest 要求 URL 中包含 :// 部分。如果省略它,请求将失败并显示以下错误:

Invoke-WebRequest : This operation is not supported for a relative URI.

至于代理协议,最流行的是 HTTP、HTTPS 和 SOCKS。PowerShell 5.1 中的 Invoke-WebRequest 仅支持 HTTP,而在 PowerShell 7.x 中它还支持 HTTPS 和 SOCKS。

是时候获取一个有效的 HTTP 代理了!

你可以在网上免费找到一个,如下所示:

Protocol: HTTP; IP Address: 190.6.23.219; Port: 999

组合这些信息以获得以下代理 URL:

http://190.6.23.219:999

警告

出于学习目的选择免费代理是可以的,但你不能在真实场景中依赖它们。免费代理不可靠、容易出错、速度慢、贪数据且寿命短。不要使用它们!

解决方案?来自 Bright Data 的高级代理,市场上最好的提供商。订阅并免费试用我们可靠的代理。

Bright Data 的代理受身份验证保护,因此只有受信任的用户才能访问它们。现在,假设协议是 HTTP,主机是 45.103.203.109,端口是 9571,凭据对是 admin-4521 和 rUuH3tJqf。在这种情况下,Invoke-WebRequest 代理 URL 将是:

http://admin-4521:@rUuH3tJqf45.103.203.109:9571

如何在 Invoke-WebRequest 中指定 HTTP 代理

在开始之前,在 PowerShell 中启动以下命令:

Invoke-WebRequest "https://httpbin.org/ip"

That should print something like:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "194.34.233.12"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 32

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 10:46:14 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 32]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 32

关注 Content 字段。它将包含你的 IP。

为什么?因为 HTTPBin 项目的 /ip 端点会返回请求的源 IP。换句话说,它会返回执行请求的机器的 IP 地址。在这种情况下,那就是你机器的 IP。

如果你只想访问 Content 字段,可以这样做:

$response = Invoke-WebRequest "https://httpbin.org/ip"

$response.Content

This would print:

{

&nbsp; "origin": "194.34.233.12"

}

如果你通过代理路由该请求,你应该会看到代理服务器的 IP 地址,而不是你自己的。因此,调用该端点是验证指定的 PowerShell Invoke-WebRequest 代理是否按预期工作的一个好测试。

在 Invoke-WebRequest 中设置 PowerShell 代理有几种方式。请在下面的分步指导部分中了解更多信息!

使用命令行选项

Invoke-WebRequest 提供 -Proxy 标志,用于为你的请求指定代理 URL。

因此,将 Invoke-WebRequest 与代理服务器一起使用的语法变为:

Invoke-WebRequest -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>

如果你现在执行此 PowerShell 命令:

Invoke-WebRequest -Proxy "http://190.6.23.219:999" "https://httpbin.org/ip"
Invoke-WebRequest -Uri "http://httpbin.org/ip" -Proxy "http://brd.superproxy.io:22225" -ProxyCredential (New-Object System.Management.Automation.PSCredential("brd-customer-CUSTOMER_ID-zone-ZONE’S_NAME", ("ZONE’S_PASSWORD" | ConvertTo-SecureString -AsPlainText -Force)))

The result should be:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "190.6.23.219"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 31

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 12:36:56 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 31]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 31

请注意,Content 中的 origin 与代理服务器 IP 匹配。这证明目标服务器看到请求来自代理,正如预期的那样。太棒了!

注意:不要忘记免费代理寿命很短!当你阅读本指南时,上述服务器很可能已经不可用了。如果出现错误,请将其替换为新的代理。

使用环境变量

自 PowerShell 7.0 起,Invoke-WebRequest 支持通过环境变量进行代理配置。

因此,在 Invoke-WebRequest 中使用 PowerShell 代理的另一种方式是设置以下两个 env:

  • HTTP_PROXY:HTTP 请求情况下要使用的代理服务器 URL。
  • HTTPS_PROXY: HTTPS 请求情况下要使用的代理服务器 URL。

在 Windows 上,你可以使用此 PowerShell 语法设置这两个环境变量:

$env:HTTP_PROXY = "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

$env:HTTPS_PROXY = "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

在我们的示例中,命令将变为:

$env:HTTP_PROXY = "http://190.6.23.219:999"

$env:HTTPS_PROXY = "http://190.6.23.219:999"

在 macOS 和 Linux 上,你需要使用下面的语法:

export HTTP_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

export HTTPS_PROXY="<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]"

因此,这两个命令将是:

export http_proxy="http://190.6.23.219:999"

export https_proxy="http://190.6.23.219:999"

从现在开始,每个 Invoke-WebRequest 请求都将通过指定的代理,而无需添加 -Proxy 选项。设置 env 后,启动以下命令:

Invoke-WebRequest "https://httpbin.org/ip"

You will get the same result as before:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "190.6.23.219"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 31

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 12:36:56 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 31]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 31

要关闭 Invoke-WebRequest 代理,请使用以下命令取消设置环境变量:

$env:HTTP_PROXY = ""

$env:HTTPS_PROXY = ""

Or on macOS and Linux:

unset HTTP_PROXY

unset HTTPS_PROXY

Invoke-WebRequest 将恢复其标准行为,https://httpbin.org/ip 现在将暴露你的 IP。

如何在 PowerShell 中使用 HTTPS 和 SOCKS 代理

如果你需要使用 HTTPS 或 SOCKS 代理,必须升级到 PowerShell 的 7.x+ 版本。否则,Invoke-WebRequest 将失败并显示:

Invoke-WebRequest : The ServicePointManager does not support proxies with the https scheme.

或者在 SOCKS 代理的情况下:

Invoke-WebRequest : The ServicePointManager does not support proxies with the socks scheme.

在 PowerShell 7.x 中处理 HTTPS 或 SOCKS 代理时,Invoke-WebRequest 命令结构保持不变:

Invoke-WebRequest -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>

变化的是 将是 https、socks4、socks4a、socks5 或 socks5a,而不是 http。

如果你尝试使用涉及上述协议之外的协议的代理来调用请求,将会收到此错误:

Invoke-WebRequest: Only the 'http', 'https', 'socks4', 'socks4a' and 'socks5' schemes are allowed for proxies.

因此,一个完整的 Invoke-WebRequest SOCKS 代理请求示例是:

Invoke-WebRequest -Proxy "socks5://94.14.109.54:3567" "http://httpbin.org/ip"

As you can expect, the result will be:

StatusCode        : 200

StatusDescription : OK

Content           : {

                      "origin": "94.14.109.54"

                    }

RawContent        : HTTP/1.1 200 OK

                    Connection: keep-alive

                    Access-Control-Allow-Origin: *

                    Access-Control-Allow-Credentials: true

                    Content-Length: 31

                    Content-Type: application/json

                    Date: Thu, 01 Feb 2024 12:47:56 GMT...

Forms             : {}

Headers           : {[Connection, keep-alive], [Access-Control-Allow-Origin, *], [Access-Control-Allow-Credentials,

                    true], [Content-Length, 31]...}

Images            : {}

InputFields       : {}

Links             : {}

ParsedHtml        : mshtml.HTMLDocumentClass

RawContentLength  : 31

你需要了解的提示和技巧

查看一些像专业人士一样处理 PowerShell Invoke-WebRequest 代理的有用技巧和宝贵提示。

忽略 PowerShell 代理配置

如果你想阻止 Invoke-WebRequest 使用从环境变量读取的已配置 PowerShell 代理,可以按如下方式使用 -NoProxy 选项:

Invoke-WebRequest -NoProxy <Uri>

这会指示 Invoke-WebRequest 在不使用代理的情况下联系 。

要验证这种方法是否有效,请在 env 中设置代理并运行:

Invoke-WebRequest -NoProxy "https://httpbin.org/ip"

生成的 origin 将包含你的 IP,而不是代理服务器的 IP。

Avoid SSL Certificate Errors

使用 HTTP 代理时,你的请求可能会因为 SSL 证书错误而失败。为避免这种情况,请指定 -SkipCertificateCheck 选项:

Invoke-WebRequest -SkipCertificateCheck -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>

-SkipCertificateCheck 通过允许不安全的服务器连接来帮助你避免证书错误。请记住,使用此参数并不安全。仅在处理已知主机时设置它。

例如,你可以通过代理联系 HTTPBin,同时使用以下方式绕过 SSL 问题:

Invoke-WebRequest -SkipCertificateCheck -Proxy "http://190.6.23.219:999" "https://httpbin.org/ip"

你应该使用哪种 PowerShell 代理?

这个问题的答案会根据你想通过 Invoke-WebRequest 请求实现什么而变化。要找到适合你需求的正确 PowerShell 代理,请查看可用的不同代理类型:

  • 数据中心代理:它们速度快且便宜,但由于其可识别的 IP 范围,可能很容易被网站检测并阻止。
  • 住宅代理:它们提供来自特定位置真实设备的动态真实 IP 地址。这意味着它们可以保证高水平的匿名性。住宅代理非常适合访问依赖地理限制封锁的网站,或避免反机器人措施。
  • ISP 代理:它们安全、快速且高度可靠,因为它们提供来自向 ISP 注册的设备的静态 IP。ISP 代理也称为住宅静态代理,是 SEO 监控和市场研究的完美解决方案。

这只是一个简要总结,但你可以在我们的代理 IP 类型指南中阅读更多内容。

结论

在本 PowerShell 代理指南中,你了解了 Invoke-WebRequest 是什么、它如何工作,以及如何将其与 HTTP/HTTPS/SOCKS 代理一起使用。事实证明,你不能依赖免费提供商的代理。因此,唯一需要做出的决定是你应该采用哪个代理提供商。节省时间和精力,直接选择市场上最好的提供商 Bright Data

Bright Data 控制着世界上最好的代理服务器,为财富 500 强公司和超过 20,000 名客户提供服务。其全球代理网络包括:

总体而言,这是市场上最大且最可靠的抓取相关代理网络之一。

支持支付宝等多种支付方式

Antonello Zanini

技术写作

5.5 years experience

Antonello是一名软件工程师,但他更喜欢称自己为技术传教士。通过写作传播知识是他的使命。

Expertise
Web 开发 网页抓取 AI 集成