PowerShell'de Proxy Kullanımı Neden Gereklidir?
PowerShell, Windows yöneticileri ve otomasyon mühendisleri için günlük iş akışlarının merkezinde yer alır. PowerShell'de proxy kullanımı, özellikle web scraping, API entegrasyonu ve SERP takibi gibi görevlerde kritik bir yetkinlik haline gelmiştir. Birçok modern endpoint, Azure veya AWS verimerkezi IP aralıklarını otomatik olarak engeller ve bu durum PowerShell betiklerinizi beklenmedik şekilde başarısız kılabilir.
Bu rehberde, Invoke-WebRequest ve Invoke-RestMethod cmdlet'leri ile ProxyHat residential proxy'lerini nasıl entegre edeceğinizi kod odaklı bir yaklaşımla göstereceğiz. Temel -Proxy parametresinden başlayıp, geo-targeting, sticky session, retry/backoff ve paralel isteklere kadar tüm üretim senaryolarını ele alacağız.
Teknik Bağlam: PowerShell'in HTTP Yığını ve Proxy Mekanizması
PowerShell 5.1, .NET Framework üzerinde System.Net.HttpWebRequest kullanırken; PowerShell 7.x, System.Net.Http.HttpClient üzerine inşa edilmiştir. Her iki sürüm de Invoke-WebRequest ve Invoke-RestMethod cmdlet'lerinde ortak proxy parametreleri sunar. Bu parametreler, underlying HTTP istemcisinin proxy yapılandırmasını doğrudan kontrol eder.
PowerShell'in proxy desteği üç temel mekanizmaya dayanır:
- -Proxy: Proxy URL'sini belirtir (örn.
http://gate.proxyhat.com:8080) - -ProxyCredential: Proxy kimlik doğrulaması için
PSCredentialnesnesi - -ProxyUseDefaultCredentials: Windows oturum kimlik bilgilerini kullanır
Residential proxy'ler, gerçek ISP'lere ait IP adresleri kullandığı için hedef sitelerin anti-bot sistemlerini datacenter IP'lere kıyasla çok daha az tetikler. Microsoft'un resmi Invoke-WebRequest dokümantasyonuna göre, -Proxy parametresi HTTP, HTTPS ve FTP istekleri için proxy sunucusunu yapılandırır.
1. Temel Proxy Parametreleri: İlk İsteğiniz
En basit haliyle, ProxyHat gateway'ine bir istek göndermek şu kadar kısadır:
# Temel proxy ile bir istek gönderme
$proxyUrl = 'http://gate.proxyhat.com:8080'
$proxyCred = Get-Credential # Kullanıcı adı ve şifre girin
$response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy $proxyUrl `
-ProxyCredential $proxyCred `
-Method Get
Write-Host $response.Content
Bu örnek, proxy üzerinden httpbin.org/ip endpoint'ine bir GET isteği gönderir ve dönen IP adresini gösterir. Get-Credential, Windows Credential Manager ile entegre çalışır ve şifrenizi düz metin olarak betiğinizde saklamanızı önler.
Eğer proxy kimlik doğrulaması gerektirmiyorsa veya sistem kimlik bilgileriniz yeterliyse:
# Varsayılan Windows kimlik bilgileri ile
$response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyUseDefaultCredentials
Write-Host $response.Content
2. Geo-Targeting ve Sticky Session'lar
ProxyHat, kullanıcı adı alanında geo-targeting ve session flag'leri destekler. Bu, user-country-US veya user-session-abc123 gibi desenlerle gerçekleştirilir. PowerShell'de bunu bir PSCredential nesnesine dönüştürmeniz gerekir.
Geo-Targeting ile Ülke Seçimi
# Geo-targeting: ABD IP'si ile istek
$proxyUser = 'user-country-US'
$proxyPass = 'SIFRENIZ'
$securePass = ConvertTo-SecureString $proxyPass -AsPlainText -Force
$proxyCred = New-Object System.Management.Automation.PSCredential($proxyUser, $securePass)
$response = Invoke-WebRequest -Uri 'https://httpbin.org/ip' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred
Write-Host $response.Content # ABD IP'si döner
Sticky Session ile Aynı IP'yi Koruma
Birçok senaryoda (örn. çok adımlı oturumlar), aynı IP adresini birden fazla istekte korumanız gerekir:
# Sticky session: aynı IP'yi koru
$sessionId = 'mySession-' + (Get-Date -Format 'yyyyMMddHHmmss')
$proxyUser = "user-session-$sessionId"
$securePass = ConvertTo-SecureString 'SIFRENIZ' -AsPlainText -Force
$proxyCred = New-Object System.Management.Automation.PSCredential($proxyUser, $securePass)
# Aynı session ile birden fazla istek
$ip1 = (Invoke-WebRequest -Uri 'https://httpbin.org/ip' -Proxy 'http://gate.proxyhat.com:8080' -ProxyCredential $proxyCred).Content
$ip2 = (Invoke-WebRequest -Uri 'https://httpbin.org/ip' -Proxy 'http://gate.proxyhat.com:8080' -ProxyCredential $proxyCred).Content
Write-Host "İstek 1: $ip1"
Write-Host "İstek 2: $ip2" # Aynı IP olmalı
WebProxy Nesnesi ile Daha İnce Kontrol
Daha karmaşık senaryolarda, System.Net.WebProxy nesnesi oluşturup underlying HttpClient üzerinde doğrudan kontrol sahibi olabilirsiniz:
# System.Net.WebProxy ile ince ayar
$webProxy = New-Object System.Net.WebProxy('http://gate.proxyhat.com:8080', $true)
$proxyUser = 'user-country-DE-city-berlin'
$securePass = ConvertTo-SecureString 'SIFRENIZ' -AsPlainText -Force
$cred = New-Object System.Management.Automation.PSCredential($proxyUser, $securePass)
$webProxy.Credentials = $cred.GetNetworkCredential()
# HttpClientHandler ile kullanım (PowerShell 7)
Add-Type -AssemblyName System.Net.Http
$handler = New-Object System.Net.Http.HttpClientHandler
$handler.Proxy = $webProxy
$handler.UseProxy = $true
$client = New-Object System.Net.Http.HttpClient($handler)
$response = $client.GetAsync('https://httpbin.org/ip').Result
Write-Host $response.Content.ReadAsStringAsync().Result
3. Cookie ve Header Kalıcılığı: WebRequestSession
Web scraping sırasında, oturum çerezlerini ve özel header'ları birden fazla istekte korumak sıkça gerekir. PowerShell, -SessionVariable ve -WebSession parametreleri ile bunu destekler.
# SessionVariable ile cookie kalıcılığı
$proxyCred = New-Object System.Management.Automation.PSCredential(
'user-country-US',
(ConvertTo-SecureString 'SIFRENIZ' -AsPlainText -Force)
)
# İlk istek: session oluştur
$firstResponse = Invoke-WebRequest -Uri 'https://httpbin.org/cookies/set?token=abc123' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred `
-SessionVariable session `
-UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' `
-Headers @{ 'Accept' = 'application/json' } `
-MaximumRedirection 0 -ErrorAction SilentlyContinue
# İkinci istek: aynı session ve header'ları kullan
$secondResponse = Invoke-WebRequest -Uri 'https://httpbin.org/cookies' `
-Proxy 'http://gate.proxyhat.com:8080' `
-ProxyCredential $proxyCred `
-WebSession $session `
-UserAgent 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
Write-Host $secondResponse.Content # token=abc123 çerezi görünür olmalı
Önemli: -SessionVariable ile oluşturulan WebRequestSession nesnesi, çerezleri, header'ları ve sertifika ayarlarını otomatik olarak sonraki isteklere taşır. Bu, oturum tabanlı web sitelerinde scraping yaparken kritik bir avantajdır.
4. Residential Proxy'ler Neden Gereklidir: Datacenter Engelleri
Birçok modern web servisi, Cloudflare veya AWS WAF gibi araçlar aracılığıyla datacenter IP aralıklarını otomatik engeller. Azure'da çalışan bir PowerShell betiği, hedef siteya erişmeye çalıştığında 403 Forbidden veya 429 Too Many Requests hatası alabilir. Residential proxy'ler, gerçek ISP IP'leri kullandığı için bu engelleri aşmada çok daha etkilidir.
JSON API Sayfalama Örneği: Invoke-RestMethod ile
Aşağıdaki örnek, bir JSON API'sini sayfalama yaparak tarar, her sayfada yeni bir sticky session kullanır ve retry/backoff uygular:
# Invoke-RestMethod ile sayfalama, session rotasyonu ve retry
$baseUrl = 'https://api.example.com/items'
$proxyHost = 'http://gate.proxyhat.com:8080'
$proxyPass = 'SIFRENIZ'
$page = 1
$allItems = @()
while ($true) {
# Her sayfa için yeni session (yeni IP)
$sessionId = "page-$page-" + [System.Guid]::NewGuid().ToString().Substring(0, 8)
$proxyUser = "user-country-US-session-$sessionId"
$securePass = ConvertTo-SecureString $proxyPass -AsPlainText -Force
$proxyCred = New-Object System.Management.Automation.PSCredential($proxyUser, $securePass)
$uri = "$baseUrl`?page=$page&per_page=100"
try {
$data = Invoke-RestMethod -Uri $uri `
-Proxy $proxyHost `
-ProxyCredential $proxyCred `
-Method Get `
-Headers @{ 'Accept' = 'application/json' } `
-MaximumRetryCount 3 `
-RetryIntervalSec 5 `
-TimeoutSec 30
if ($data.items.Count -eq 0) {
Write-Host "Sayfa $page: veri yok, duruyor."
break
}
$allItems += $data.items
Write-Host "Sayfa $page: $($data.items.Count) kayıt alındı (toplam: $($allItems.Count))"
$page++
Start-Sleep -Milliseconds 500 # Hedef sunucuya nazik davran
} catch [System.Net.WebException] {
$status = $_.Exception.Response.StatusCode
if ($status -eq 429) {
Write-Warning "Rate limit (429). 10 saniye bekleniyor..."
Start-Sleep -Seconds 10
continue # Aynı sayfayı tekrar dene
} elseif ($status -eq 403) {
Write-Error "Yasak (403). Session değiştiriliyor..."
continue # Yeni session ile tekrar dene
} else {
Write-Error "Hata: $status - $($_.Exception.Message)"
break
}
} catch {
Write-Error "Beklenmeyen hata: $($_.Exception.Message)"
break
}
}
Write-Host "Toplam $($allItems.Count) kayıt toplandı."
Bu örnekte -MaximumRetryCount 3 ve -RetryIntervalSec 5 parametreleri, PowerShell 7.x'te yerleşik retry mekanizmasını etkinleştirir. Her sayfa için yeni bir sticky session oluşturulur, böylece her sayfa farklı bir residential IP'den gelir.
5. Üretim İpuçları
Ortam Değişkenleri ile Alt Süreçlere Proxy Aktarımı
PowerShell betiğinizden başlattığınız alt süreçlerin (örn. curl, node) de aynı proxy'yi kullanmasını sağlamak için ortam değişkenlerini ayarlayın:
# Ortam değişkenleri ile proxy aktarımı
$env:HTTP_PROXY = 'http://user-country-US:SIFRENIZ@gate.proxyhat.com:8080'
$env:HTTPS_PROXY = 'http://user-country-US:SIFRENIZ@gate.proxyhat.com:8080'
# Artık curl, node vb. alt süreçler proxy'yi otomatik kullanır
curl.exe -s https://httpbin.org/ip
# Temizlik
Remove-Item Env:HTTP_PROXY
Remove-Item Env:HTTPS_PROXY
TLS/SSL Yapılandırması
Eski .NET Framework sürümlerinde TLS 1.2 varsayılan olarak etkin olmayabilir. Modern HTTPS endpoint'leri için TLS 1.2 veya 1.3 gereklidir:
# TLS 1.2 ve 1.3'ü zorla (PowerShell 5.1 için kritik)
[Net.ServicePointManager]::SecurityProtocol = `
[Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls13
# PowerShell 7.x'te bu ayar genellikle varsaylandır,
# ancak yine de kontrol etmek iyi bir pratiktir:
Write-Host "Mevcut TLS: $([Net.ServicePointManager]::SecurityProtocol)"
Mozilla'nın TLS dokümantasyonuna göre, TLS 1.2 ve üzeri modern web güvenliğinin temelidir ve eski protokoller (SSL 3.0, TLS 1.0) artık kullanımdan kaldırılmıştır.
PowerShell 7 ForEach-Object -Parallel ile Paralel İstekler
Büyük ölçekli scraping görevlerinde, paralel istekler performansı dramatik şekilde artırabilir. PowerShell 7'nin -Parallel parametresi ile:
# PowerShell 7: Paralel istekler ile hızlı scraping
$urls = 1..50 | ForEach-Object { "https://api.example.com/items?page=$_&per_page=100" }
$proxyPass = 'SIFRENIZ'
$results = $urls | ForEach-Object -Parallel {
$url = $_
$proxyHost = 'http://gate.proxyhat.com:8080'
$sessionId = "par-$([System.Guid]::NewGuid().ToString().Substring(0,8))"
$proxyUser = "user-country-US-session-$sessionId"
$securePass = ConvertTo-SecureString $using:proxyPass -AsPlainText -Force
$proxyCred = New-Object System.Management.Automation.PSCredential($proxyUser, $securePass)
try {
$data = Invoke-RestMethod -Uri $url `
-Proxy $proxyHost `
-ProxyCredential $proxyCred `
-TimeoutSec 30 `
-MaximumRetryCount 2 `
-RetryIntervalSec 3
[PSCustomObject]@{
Url = $url
Count = $data.items.Count
Success = $true
}
} catch {
[PSCustomObject]@{
Url = $url
Count = 0
Success = $false
Error = $_.Exception.Message
}
}
} -ThrottleLimit 10 # Aynı anda en fazla 10 istek
# Sonuçları özetle
$successCount = ($results | Where-Object { $_.Success }).Count
Write-Host "Başarılı: $successCount / $($urls.Count)"
-ThrottleLimit 10 ile aynı anda en fazla 10 paralel istek gönderilir. Her istek kendi sticky session'ını (ve dolayısıyla kendi IP'sini) kullanır, böylece tek bir IP'ye düşen yük dağıtılır. 50 URL'i sıralı işlemek ~50 saniye sürerken, paralel işlemde bu süre ~5 saniyeye inebilir.
Proxy Türleri Karşılaştırması
| Özellik | Residential | Datacenter | Mobile |
|---|---|---|---|
| IP Kaynağı | Gerçek ISP | Verimerkezi | Mobil operatör |
| Tespit Edilme Riski | Düşük | Yüksek | Çok düşük |
| Hız | Orta (~200ms) | Yüksek (~50ms) | Düşük (~500ms) |
| Fiyat | Orta | Düşük | Yüksek |
| Engellenme Oranı | %5-15 | %40-60 | %1-5 |
| Uygun Senaryo | Web scraping, SERP | Hızlı API çağrıları | Sosyal medya, yüksek güvenlik |
PowerShell web scraping görevleriniz için genellikle residential proxy'ler en iyi dengeyi sunar. ProxyHat, her üç proxy türünü de uygun fiyatlarla sağlar ve tüm türler aynı gateway (gate.proxyhat.com:8080) üzerinden erişilebilir. Mevcut lokasyonları kontrol ederek geo-targeting seçeneklerinizi planlayabilirsiniz.
6. Etik ve Yasal Konular
Web scraping güçlü bir araçtır, ancak etik ve yasal sınırlar içinde kullanılmalıdır:
- Önce resmi API'yi kontrol edin. Birçok platform, scraping'e gerek kalmadan veri erişimi için resmi API sunar. Bu hem daha güvenilir hem de daha hızlıdır.
- Yalnızca herkese açık veri. Giriş gerektiren veya erişim kontrolü olan sayfaları scraping yapmak, ABD'de Computer Fraud and Abuse Act (CFAA) kapsamında yasal risk taşıyabilir.
- GDPR uyumu. AB'den gelen kişisel verileri işliyorsanız, GDPR'nin veri minimizasyonu ve açık rıza ilkelerine uyun.
- robots.txt'a saygı gösterin. Bir sitenin robots.txt dosyası, hangi yolların taranabileceğini belirtir. Bu kurallara uymak iyi bir pratiktir.
- Hız sınırlarına uyun. Hedef sunucuya aşırı yük bindirmek, hem hizmet reddine yol açabilir hem de IP engellenmesine neden olur.
Daha fazla bilgi için ProxyHat dokümantasyonunu inceleyebilir ve web scraping use case sayfamızdan sektör örneklerine bakabilirsiniz. SERP tracking senaryoları için de ayrı bir rehberimiz mevcuttur.
Key Takeaways
-Proxy,-ProxyCredentialve-ProxyUseDefaultCredentialsparametreleri, PowerShell'de proxy kullanımının temelidir.- Geo-targeting ve sticky session'lar, proxy kullanıcı adına flag eklenerek (
user-country-US,user-session-abc123) gerçekleştirilir.-SessionVariableve-WebSessionile çerez ve header kalıcılığı sağlanır; bu oturum tabanlı sitelerde kritiktir.- Residential proxy'ler, datacenter IP engellerini aşmada datacenter proxy'lere göre çok daha etkilidir (%5-15 vs %40-60 engellenme oranı).
-MaximumRetryCountve-RetryIntervalSecile yerleşik retry mekanizması, üretim ortamında güvenilirliği artırır.- PowerShell 7'nin
ForEach-Object -Parallelile paralel istekler, scraping hızını 10 kata kadar artırabilir.- Etik scraping: önce resmi API, sonra herkese açık veri, robots.txt'a saygı ve hız limitlerine uyum.
SSS
PowerShell'de proxy kullanımı nedir?
PowerShell'de proxy kullanımı, Invoke-WebRequest ve Invoke-RestMethod cmdlet'lerinin -Proxy, -ProxyCredential ve -ProxyUseDefaultCredentials parametreleri ile HTTP isteklerini bir proxy sunucusu üzerinden yönlendirmeyi ifade eder. Bu, web scraping, API erişimi ve geo-targeting gibi senaryolarda IP engellerini aşmak için kullanılır.
PowerShell'de proxy kullanımı proxy kullanıcıları için neden önemlidir?
PowerShell betikleri genellikle Azure veya AWS gibi datacenter ortamlarında çalışır ve bu IP aralıkları birçok web servisi tarafından otomatik engellenir. Residential proxy kullanımı, gerçek ISP IP'leri sayesinde bu engelleri aşmanızı sağlar. Ayrıca geo-targeting ile bölgesel içeriklere erişim ve sticky session ile oturum tutarlılığı sağlar.
PowerShell'de proxy kullanımı için hangi proxy türü en iyisidir?
Web scraping ve SERP takibi için residential proxy'ler en iyi dengeyi sunar: düşük engellenme oranı (%5-15), makul hız (~200ms) ve geniş geo-targeting seçenekleri. Datacenter proxy'ler hızlı API çağrıları için uygundur ancak engellenme riski yüksektir (%40-60). Mobile proxy'ler en düşük engellenme oranına sahiptir ancak daha yavaş ve pahalıdır.
PowerShell'de proxy kullanımında engellenmeyi nasıl önlersiniz?
Engellenmeyi önlemek için: her istekte veya her birkaç istekte yeni sticky session kullanın (IP rotasyonu), gerçekçi User-Agent header'ları gönderin, istekler arasında gecikme ekleyin, -MaximumRetryCount ile retry mekanizmasını etkinleştirin ve 429/403 yanıtlarında backoff uygulayın. Ayrıca -SessionVariable ile çerez kalıcılığı sağlayarak bot benzeri davranışları azaltın.
Invoke-RestMethod proxy parametreleri Invoke-WebRequest ile aynı mıdır?
Evet, Invoke-RestMethod ve Invoke-WebRequest cmdlet'leri aynı proxy parametre setini paylaşır: -Proxy, -ProxyCredential, -ProxyUseDefaultCredentials, -SessionVariable, -WebSession, -MaximumRetryCount ve -RetryIntervalSec. Tek fark, Invoke-RestMethod'un yanıtı otomatik olarak PowerShell nesnelerine deserialize etmesidir; Invoke-WebRequest ise ham HTTP yanıtı döndürür.






