当您到达这个Invoke-WebRequest PowerShell代理指南的结尾部分时,您将已了解:
- Invoke-WebRequest是什么
- 如何在Windows、macOS和Linux上使用它。
- 在PowerShell中使用代理之前需要了解的事项。
- 如何在Invoke-WebRequest中指定HTTP代理。
- 如何处理HTTPS和SOCKS代理。
- 让您专业地在PowerShell中使用代理的窍门和技巧。
- 应该选择哪种类型的代理。
让我们开始探索吧!
什么是PowerShell Invoke-WebRequest?
Invoke-WebRequest是一个PowerShell cmdlet,用于向网络服务器和网络服务发送HTTP、HTTPS和FTP请求。在默认情况下,它会自动解析服务器生成的响应,并返回表单、链接、图像或其他重要HTML元素的集合。
通常,它是用于访问REST API、从网络下载文件,或与网络服务进行交互。这是Invoke-WebRequest请求的基本语法:
Invoke-WebRequest [-Uri] <Uri> [-Method <WebRequestMethod>] [-Headers <IDictionary>] [-Body <Object>]
需要记住的关键参数是:
- -Uri:您向其发送请求的网络资源的URI。
- -Method:用于请求的HTTP方法(例如GET、POST、PUT、DELETE)。Invoke-WebRequest默认发送GET请求。
- -Headers:要包含在请求中的附加HTTP标头。
- -Body:要发送到服务器的请求的正文。
如您所见,唯一必需的参数是
Invoke-WebRequest <Uri>
此cmdlet是于2012年在PowerShell3.0中引入的。
安装Invoke-WebRequest
要使用Invoke-WebRequest,您需要PowerShell。那么,让我们来了解如何安装PowerShell以访问Invoke-WebRequest cmlet!
Windows
首先,您需要明白Windows PowerShell和PowerShell是两种不同的东西。Windows PowerShell是Windows附带的PowerShell版本,其最新版本是5.1。Windows Powershell提供Invoke-WebRequest cmlet。这意味着,如果您使用的是新版本的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 cmlet而在操作系统中安装整个PowerShell生态系统,并没有多大意义。相反,您应该使用curl。这个库预装在macOS和大多数Linux发行版中,提供与Invoke-WebRequest相同的功能。要了解更多信息,请参阅我们的curl代理指南。
在PowerShell中开始使用代理的先决条件
代理是客户端与目标服务器之间的中介。它会拦截您的请求,将请求转发到服务器,接收服务器的响应,然后将响应发送回来给您。这样,目标服务器就会将请求视为来自 所选代理服务器的IP和位置,而不是来自您。
要开始使用PowerShell代理发送Invoke-WebRequest,您需要了解代理服务器URL是什么样子。
这是PowerShell Invoke-WebRequest代理的URL:
<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]
其中包括:
:用于连接代理服务器的协议。 :代理服务器主机名的IP地址或URL。 :代理服务器监听的端口号码。 :在代理需要身份验证时填写的可选用户名。 :在代理需要身份验证时填写的可选密码。
请注意,URL的
Invoke-WebRequest:此操作不支持相对URI。
至于代理协议,最常用的是HTTP、HTTPS 和 SOCKS。PowerShell 5.1中的invoke-WebRequest仅支持HTTP,而在PowerShell 7.x中的invoke-WebRequest还支持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
请留意“内容”字段。其中包含您的 IP。
为什么?因为HTTPBin项目的/ip端点会返回请求的源IP。换句话说,它会返回执行请求的计算机的IP地址。在这种情况下,这就是您的计算机的IP。
如果您只想访问“内容”字段,您可以使用:
$response = Invoke-WebRequest "https://httpbin.org/ip"
$response.Content
This would print:
{
"origin": "194.34.233.12"
}
如果您通过代理路由该请求,您看到的应该是代理服务器的IP地址,而不是您的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
请注意,内容中的源与代理服务器IP匹配。这意味着目标服务器会如预期一样,以为请求是来自代理。太棒了!
注意:别忘了,免费代理的时效是短暂的!当您在阅读本指南时,上述服务器不大可能仍然存在。如果出现错误,请使用新的代理取代旧的。
使用环境变量
自PowerShell 7.0起,Invoke-WebRequest支持通过环境变量进行代理配置。
因此,在Invoke-WebRequest中使用PowerShell代理的另一种方法,是设置以下两个环境:
- 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 选项。设置环境后,启动以下命令:
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:ServicePointManager不支持使用https协议的代理。
或者,如果是SOCKS代理:
invoke-WebRequest:ServicePointManager不支持使用socks协议的代理。
在PowerShell 7.x中处理HTTPS或SOCKS代理时,Invoke-WebRequest命令结构保持不变:
Invoke-WebRequest -Proxy "<PROTOCOL>://[<USERNAME>:<PASSWORD>]@<HOST>[:<PORT>]" <Uri>
变化的是:
如果您尝试通过代理调用请求,而代理使用的是上述协议以外的协议,就会得到这个错误:
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在不使用代理的情况下联系
要验证此方法是否有效,请在环境中设置代理并运行:
Invoke-WebRequest -NoProxy "https://httpbin.org/ip"
生成的源将包含您的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,具有高度的匿名性。如要访问专为移动设备而设计的应用程序、网站或内容,它们非常有用。
这只是一个简短的总结,您可以在我们的代理IP类型指南中阅读更多信息。
结语
在本PowerShell代理指南中,您了解了Invoke-WebRequest是什么、如何工作,以及如何通过HTTP/HTTPS/SOCKS代理使用。事实证明,免费提供商提供的代理是不能依赖的。因此,唯一要做出的决定就是应该选用哪个代理提供商。要节省时间和精力,请选择市面上最好的服务提供商Bright Data。
Bright Data管控的代理服务器是全球最好的,目前正在为一些财富500强企业和超过20000家客户提供服务。其全球代理网络包括:
- 数据中心代理 – 超过77万个数据中心IP。
- 住宅代理 – 超过7200万个住宅IP,位于超过195 个国家/地区。
- ISP代理 – 超过70万个ISP IP。
- 移动代理 – 超过700万个移动 IP。
总体而言,这是市面上最大、最可靠的抓取导向代理网络之一。