在本篇 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 PowerShell 和 PowerShell 是两回事。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:
{
"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 名客户提供服务。其全球代理网络包括:
总体而言,这是市场上最大且最可靠的抓取相关代理网络之一。