HTTP proxy, sizinle internet arasında ağ geçidi görevi gören bir ara sunucudur. Proxy kullandığınızda istekleriniz hedef sunucuya ulaşmadan önce proxy sunucusu üzerinden geçer. Bu, IP adresinizi gizler ve coğrafi kısıtlamaları aşma, web kazıma, güvenliği artırma gibi çeşitli amaçlarla kullanılabilir. Python'ın requests kütüphanesi, HTTP isteklerinizde proxy kullanmayı oldukça kolaylaştırır.
requests Kütüphanesiyle Proxy Neden Kullanılır?
requests kütüphanesiyle proxy kullanmak isteyebilmenizin birkaç temel nedeni vardır:
- Anonimlik: Proxy'ler IP adresinizi gizler ve çevrimiçi etkinliklerinizin izlenmesini zorlaştırır.
- Coğrafi Kısıtlamaları Aşma: Belirli bölgelerle sınırlı içeriğe, o bölgede bulunan bir proxy sunucusu üzerinden erişin.
- Web Kazıma: Farklı proxy sunucuları arasında rotasyon yaparak site kazırken engellenmekten kaçının. Birçok site, verilerinin kötüye kullanımını önlemek için hız sınırlaması veya IP engellemesi uygular.
- Yük Dengeleme: İstekleri birden fazla sunucuya dağıtarak performansı ve güvenilirliği artırın.
- Güvenlik: Proxy'ler bilgisayarınızla internet arasında tampon görevi görerek ek bir güvenlik katmanı ekler. Ayrıca zararlı içeriği filtreleyebilirler.
- Test: Test amacıyla farklı konumlardan gelen kullanıcı erişimini simüle edin.
requests İçinde Proxy Ayarlama
requests kütüphanesi, istek fonksiyonlarındaki (get, post, put, delete vb.) proxies parametresi ile proxy yapılandırmanın basit bir yolunu sunar. proxies parametresi, anahtarların protokoller (örneğin 'http', 'https'), değerlerin ise proxy URL'leri olduğu bir sözlük alır.
Temel Proxy Yapılandırması
requests kütüphanesiyle proxy kullanmanın temel bir örneği:
import requests
proxies = {
'http': 'http://your_proxy_address:port',
'https': 'https://your_proxy_address:port',
}
try:
response = requests.get('https://www.example.com', proxies=proxies)
response.raise_for_status() # Hatalı yanıtlarda (4xx veya 5xx) HTTPError fırlatır
print(response.status_code)
print(response.text)
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
your_proxy_address ve port değerlerini proxy sunucunuzun gerçek adresi ve portuyla değiştirin. raise_for_status() metodu hata yönetimi için kritiktir; HTTP durum kodu bir hatayı gösteriyorsa (örneğin 404 Not Found, 500 Internal Server Error) istisna fırlatır.
HTTP ve HTTPS için Farklı Proxy Kullanma
HTTP ve HTTPS trafiği için farklı proxy'ler de belirtebilirsiniz:
import requests
proxies = {
'http': 'http://http_proxy_address:port',
'https': 'https://https_proxy_address:port',
}
try:
response = requests.get('https://www.example.com', proxies=proxies)
response.raise_for_status()
print(response.status_code)
print(response.text)
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
Proxy Kimlik Doğrulaması
Birçok proxy sunucusu kimlik doğrulaması ister. Kullanıcı adı ve parolayı proxy URL'sine ekleyebilirsiniz:
import requests
proxies = {
'http': 'http://username:password@your_proxy_address:port',
'https': 'https://username:password@your_proxy_address:port',
}
try:
response = requests.get('https://www.example.com', proxies=proxies)
response.raise_for_status()
print(response.status_code)
print(response.text)
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
Alternatif olarak, daha karmaşık kimlik doğrulama şemaları için requests.auth modülünü kullanabilirsiniz. Ancak temel kullanıcı adı/parola doğrulamasında kimlik bilgilerini URL'ye gömmek genellikle yeterlidir.
SOCKS Proxy'ler
requests kütüphanesi SOCKS proxy'leri destekler, ancak requests[socks] ek paketini kurmanız gerekir.
pip install requests[socks]
Kurulumdan sonra SOCKS proxy'leri şöyle kullanabilirsiniz:
import requests
proxies = {
'http': 'socks5://user:pass@host:port',
'https': 'socks5://user:pass@host:port'
}
try:
response = requests.get('https://www.example.com', proxies=proxies)
response.raise_for_status()
print(response.status_code)
print(response.text)
except requests.exceptions.RequestException as e:
print(f"An error occurred: {e}")
socks4 veya socks5 şemalarını kullanabilirsiniz. SOCKS proxy'niz kullanıcı adı/parola istemiyorsa bunları URL'den çıkarmanız yeterlidir (örneğin 'socks5://host:port').
Proxy Türlerinin Karşılaştırması
Farklı proxy türlerinin karşılaştırması:
| Özellik | HTTP Proxy | HTTPS Proxy | SOCKS Proxy |
|---|---|---|---|
| Protokol | HTTP | HTTPS | SOCKS (4, 5) |
| Şifreleme | Şifreleme yok (hedef sunucu HTTPS değilse) | Proxy sunucusuna kadar trafiği şifreler | Şifrelemeyi destekler (SOCKS5) |
| Kullanım Alanları | Web'de gezinme, HTTP sitelere erişim | Web'de gezinme, HTTPS sitelere erişim | Çok yönlü, farklı protokolleri destekler (HTTP, HTTPS, FTP vb.) |
| Güvenlik | Daha az güvenli | Daha güvenli | Daha güvenli (özellikle SOCKS5 ile) |
| Karmaşıklık | Kurulumu basit | Kurulumu basit | Yapılandırması daha karmaşık olabilir |
| Uygulama Katmanı | HTTP protokolünü anlar | HTTP protokolünü anlar | Taşıma katmanında çalışır |
Web Kazıma için Proxy Rotasyonu
Web kazımada IP adresinizin engellenmemesi için birden fazla proxy arasında rotasyon yapmak kritiktir. Proxy rotasyonunu şöyle uygulayabilirsiniz:
import requests
import random
proxy_list = [
'http://user1:[email protected]:8000',
'http://user2:[email protected]:8001',
'http://user3:[email protected]:8002',
]
def get_page(url):
proxy = random.choice(proxy_list)
proxies = {'http': proxy, 'https': proxy}
try:
response = requests.get(url, proxies=proxies, timeout=10) # timeout ekle
response.raise_for_status()
return response.text
except requests.exceptions.RequestException as e:
print(f"Error using proxy {proxy}: {e}")
return None
url = 'https://www.example.com'
content = get_page(url)
if content:
print("Successfully retrieved content.")
# İçeriği burada işleyin
else:
print("Failed to retrieve content.")
Bu örnekte:
- Bir proxy sunucusu listesi tutulur.
random.choice()fonksiyonu her istek için listeden rastgele bir proxy seçer.- Bir proxy yanıt vermediğinde betiğin süresiz beklemesini önlemek için
requests.get()fonksiyonunatimeouteklenir. - İstisnaları yakalamak ve farklı bir proxy ile yeniden denemek için hata yönetimi uygulanır.
Hataları düzgün ele almayı ve bir istek başarısız olduğunda farklı proxy'lerle yeniden deneme mantığı kurmayı unutmayın. Daha büyük ölçekli kazıma projeleri için daha güçlü bir proxy yönetim kütüphanesi kullanmayı değerlendirin.
Sık Karşılaşılan Sorunlar ve Çözümleri
- Proxy Kimlik Doğrulama Hataları: Kullanıcı adı ve parolanızı tekrar kontrol edin. Proxy URL'sinde doğru şekilde kodlandıklarından emin olun.
- Bağlantı Hataları: Proxy sunucusunun çalıştığını ve ağınızdan erişilebilir olduğunu doğrulayın. Güvenlik duvarı ayarlarını kontrol edin.
- Zaman Aşımları:
requests.get()fonksiyonundaki timeout değerini artırın. Varsayılan timeout bazı proxy sunucuları için çok kısa olabilir. - Engellenen İstekler: Hedef site, proxy sunucusunun IP adresini engelliyor olabilir. Farklı bir proxy veya rotasyonlu bir proxy listesi deneyin.
- SOCKS Proxy Hataları:
requests[socks]ek paketini kurduğunuzdan emin olun. SOCKS proxy sunucusunun doğru yapılandırıldığını doğrulayın.
Sonuç
Python'ın requests kütüphanesiyle proxy kullanmak; web kazıma, coğrafi kısıtlı içeriğe erişim ve güvenliği artırma gibi çeşitli görevler için güçlü bir tekniktir. Proxy'leri nasıl yapılandıracağınızı, kimlik doğrulamayı nasıl ele alacağınızı ve rotasyonu nasıl uygulayacağınızı öğrenerek Python uygulamalarınızda proxy'lerden etkin biçimde yararlanabilirsiniz. Hataları düzgün ele almayı ve ihtiyacınıza uygun proxy türünü seçmeyi unutmayın.
