PowerShell'de Proxy Kullanımı: Invoke-WebRequest ve Invoke-RestMethod ile Pratik Rehber

PowerShell'de residential proxy'leri Invoke-WebRequest ve Invoke-RestMethod ile nasıl kullanacağınızı adım adım öğrenin. Geo-targeting, sticky session, retry/backoff ve paralel istekler dahil tam bir uygulama rehberi.

Using Proxies in PowerShell: A Code-First Guide to Invoke-WebRequest and Invoke-RestMethod with ProxyHat
Bu makalede

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 PSCredential nesnesi
  • -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

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ı

ÖzellikResidentialDatacenterMobile
IP KaynağıGerçek ISPVerimerkeziMobil operatör
Tespit Edilme RiskiDüşükYüksekÇok düşük
HızOrta (~200ms)Yüksek (~50ms)Düşük (~500ms)
FiyatOrtaDüşükYüksek
Engellenme Oranı%5-15%40-60%1-5
Uygun SenaryoWeb scraping, SERPHı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, -ProxyCredential ve -ProxyUseDefaultCredentials parametreleri, 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.
  • -SessionVariable ve -WebSession ile ç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ı).
  • -MaximumRetryCount ve -RetryIntervalSec ile yerleşik retry mekanizması, üretim ortamında güvenilirliği artırır.
  • PowerShell 7'nin ForEach-Object -Parallel ile 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.

Sık sorulan sorular

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.

Başlamaya hazır mısınız?

148'den fazla ülkede residential, ISP ve mobil proxy'ler. Ücretsiz hesap oluşturun.

Ücretsiz hesap oluştur
← Bloga Dön