Web sitelerini parselleme, API isteklerini otomatikleştirme veya pazar yerlerinde rakip fiyatlarını izleme sırasında IP engelleriyle karşılaşmanız kaçınılmazdır. curl ve wget araçları, komut satırında HTTP istekleriyle çalışmak için standart araçlardır ve bunlarda proxy ayarlarının doğru yapılması, kısıtlamaları aşmak için kritik öneme sahiptir. Bu makalede, curl ve wget'te proxy kullanımının tüm yollarını inceleyeceğiz: temel komutlardan IP döngüsü ve hata işleme gibi gelişmiş senaryolara kadar.
curl ve wget'te proxy temel sözdizimi
Proxy üzerinden bağlanmak için en basit komutlarla başlayalım. Her iki araç da proxy sunucusunu belirtmek için bir parametreyi destekler, ancak sözdizimi biraz farklıdır.
curl'de proxy kullanımı
curl'de proxy, -x veya --proxy parametresi ile belirtilir. Komutun temel formatı:
curl -x http://proxy-server:port http://example.com
Gerçek bir proxy sunucusu ile ilgili belirli bir örnek:
curl -x http://45.130.123.45:8080 http://api.ipify.org
Bu komut, belirtilen proxy sunucusu üzerinden api.ipify.org'a (IP adresinizi döndüren bir hizmet) bir istek gönderir. Proxy'nin IP'sini göreceksiniz, gerçek adresinizi değil.
wget'de proxy kullanımı
wget'de proxy, -e use_proxy=yes parametresi ve çevresel değişkenler aracılığıyla veya doğrudan seçenekler ile ayarlanır:
wget -e use_proxy=yes -e http_proxy=http://45.130.123.45:8080 http://example.com
Ya da çevresel değişkenler aracılığıyla daha kısa bir seçenek (aşağıdaki bölümde daha fazla bilgi):
export http_proxy="http://45.130.123.45:8080"
wget http://example.com
Proxy sunucusunda yetkilendirme
Çoğu ticari proxy hizmeti, kullanıcı adı ve şifre ile yetkilendirme gerektirir. Bu, proxy'yi yetkisiz kullanımdan korur ve her müşterinin trafiğini izlemeye olanak tanır. curl ve wget'te kimlik bilgilerini nasıl ileteceğimizi inceleyelim.
curl'de yetkilendirme
curl'de kullanıcı adı ve şifre, proxy sunucusunun URL'sinde doğrudan veya ayrı bir -U parametresi ile belirtilebilir:
# Yöntem 1: URL'de kullanıcı adı ve şifre
curl -x http://username:password@proxy-server:port http://example.com
# Yöntem 2: -U parametresi ile
curl -x http://proxy-server:port -U username:password http://example.com
Kimlik bilgileri ile ilgili belirli bir örnek:
curl -x http://user123:pass456@45.130.123.45:8080 http://api.ipify.org
Önemli bir nokta: Eğer şifrede özel karakterler (@, :, /, ? gibi) varsa, bunları URL formatında kodlamanız gerekir. Örneğin, @ sembolü %40 ile değiştirilir:
# Şifre @ içeriyorsa: pass@456
curl -x http://user123:pass%40456@45.130.123.45:8080 http://api.ipify.org
wget'de yetkilendirme
wget'de yetkilendirme, --proxy-user ve --proxy-password parametreleri ile ayarlanır:
wget --proxy-user=username --proxy-password=password \
-e use_proxy=yes -e http_proxy=http://45.130.123.45:8080 \
http://example.com
Ya da kimlik bilgileri URL'de olan çevresel değişkenler aracılığıyla:
export http_proxy="http://username:password@45.130.123.45:8080"
wget http://example.com
Farklı proxy türleriyle çalışma: HTTP, HTTPS, SOCKS5
Proxy sunucuları farklı protokollerle çalışır ve tür seçimi, göreve bağlıdır. HTTP proxy'leri basit istekler için uygundur, HTTPS şifreleme sağlar, SOCKS5 ise daha düşük seviyede çalışır ve her türlü trafiği destekler. Wildberries veya Ozon gibi pazar yerlerini parselerken genellikle konut proxy'leri kullanılır; bunlar bu protokollerin herhangi biriyle çalışabilir.
HTTP ve HTTPS proxy'leri
HTTP proxy'leri en yaygın türdür. HTTP protokolü seviyesinde çalışır ve çoğu web parselleme görevi için uygundur:
# curl'de HTTP proxy
curl -x http://proxy-server:8080 http://example.com
# curl'de HTTPS proxy (güvenli bağlantılar için)
curl -x https://proxy-server:8080 https://example.com
Önemli: Hedef site HTTPS kullansa bile, proxy HTTP olabilir. Curl, otomatik olarak CONNECT yöntemiyle bir tünel kurar:
# HTTPS sitesi için HTTP proxy (doğru çalışır)
curl -x http://proxy-server:8080 https://secure-site.com
SOCKS5 proxy'leri
SOCKS5, TCP seviyesinde çalışan ve her türlü trafiği (HTTP, HTTPS, FTP, hatta UDP) destekleyen daha evrensel bir protokoldür. Bu, SOCKS5'i karmaşık otomasyon görevleri için ideal bir seçim haline getirir:
# curl'de SOCKS5
curl -x socks5://proxy-server:1080 http://example.com
# Yetkilendirme ile SOCKS5
curl -x socks5://username:password@proxy-server:1080 http://example.com
# SOCKS5h (DNS çözümlemesi proxy üzerinden)
curl -x socks5h://proxy-server:1080 http://example.com
socks5 ve socks5h arasındaki fark: ilk durumda DNS istekleri bilgisayarınızdan gider, ikinci durumda proxy sunucusu üzerinden gider. DNS isteklerinizi tamamen gizlemek istiyorsanız socks5h kullanın.
wget'de SOCKS5 desteği sınırlıdır, bu nedenle bu tür görevler için curl veya proxychains gibi ek araçlar kullanmak daha iyidir.
İpucu: Pazar yerlerini (Wildberries, Ozon, Yandex.Market) parselerken, gerçek kullanıcıların IP'lerine sahip olan konut veya mobil proxy'ler kullanmanız önerilir — bunlar daha az engellenir.
Çevresel değişkenler aracılığıyla proxy ayarı
Proxy ile düzenli olarak çalışıyorsanız, her komutta parametre belirtmektense çevresel değişkenleri bir kez ayarlamak daha kullanışlıdır. Curl ve wget bu değişkenleri otomatik olarak okur.
Geçerli oturum için ayarlama
Terminalde değişkenleri dışa aktarın (oturum kapatılana kadar geçerlidir):
# HTTP trafiği için
export http_proxy="http://username:password@proxy-server:8080"
# HTTPS trafiği için
export https_proxy="http://username:password@proxy-server:8080"
# FTP trafiği için
export ftp_proxy="http://username:password@proxy-server:8080"
# SOCKS5 için
export all_proxy="socks5://username:password@proxy-server:1080"
Bundan sonra curl ve wget otomatik olarak proxy kullanacaktır:
# Proxy otomatik olarak uygulanacak
curl http://api.ipify.org
wget http://example.com
.bashrc veya .zshrc'de kalıcı ayar
Proxy'lerin her terminal açılışında uygulanması için, kabuk yapılandırma dosyanıza değişkenleri ekleyin:
# Düzenleyicide dosyayı açın
nano ~/.bashrc # bash için
# veya
nano ~/.zshrc # zsh için
# Dosyanın sonuna ekleyin:
export http_proxy="http://username:password@proxy-server:8080"
export https_proxy="http://username:password@proxy-server:8080"
# Değişiklikleri kaydedin ve uygulayın:
source ~/.bashrc
İstisnalar: no_proxy
Bazen belirli adresleri proxy'den hariç tutmanız gerekebilir (örneğin, localhost veya dahili hizmetler):
export no_proxy="localhost,127.0.0.1,192.168.0.0/16,.local"
Artık bu adreslere yapılan istekler doğrudan, proxy'yi atlayarak gidecektir.
Bash betiklerinde proxy döngüsü
Toplu parselleme sırasında (örneğin, Wildberries'deki binlerce ürün kartından fiyat toplama) tek bir proxy kullanmak engellemeye yol açar. Çözüm — IP adreslerinin döngüsüdür. Bunu bash betiklerinde nasıl gerçekleştireceğimizi inceleyelim.
Proxy listesinden basit döngü
Bir proxy sunucusu listesi ile proxies.txt adında bir dosya oluşturun (her satıra bir tane):
http://user1:pass1@proxy1.example.com:8080
http://user2:pass2@proxy2.example.com:8080
http://user3:pass3@proxy3.example.com:8080
Proxy'nin sırayla döngüye girdiği bir betik:
#!/bin/bash
# Parsellenecek URL'lerin dosyası
urls_file="urls.txt"
# Proxy listesinin dosyası
proxies_file="proxies.txt"
# Proxy'leri bir diziye oku
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
current_proxy=0
# Her URL'yi işleyin
while IFS= read -r url; do
# Proxy'yi döngüsel olarak seçin
proxy="${proxies[$current_proxy]}"
echo "$url adresine $proxy üzerinden istek yapılıyor"
curl -x "$proxy" -s "$url" -o "output_$(basename $url).html"
# Bir sonraki proxy'ye geçin
current_proxy=$(( (current_proxy + 1) % proxy_count ))
# İstekler arasında bekleme (1-3 saniye)
sleep $((RANDOM % 3 + 1))
done < "$urls_file"
Bu betik, listedeki proxy'leri sırayla kullanır ve son proxy'den sonra ilkine geri döner. İstekler arasındaki rastgele bekleme, etkinliği daha doğal hale getirir.
Rastgele proxy seçimi
Daha fazla öngörülemezlik için proxy'leri rastgele seçebilirsiniz:
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
while IFS= read -r url; do
# Rastgele proxy seçimi
random_index=$((RANDOM % proxy_count))
proxy="${proxies[$random_index]}"
echo "$url adresine proxy #$random_index üzerinden istek yapılıyor"
curl -x "$proxy" -s "$url" -o "output_$(date +%s).html"
sleep $((RANDOM % 3 + 1))
done < "urls.txt"
Proxy hizmeti API'si aracılığıyla otomatik döngü
Birçok proxy sağlayıcısı (konut proxy'leri sunan hizmetler dahil) tek bir giriş noktası aracılığıyla otomatik döngü sunar. Tek bir proxy adresi kullanırsınız, ancak IP her istekte veya zamanlayıcıya göre değişir:
# Otomatik döngü ile proxy
# IP her istekte değişir
curl -x http://username:password@rotating.proxy.com:8080 http://api.ipify.org
curl -x http://username:password@rotating.proxy.com:8080 http://api.ipify.org
# Yukarıdaki iki istek farklı IP adresleri alacaktır
Bu, ölçekli parselleme için en uygun yöntemdir — proxy listesini manuel olarak yönetmeye gerek yoktur.
Proxy üzerinden başlıklar ve User-Agent iletimi
Modern web siteleri yalnızca IP adresini değil, aynı zamanda HTTP istek başlıklarını da analiz eder. User-Agent'ın eksikliği veya şüpheli başlıklar, kaliteli proxy kullanılsa bile engellemeye yol açabilir. curl ve wget'te başlıkları nasıl doğru ayarlayacağımızı inceleyelim.
curl'de User-Agent
User-Agent, tarayıcıyı ve işletim sistemini tanımlayan bir başlıktır. Curl varsayılan olarak kendi User-Agent'ını (curl/7.x.x) gönderir, bu da otomasyonu hemen ortaya çıkarır. Bunu gerçek bir tarayıcı ile değiştirin:
# Windows'ta Chrome
curl -x http://proxy:8080 \
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36" \
http://example.com
# macOS'ta Firefox
curl -x http://proxy:8080 \
-A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:121.0) Gecko/20100101 Firefox/121.0" \
http://example.com
Ek başlıklar
Daha gerçekçi bir istek için tipik tarayıcı başlıklarını ekleyin:
curl -x http://proxy:8080 \
-H "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
-H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
-H "Accept-Language: ru-RU,ru;q=0.9,en;q=0.8" \
-H "Accept-Encoding: gzip, deflate, br" \
-H "Connection: keep-alive" \
-H "Upgrade-Insecure-Requests: 1" \
http://example.com
wget'de User-Agent
wget'de User-Agent, --user-agent parametresi ile ayarlanır:
wget --user-agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0" \
-e use_proxy=yes -e http_proxy=http://proxy:8080 \
http://example.com
Betiklerde User-Agent rastgeleleştirme
Ölçekli parselleme için User-Agent'ları sırayla değiştirmek faydalıdır, böylece istekler farklı kullanıcılar gibi görünür:
#!/bin/bash
# User-Agent dizisi
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0 Safari/537.36"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Safari/605.1.15"
"Mozilla/5.0 (X11; Linux x86_64) Firefox/121.0"
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) Safari/604.1"
)
while IFS= read -r url; do
# Rastgele User-Agent
random_ua=${user_agents[$RANDOM % ${#user_agents[@]}]}
curl -x http://proxy:8080 -A "$random_ua" -s "$url"
sleep 2
done < "urls.txt"
Sorun giderme ve hata işleme
Proxy ile çalışırken genellikle hatalar ortaya çıkar: zaman aşımı, bağlantı reddi, yanlış yetkilendirme. Bu durumları nasıl teşhis edeceğimizi ve işleyeceğimizi inceleyelim.
Proxy'nin çalışabilirliğini kontrol etme
Proxy'yi kontrol etmenin en basit yolu, IP'nizi döndüren bir hizmete istek yapmaktır:
# HTTP proxy kontrolü
curl -x http://proxy:8080 http://api.ipify.org
# SOCKS5 proxy kontrolü
curl -x socks5://proxy:1080 http://api.ipify.org
# Ayrıntılı bilgi ile
curl -x http://proxy:8080 -v http://api.ipify.org
-v (ayrıntılı) parametresi, bağlantı detaylarını, başlıkları ve hataları gösterir.
Zaman aşımı işlemesi
Yavaş proxy'ler veya aşırı yüklenmiş sunucular zaman aşımına neden olabilir. Makul zaman sınırları belirleyin:
# Bağlantı zaman aşımı 10 saniye, toplam zaman aşımı 30 saniye
curl -x http://proxy:8080 --connect-timeout 10 --max-time 30 http://example.com
# wget'de
wget --timeout=30 --tries=3 -e http_proxy=http://proxy:8080 http://example.com
Betiklerde otomatik hata işleme
Hata durumunda bir sonraki proxy'ye otomatik olarak geçiş yapan bir parselleme betiği:
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
fetch_with_retry() {
local url=$1
local max_attempts=3
for proxy in "${proxies[@]}"; do
echo "Proxy üzerinden deneme: $proxy"
if curl -x "$proxy" \
--connect-timeout 10 \
--max-time 30 \
-s -f "$url" -o output.html; then
echo "Başarıyla proxy ile: $proxy"
return 0
else
echo "Proxy ile hata: $proxy, bir sonraki deniyoruz"
fi
done
echo "$url için tüm proxy'ler erişilemez"
return 1
}
# Kullanım
fetch_with_retry "http://example.com/page1"
-f parametresi, curl'ün HTTP durum kodları 4xx ve 5xx durumlarında hata döndürmesini sağlar, bu da yalnızca ağ hatalarını değil, aynı zamanda uygulama düzeyindeki engellemeleri de işlemenize olanak tanır.
Hata ayıklama için günlükleme
Sorunları analiz etmek için ayrıntılı istek günlüklerini saklayın:
# Yanıt başlıklarını saklama
curl -x http://proxy:8080 -D headers.txt http://example.com
# Tam etkileşim günlüğü
curl -x http://proxy:8080 -v http://example.com 2>&1 | tee curl.log
# Sadece HTTP durumu
curl -x http://proxy:8080 -o /dev/null -s -w "%{http_code}\n" http://example.com
Pratik kullanım senaryoları
curl ve wget ile proxy kullanarak belirli iş sorunlarını çözen gerçek görevleri inceleyelim.
Rakiplerin fiyatlarını pazar yerlerinde parselleme
Görev: Wildberries'den 500 ürünün fiyatlarını toplamak ve fiyat stratejisini analiz etmek. Wildberries, tek bir IP'den gelen toplu isteklere aktif olarak engel koymaktadır.
Çözüm: konut proxy'leri kullanarak döngü ve User-Agent rastgeleleştirmesi:
#!/bin/bash
# Otomatik döngü ile proxy
PROXY="http://user:pass@rotating-residential.proxy.com:8080"
# User-Agent dizisi
user_agents=(
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/120.0.0.0"
"Mozilla/5.0 (iPhone; CPU iPhone OS 17_0) Safari/604.1"
)
# Ürün ID'lerini dosyadan oku
while IFS= read -r product_id; do
ua=${user_agents[$RANDOM % ${#user_agents[@]}]}
curl -x "$PROXY" \
-A "$ua" \
-H "Accept-Language: ru-RU,ru;q=0.9" \
-s "https://www.wildberries.ru/catalog/${product_id}/detail.aspx" \
-o "products/${product_id}.html"
echo "$product_id ürünü indirildi"
sleep $((RANDOM % 5 + 3)) # 3-8 saniye bekleme
done < product_ids.txt
Farklı bölgelerden API erişilebilirliğini izleme
Görev: Servisinizin API'sinin farklı ülkelerden nasıl çalıştığını kontrol etmek (coğrafi engellemeler, yanıt hızı).
Çözüm: İhtiyaç duyulan ülkelerden IP'ler ile proxy kullanımı:
#!/bin/bash
# Farklı ülkelerden proxy
declare -A proxies=(
["US"]="http://user:pass@us-proxy.com:8080"
["DE"]="http://user:pass@de-proxy.com:8080"
["JP"]="http://user:pass@jp-proxy.com:8080"
)
API_URL="https://api.yourservice.com/v1/status"
for country in "${!proxies[@]}"; do
echo "$country'den kontrol ediliyor..."
response_time=$(curl -x "${proxies[$country]}" \
-s -o /dev/null \
-w "%{time_total}" \
"$API_URL")
http_code=$(curl -x "${proxies[$country]}" \
-s -o /dev/null \
-w "%{http_code}" \
"$API_URL")
echo "$country: HTTP $http_code, yanıt süresi ${response_time}s"
done
wget ile dosya indirme ve proxy döngüsü
Görev: Hız kısıtlaması olan bir siteden dosya arşivini indirmek (ürün resimleri, belgeler).
#!/bin/bash
proxies_file="proxies.txt"
mapfile -t proxies < "$proxies_file"
proxy_count=${#proxies[@]}
current=0
while IFS= read -r file_url; do
proxy="${proxies[$current]}"
filename=$(basename "$file_url")
echo "$filename dosyası proxy #$current üzerinden indiriliyor"
wget --proxy-user=username --proxy-password=password \
-e use_proxy=yes -e http_proxy="$proxy" \
-O "downloads/$filename" \
"$file_url"
current=$(( (current + 1) % proxy_count ))
sleep 2
done < file_urls.txt
Farklı GEO'larda reklam yaratımlarını test etme
Görev: Facebook Ads reklamlarının ABD, Kanada ve Birleşik Krallık'taki kullanıcılar için nasıl göründüğünü kontrol etmek (farklı para birimleri, diller, tekliflerin erişilebilirliği).
#!/bin/bash
# Gerçekçilik için farklı ülkelerden mobil proxy'ler
declare -A mobile_proxies=(
["US"]="http://user:pass@us-mobile.proxy.com:8080"
["CA"]="http://user:pass@ca-mobile.proxy.com:8080"
["GB"]="http://user:pass@gb-mobile.proxy.com:8080"
)
AD_URL="https://www.facebook.com/ads/library/?id=YOUR_AD_ID"
for country in "${!mobile_proxies[@]}"; do
curl -x "${mobile_proxies[$country]}" \
-A "Mozilla/5.0 (iPhone; CPU iPhone OS 17_0) Safari/604.1" \
-H "Accept-Language: en-US,en;q=0.9" \
-s "$AD_URL" \
-o "ads_preview_${country}.html"
echo "$country için önizleme kaydedildi"
done
Bu tür görevler için mobil proxy'ler özellikle etkilidir, çünkü gerçek akıllı telefon kullanıcılarını taklit eder ve Facebook'un anti-fraud sistemlerinde daha az şüphe uyandırır.
Arbitrajcılar için önemli: Reklam yaratımlarını proxy üzerinden kontrol ederken mobil IP'ler ve mobil cihazların uygun User-Agent'larını kullanın. Facebook, verilerin tutarlılığını analiz eder (User-Agent'taki cihaz türü, IP türü ile eşleşmelidir).
Web sitesinin erişilebilirliğini otomatik kontrol etme
Görev: Web sitenizin her 5 dakikada bir erişilebilirliğini izlemek, gerçek kullanıcılar gibi istekleri taklit etmek (sunucu IP'sinden değil).
#!/bin/bash
PROXY="http://user:pass@residential.proxy.com:8080"
SITE_URL="https://yoursite.com"
LOG_FILE="uptime.log"
while true; do
timestamp=$(date '+%Y-%m-%d %H:%M:%S')
http_code=$(curl -x "$PROXY" \
-s -o /dev/null \
-w "%{http_code}" \
--max-time 10 \
"$SITE_URL")
if [ "$http_code" -eq 200 ]; then
echo "[$timestamp] OK - HTTP $http_code" >> "$LOG_FILE"
else
echo "[$timestamp] HATA - HTTP $http_code" >> "$LOG_FILE"
# Uyarı gönderme (örneğin, Telegram API'si aracılığıyla)
curl -s "https://api.telegram.org/botTOKEN/sendMessage" \
-d "chat_id=CHAT_ID&text=Web sitesi erişilemez: HTTP $http_code"
fi
sleep 300 # 5 dakika
done
Sonuç
Curl ve wget, HTTP isteklerini otomatikleştirmek için güçlü araçlardır ve doğru proxy ayarları, parselleme, izleme ve test etme için vazgeçilmez hale getirir. Temel sözdiziminden IP döngüsü, hata işleme ve başlık rastgeleleştirmesi gibi gelişmiş senaryolara kadar tüm anahtar yönleri inceledik.
Makaleden çıkarılacak ana noktalar:
- curl'de
-xparametresini ve proxy ayarı için çevresel değişkenleri kullanın - Göreviniz için proxy türünü seçin: basit istekler için HTTP, evrensellik için SOCKS5
- Her zaman standart User-Agent'ı gerçekçi bir tarayıcı ile değiştirin
- Büyük ölçekli parselleme için proxy döngüsü uygulayın — bu, engelleri aşmak için kritik öneme sahiptir
- Üretim betiklerinde hata ve zaman aşımı işlemesini ekleyin
- İstekler arasında rastgele bekleme süreleri ekleyin, böylece insan davranışını taklit edin
Yüksek anonimlik ve engellenme riskinin minimumda tutulduğu görevler (pazar yerlerini parselleme, reklam kontrolü, rakip izleme) için konut proxy'leri kullanmanızı öneririz. Gerçek ev kullanıcılarının IP'lerine sahip olmaları, isteklerinizi normal trafikle ayırt edilemez hale getirir ve yasak listelerine düşme olasılığını önemli ölçüde azaltır.
Artık curl ve wget ile proxy kullanımı için etkili bir şekilde çalışmak için tam bir araç ve bilgi setine sahipsiniz. Bu teknikleri projelerinizde uygulayın, örnekleri belirli görevlerinize uyarlayın ve otomasyonu engellenme korkusu olmadan ölçeklendirin.