PowerShellのInvoke-WebRequestでプロキシを使用する方法
Expert Network Defense Engineer
セキュアで匿名のウェブリクエストのためにPowerShellプロキシ設定をマスターしましょう。トラフィックを住宅用プロキシを通してルーティングし、地理的制限を回避し、IPブロッキングを防ぎます。
主なポイント
- Invoke-WebRequestの-Proxyパラメーターは、トラフィックをプロキシサーバーを介してルーティングします
- PowerShell 7.xはHTTPSおよびSOCKSプロキシをサポートしています;以前のバージョンはHTTPのみをサポートします
- ProxyCredentialパラメーターは、プロキシがログイン資格情報を必要とする場合の認証を処理します
- 住宅用プロキシは、IPベースのブロッキングを回避する正当なISP割り当てのIPを提供します
- セッションオブジェクトは、複数のリクエスト間でプロキシ設定を自動的に維持します
Invoke-WebRequestプロキシの理解
Invoke-WebRequestは、HTTPおよびHTTPSリクエストを行うためのPowerShellのネイティブコマンドレットです。-Proxyパラメーターは、ターゲットウェブサイトに直接接続するのではなく、指定されたプロキシサーバーを介してリクエストをルーティングします。この機能により、スクリプトは次のことが可能になります:
- 特定の場所からの地理的に制限されたコンテンツへのアクセス
- 複数のIPにリクエストを分散させ、レート制限を回避
- ターゲットウェブサイトからスクリプトの起源を隠す
- 企業プロキシを介したネットワーク接続をテスト
プロキシパラメーターは、次の形式のURLを受け入れます: <PROTOCOL>://<HOST>:<PORT>
基本的なHTTPプロキシ設定
最も簡単なプロキシ設定は、HTTPアドレスとポートを指定します:
powershell
$proxyUrl = "http://47.252.29.28:11222"
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" -Proxy $proxyUrl
Write-Output $response.Content
このコマンドは、指定されたプロキシサーバーを介してリクエストをルーティングします。ターゲットウェブサイトは、あなたのコンピューターのIPではなく、プロキシのIPアドレスからのリクエストを受け取ります。
プロキシ認証
多くのプロキシプロバイダーは、不正使用を防ぐために認証を必要とします。-ProxyCredentialパラメーターは、ユーザー名とパスワードを渡します:
powershell
$proxyUrl = "http://proxy.example.com:8080"
$proxyCreds = Get-Credential
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" `
-Proxy $proxyUrl `
-ProxyCredential $proxyCreds
Get-Credentialは、資格情報を要求する対話型プロンプトを開きます。自動化されたスクリプトでは、プログラム的に資格情報を作成します:
powershell
$username = "proxy_user"
$password = "proxy_password"
$secPassword = ConvertTo-SecureString $password -AsPlainText -Force
$proxyCreds = New-Object System.Management.Automation.PSCredential `
-ArgumentList $username, $secPassword
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" `
-Proxy "http://proxy.example.com:8080" `
-ProxyCredential $proxyCreds
組み込み資格情報プロキシURL
代わりに、資格情報をプロキシURLに直接埋め込むこともできます:
powershell
$proxyUrl = "http://username:password@proxy.example.com:8080"
$response = Invoke-WebRequest -Uri "https://httpbin.io/ip" -Proxy $proxyUrl
このアプローチは、資格情報管理がそれほど重要でないスクリプトに便利です。
HTTPSおよびSOCKSプロキシのサポート
PowerShell 7.x+はHTTPSおよびSOCKSプロキシのサポートを追加します。以前のバージョンを使用している場合、HTTPプロキシのみが機能します。完全なプロキシプロトコルのサポートのためにPowerShell 7にアップデートしてください:
powershell
# HTTPSプロキシ
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "https://username:password@proxy.example.com:8080"
# SOCKS5プロキシ
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "socks5://username:password@proxy.example.com:1080"
PowerShellバージョンを確認するには:
powershell
$PSVersionTable.PSVersion
プロキシローテーション戦略
大規模なスクレイピングやAPI呼び出しのために、複数のプロキシ間でローテーションすることで、リクエストを異なるIPに分散させ、レート制限やIP禁止を回避します:
powershell
$proxyList = @(
"http://user:pass@proxy1.example.com:8080",
"http://user:pass@proxy2.example.com:8080",
"http://user:pass@proxy3.example.com:8080"
)
$urls = @(
"https://api.example.com/page1",
"https://api.example.com/page2",
"https://api.example.com/page3"
)
foreach ($url in $urls) {
$randomProxy = $proxyList | Get-Random
$response = Invoke-WebRequest -Uri $url -Proxy $randomProxy
Write-Output "$urlからの$responseは$randomProxyを使用しています"
}
このアプローチは、リクエストごとに異なるプロキシをランダムに選択し、ブロックを引き起こすIPごとのリクエスト蓄積を防ぎます。
PowerShellを使用したプレミアム住宅用プロキシ
Scrapeless Residential Proxiesは、PowerShell自動化のためのプロフェッショナルグレードのプロキシインフラを提供します。住宅用プロキシは正当なISP割り当てのIPを使用し、保護されたウェブサイトに対する成功率を大幅に向上させます。
powershell
# 認証付きScrapeless住宅用プロキシ
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"
$headers = @{
'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy $proxyUrl `
-Headers $headers
Write-Output $response.StatusCode
Scrapelessは、195以上の国で9000万以上の住宅用IPを管理し、自動ローテーションと地理的ターゲティングを提供しています。
セッションベースのプロキシ設定
関連する複数のリクエストの場合、セッションオブジェクトが自動的にプロキシ設定を保持します。
powershell
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"
$webSession = New-Object Microsoft.PowerShell.Commands.WebRequestSession
$webSession.Proxy = New-Object System.Net.WebProxy($proxyUrl)
# 最初のリクエスト
$response1 = Invoke-WebRequest -Uri "https://example.com/page1" `
-WebSession $webSession
# 2回目のリクエストは自動的に同じプロキシを使用
$response2 = Invoke-WebRequest -Uri "https://example.com/page2" `
-WebSession $webSession
# 3回目のリクエストも同じプロキシ設定を使用
$response3 = Invoke-WebRequest -Uri "https://example.com/page3" `
-WebSession $webSession
セッションオブジェクトは、連続リクエストのための反復的なプロキシ指定を排除します。
プロキシバイパスリスト
一部の環境では、特定のホストへの直接接続が必要であり、プロキシをバイパスします。直接アクセスのためにバイパスリストを定義します。
powershell
$proxy = New-Object System.Net.WebProxy("http://proxy.example.com:8080")
$proxy.BypassList += "*.internal.company.com"
$proxy.BypassList += "localhost"
[System.Net.WebRequest]::DefaultWebProxy = $proxy
$response = Invoke-WebRequest -Uri "https://internal.company.com"
バイパスされたホストは、プロキシサーバーを経由せずに直接接続されます。
SSL証明書エラーの処理
一部のプロキシ設定や自己署名証明書はSSLエラーを引き起こします。テスト目的で、証明書の検証をスキップします。
powershell
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "http://proxy.example.com:8080"
警告: 証明書の検証を無効にすると、中間者攻撃にさらされる危険があります。制御された環境でのみ使用してください。
PowerShell 7.4+は、より安全な -SkipCertificateCheck パラメータを提供します。
powershell
$response = Invoke-WebRequest -Uri "https://example.com" `
-Proxy "http://proxy.example.com:8080" `
-SkipCertificateCheck
応用例: プロキシを利用したウェブスクレイピング
住宅用プロキシを適切なヘッダーと遅延と組み合わせて、効果的なウェブスクレイピングを実現します。
powershell
function Invoke-ScrapingRequest {
param(
[Parameter(Mandatory=$true)]
[string]$Url,
[Parameter(Mandatory=$true)]
[string]$ProxyUrl,
[int]$DelayMs = 2000
)
$headers = @{
'User-Agent' = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
'Accept' = 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
'Accept-Language' = 'en-US,en;q=0.9'
}
Start-Sleep -Milliseconds $DelayMs
$response = Invoke-WebRequest -Uri $Url `
-Proxy $ProxyUrl `
-Headers $headers `
-ErrorAction SilentlyContinue
return $response
}
# 使用例
$proxyUrl = "http://user:pass@superproxy.scrapeless.com:1337"
$response = Invoke-ScrapingRequest -Url "https://example.com" -ProxyUrl $proxyUrl
このパターンは、リクエスト間の遅延、正当なブラウザを模倣するヘッダー、住宅用プロキシのローテーションを実装し、信頼性の高い大規模なスクレイピングを実現します。
プロキシ問題のトラブルシューティング
接続拒否: プロキシホストとポートを確認します。直接接続のテスト:
powershell
Test-NetConnection -ComputerName "proxy.example.com" -Port 8080
認証失敗: ユーザー名とパスワードが正しいことを確認してください。URLに埋め込まれた資格情報には、特殊文字が含まれている場合、URLエンコードが必要です。
遅いパフォーマンス: 利用可能な場合は、異なるプロキシを試してください。一部のプロキシは地理的に遠いか、混雑しています。
プロキシが使用されていない: Invoke-WebRequest が -Proxy パラメーターを使用していることを確認してください。環境変数やシステムプロキシ設定は自動的に Invoke-WebRequest に影響を与えません。
環境変数プロキシ
PowerShell 7.x+ は、設定されている場合に HTTP_PROXY および HTTPS_PROXY 環境変数を尊重します:
powershell
$env:HTTP_PROXY = "http://proxy.example.com:8080"
$env:HTTPS_PROXY = "http://proxy.example.com:8080"
$response = Invoke-WebRequest -Uri "https://example.com"
以前のPowerShellバージョンは環境変数を無視します—明示的に -Proxy パラメーターを指定してください。
プロキシを通じたREST API呼び出し
似たような Invoke-RestMethod コマンドレットも、JSON API呼び出しのために -Proxy パラメーターを受け入れます:
powershell
$proxyUrl = "http://username:password@superproxy.scrapeless.com:1337"
$response = Invoke-RestMethod -Uri "https://api.example.com/data" `
-Proxy $proxyUrl `
-Method Get
$response | ConvertTo-Json
よくある質問
Q: プロキシを指定せずに Invoke-WebRequest を使用できますか?
A: はい。ダイレクト接続の場合は -Proxy パラメーターを省略してください。ただし、これにより実際のIPアドレスが露出し、地理的制限やレート制限を回避できなくなります。
Q: プロキシを経由して何件の同時 Invoke-WebRequest 呼び出しを行えますか?
A: PowerShellは、システムリソースに基づいて同時操作を制限します。ほとんどのスクリプトは、成功裏に10-50の並列リクエストを実行しています。Scrapelessのようなプレミアム住宅プロキシは、プロキシインフラストラクチャレベルで無制限の同時接続をサポートしています。
Q: -Proxy パラメーターと -ProxyCredential パラメーターの違いは何ですか?
A: -Proxy パラメーターはプロキシサーバーのアドレスを指定します。 -ProxyCredential パラメーターは、URLとは別に認証資格情報を提供します。これは、特殊文字を含む資格情報がURLエンコードを必要とする場合に便利です。
Q: Invoke-WebRequest にプロキシを使用するために管理者権限が必要ですか?
A: いいえ。プロキシの使用にはプロキシサーバーへのネットワーク接続のみが必要です。標準的なプロキシ操作には管理者特権は必要ありません。
Q: Invoke-WebRequest はWindows PowerShell 5.1でSOCKSプロキシで動作しますか?
A: いいえ。Windows PowerShell 5.1はHTTPプロキシのみをサポートしています。SOCKSプロキシのサポートにアクセスするにはPowerShell 7.xにアップグレードしてください。公式のMicrosoftリポジトリからPowerShell 7をダウンロードすると、Windows PowerShellと並行してインストールされ、競合はありません。
Scrapelessでは、適用される法律、規制、およびWebサイトのプライバシーポリシーを厳密に遵守しながら、公開されているデータのみにアクセスします。 このブログのコンテンツは、デモンストレーションのみを目的としており、違法または侵害の活動は含まれません。 このブログまたはサードパーティのリンクからの情報の使用に対するすべての責任を保証せず、放棄します。 スクレイピング活動に従事する前に、法律顧問に相談し、ターゲットウェブサイトの利用規約を確認するか、必要な許可を取得してください。



