PowerShell, Windows ortamında HTTP istekleri göndermek için güçlü yerleşik cmdlet'ler sunar. Ancak PowerShell'de proxy kullanımı konusu çoğu kılavuzda yüzeysel ele alınır: -Proxy parametresini eklersiniz ve çalışır. Gerçekte ise veri merkezini engelleyen API'ler, CAPTCHA'lar, rate-limit'ler ve geo-hedefleme ihtiyaçları işi karmaşıklaştırır. Bu rehber, Invoke-WebRequest ve Invoke-RestMethod ile residential proxy'leri üretim seviyesinde nasıl kullanacağınızı kod örnekleriyle anlatır.
İster PowerShell web scraping yapıyor olun, ister bir REST API'yi otomatikleştiriyor olun, doğru proxy konfigürasyonu başarı oranınızı %50'den %99'a çıkarabilir. ProxyHat'ın gate.proxyhat.com:8080 HTTP endpoint'ini ve :1080 SOCKS5 endpoint'ini kullanarak başlayalım.
PowerShell'de Proxy Kullanımı: Temel Parametreler
Invoke-WebRequest proxy ve Invoke-RestMethod proxy yapılandırması için üç temel parametre kullanılır:
-Proxy <Uri>— Proxy sunucusunun URL'si (örneğinhttp://gate.proxyhat.com:8080).-ProxyCredential <PSCredential>— Proxy kimlik doğrulaması için kullanıcı adı/şifre.-ProxyUseDefaultCredentials— Windows kimlik doğrulaması için sistem kimlik bilgilerini kullanır.
En basit örnek:
# Basit proxy ile istek
echo $response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential (Get-Credential)
echo $response.Content
# Çıktı: { "origin": "198.23.x.x" }
Get-Credential interaktif bir pencere açar. Otomasyon için kimlik bilgilerini kod içinde oluşturmanız gerekir — bunu bir sonraki bölümde ele alacağız.
ProxyUseDefaultCredentials Ne Zaman Kullanılır?
Bu parametre yalnızca NTLM/Kerberos kimlik doğrulaması gerektiren kurumsal proxy'ler için anlamlıdır. ProxyHat gibi dış proxy servisleri için -ProxyCredential kullanmanız gerekir.
Kimlik Bilgilerini Kodda Oluşturma ve Geo-Hedefleme
ProxyHat, geo-targeting ve sticky session parametrelerini kullanıcı adı içine gömer. Örneğin ABD IP'leri için user-country-US, Berlin IP'leri için user-country-DE-city-berlin kullanılır. Sticky session için user-session-abc123 formatı geçerlidir.
# Kimlik bilgilerini kod içinde oluştur
$proxyUser = 'user-country-US-session-abc123'
$proxyPass = 'your_password'
$securePass = ConvertTo-SecureString $proxyPass -AsPlainText -Force
$proxyCred = New-Object System.Management.Automation.PSCredential($proxyUser, $securePass)
echo $response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred
echo $response.Content
Bu yaklaşımla her istekte farklı bir ülke veya session belirleyebilirsiniz. Örneğin 5 farklı ülkeden paralel istek göndermek için kullanıcı adını döngü içinde değiştirmeniz yeterlidir.
[System.Net.WebProxy] ile Daha İnce Kontrol
Yerleşik cmdlet'ler yeterli olmadığında, doğrudan System.Net.Http.HttpClient veya System.Net.WebClient kullanabilirsiniz. Bu durumda System.Net.WebProxy nesnesi oluşturmanız gerekir:
# WebProxy nesnesi ile HttpClient üzerinden proxy
$proxy = New-Object System.Net.WebProxy('http://gate.proxyhat.com:8080')
$proxy.Credentials = New-Object System.Net.NetworkCredential('user-country-DE', 'your_password')
$handler = New-Object System.Net.Http.HttpClientHandler
$handler.Proxy = $proxy
$handler.UseProxy = $true
$client = New-Object System.Net.Http.HttpClient($handler)
echo $response = $client.GetAsync('https://httpbin.org/ip').Result
echo $response.Content.ReadAsStringAsync().Result
Bu yöntem, Invoke-WebRequest'ın desteklemediği TLS ayarları, connection pooling veya özel header manipülasyonu gerektiğinde kullanışlıdır. Microsoft'un Invoke-WebRequest dokümantasyonu, -Proxy parametresinin yalnızca HTTP/HTTPS proxy'leri desteklediğini belirtir.
Oturum (Session) Kalıcılığı: Cookie ve Header Yönetimi
Birçok web sitesi, giriş yaptıktan sonra session cookie'sini kontrol eder. Invoke-WebRequest, -SessionVariable parametresiyle bir WebRequestSession nesnesi oluşturur ve sonraki isteklerde -WebSession ile bu oturumu yeniden kullanabilirsiniz.
# Session ile login ve takip eden istek
$proxyCred = New-Object System.Management.Automation.PSCredential(
'user-country-US-session-login01',
(ConvertTo-SecureString 'your_password' -AsPlainText -Force)
)
echo $loginResponse = Invoke-WebRequest -Uri 'https://example.com/login' `
-Method Post `
-Body @{ username = 'testuser'; password = 'testpass' } `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred `
-SessionVariable session `
-UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
echo $pageResponse = Invoke-WebRequest -Uri 'https://example.com/dashboard' `
-WebSession $session `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred
echo $pageResponse.StatusCode # 200
-Headers parametresiyle ek header'lar ekleyebilirsiniz. Örneğin Accept-Language veya X-Requested-With:
$headers = @{
'Accept-Language' = 'en-US,en;q=0.9'
'X-Requested-With' = 'XMLHttpRequest'
}
echo $resp = Invoke-RestMethod -Uri 'https://api.example.com/data' `
-Headers $headers `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred `
-WebSession $session
Oturumu korurken proxy kullanıcı adındaki session-xxx kısmının sabit kalmasına dikkat edin — aksi halde IP değişir ve sunucu oturumu geçersiz sayabilir.
Neden Residential Proxy? Veri Merkezi Engelleri ve Sayfalama Örneği
AWS, Azure ve Google Cloud IP aralıkları genellikle bilinen veri merkezleri olarak işaretlenir. Birçok e-ticaret sitesi, SERP API'si veya sosyal medya platformu bu aralıkları proaktif olarak engeller. Wikipedia'ya göre residential proxy'ler, gerçek İSS'lere atanmış IP'ler kullanır ve bu nedenle normal kullanıcı trafiğinden ayırt edilmesi çok daha zordur.
Aşağıdaki örnek, bir JSON API'yi sayfa sayfa tararken her sayfada farklı bir sticky session kullanır. -MaximumRetryCount ve -RetryIntervalSec ile otomatik yeniden deneme yapılır:
# Sayfalama + session rotasyonu + retry/backoff
$baseProxyUser = 'user-country-US'
$proxyPass = 'your_password'
$apiUrl = 'https://api.example.com/products'
$page = 1
$allResults = @()
while ($true) {
$sessionName = "sess-page-$page-$(Get-Random)"
$proxyUser = "$baseProxyUser-session-$sessionName"
$proxyCred = New-Object System.Management.Automation.PSCredential(
$proxyUser,
(ConvertTo-SecureString $proxyPass -AsPlainText -Force)
)
try {
echo $data = Invoke-RestMethod -Uri "$apiUrl?page=$page" `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred `
-MaximumRetryCount 3 `
-RetryIntervalSec 5 `
-Headers @{ 'Accept' = 'application/json' }
if ($data.items.Count -eq 0) { break }
$allResults += $data.items
echo "Sayfa $page: $($data.items.Count) kayıt alındı"
$page++
Start-Sleep -Milliseconds 800 # Rate-limit'e takılmamak için
} catch {
echo "Sayfa $page başarısız: $($_.Exception.Message)"
Start-Sleep -Seconds 10
# Aynı sayfayı tekrar dene, yeni session ile
continue
}
}
echo "Toplam $($allResults.Count) kayıt toplandı."
Bu örnekte her sayfa için yeni bir session ID üretilir; böylece her sayfa farklı bir residential IP'den gelir. -MaximumRetryCount 3 ve -RetryIntervalSec 5 kombinasyonu, geçici 429 veya 503 hatalarını otomatik olarak yeniden dener. try/catch bloğu ise kalıcı hatalarda 10 saniye bekleyip aynı sayfayı yeni session ile tekrar dener.
Proxy Türleri Karşılaştırması
| Özellik | Residential | Datacenter | Mobile |
|---|---|---|---|
| Tespit edilme riski | Düşük | Yüksek | Çok düşük |
| Hız (ortalama) | 200–800ms | 50–200ms | 300–1200ms |
| Fiyat | Orta | Düşük | Yüksek |
| Ban yeme olasılığı | %5–10 | %40–60 | %1–3 |
| Uygun kullanım | SERP, e-ticaret, sosyal medya | Bulk veri çekme, hız kritik | Mobil uygulama testi |
ProxyHat, üç proxy türünü de destekler. Fiyatlandırma sayfasını inceleyerek ihtiyacınıza uygun planı seçebilirsiniz.
Üretim İpuçları: Ortam Değişkenleri, TLS ve Paralellik
$env:HTTPS_PROXY ile Alt Süreçler
PowerShell'den çağırdığınız alt süreçler (örneğin curl veya Node.js script'leri) ortam değişkenlerinden proxy'yi okuyabilir:
# Ortam değişkenleri ile proxy ayarla
$env:HTTP_PROXY = 'http://user-country-US:your_password@gate.proxyhat.com:8080'
$env:HTTPS_PROXY = 'http://user-country-US:your_password@gate.proxyhat.com:8080'
# Artık curl alt süreçleri proxy'yi otomatik kullanır
echo $result = curl.exe -s 'https://httpbin.org/ip'
echo $result
TLS Sürümünü Sabitleme
Eski Windows sürümlerinde PowerShell, varsayılan olarak TLS 1.0 kullanabilir. Modern API'ler genellikle TLS 1.2+ gerektirir. PowerShell 5.1'de bunu manuel ayarlamanız gerekir:
# TLS 1.2'yi zorla (PowerShell 5.1)
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
echo $resp = Invoke-WebRequest -Uri 'https://api.example.com' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred
PowerShell 7+ (.NET Core tabanlı) bu ayarı otomatik yapar, ancak yine de kontrol etmek iyi bir pratiktir.
ForEach-Object -Parallel ile Paralel İstekler
PowerShell 7'nin -Parallel parametresi, birden fazla URL'yi eşzamanlı olarak taramak için idealdir:
# PowerShell 7: Paralel scraping
$urls = 1..20 | ForEach-Object { "https://api.example.com/products?page=$_" }
$results = $urls | ForEach-Object -Parallel {
$page = $_ -replace '.*page=', ''
$proxyUser = "user-country-US-session-par-$page"
$proxyCred = New-Object System.Management.Automation.PSCredential(
$proxyUser,
(ConvertTo-SecureString $using:proxyPass -AsPlainText -Force)
)
try {
$data = Invoke-RestMethod -Uri $_ `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred `
-MaximumRetryCount 3 `
-RetryIntervalSec 3
[PSCustomObject]@{ Page = $page; Count = $data.items.Count }
} catch {
[PSCustomObject]@{ Page = $page; Error = $_.Exception.Message }
}
} -ThrottleLimit 10
$results | Format-Table
-ThrottleLimit 10 ile aynı anda en fazla 10 istek gönderilir. Her thread kendi session kimlik bilgisini oluşturur, böylece IP rotasyonu otomatik gerçekleşir. $using: scope modifikatörü ile dış skoptaki değişkenleri paralel blok içine taşıyabilirsiniz.
Etik ve Yasal Hususlar
Proxy kullanırken etik sınırlara dikkat etmek zorunludur. Yalnızca herkese açık verileri çekin. ABD'de Computer Fraud and Abuse Act (CFAA), yetkisiz erişimi suç sayar. AB'de ise GDPR, kişisel verilerin işlenmesini sıkı kurallara bağlar.
- Önce hedef platformun resmi API'sini kontrol edin — çoğu zaman proxy'ye ihtiyaç yoktur.
robots.txtdosyasına ve kullanım şartlarına saygı gösterin.- Rate-limit aşmayın; istekler arasına gecikme koyun.
- Kişisel verileri toplamayın veya saklamayın (GDPR kapsamında).
- Sadece herkese açık sayfalardan veri çekin.
ProxyHat, web scraping ve SERP takibi için uygun altyapı sunar. Mevcut lokasyonları kontrol edebilir veya ProxyHat dokümantasyonunu inceleyebilirsiniz. ProxyHat SDK'sı da aynı gate.proxyhat.com endpoint'lerini kullanır.
Key Takeaways
-Proxyve-ProxyCredentialparametreleri çoğu senaryo için yeterlidir;System.Net.WebProxydaha ince kontrol sağlar.- Geo-targeting ve sticky session parametreleri kullanıcı adına gömülür:
user-country-US-session-abc123.-SessionVariableve-WebSessionile cookie'ler istekler arasında korunur.- Residential proxy'ler, veri merkezi IP'lerini engelleyen API'ler için gereklidir; ban oranını %40–60'tan %5–10'a düşürür.
-MaximumRetryCountve-RetryIntervalSecile otomatik yeniden deneme yapın;try/catchile kalıcı hataları yönetin.- PowerShell 7'nin
ForEach-Object -Parallelile-ThrottleLimit 10kombinasyonu, yüksek hacimli taramalar için idealdir.- Etik kurallara uyun: resmi API'leri önce deneyin,
robots.txt'ye saygı gösterin, CFAA ve GDPR'ye dikkat edin.
PowerShell'de proxy kullanımı, doğru araçlarla karmaşık değildir. Invoke-WebRequest ve Invoke-RestMethod'in yerleşik parametreleri çoğu senaryoyu kapsar; System.Net.WebProxy ve paralel yapılar ise gelişmiş ihtiyaçlar içindir. ProxyHat'ın residential altyapısı ile %99 başarı oranına ulaşmak mümkündür — başlamak için fiyatlandırma sayfasını ziyaret edin.






