Proksiler aracılığıyla cookies sorunlarını nasıl düzeltilir
Cookies, proksiler ile çalışırken en sık hata kaynaklarından biridir. Oturumlar kesiliyor, yetkilendirme bozuluyor, veriler kayboluyor. Bu makalede bunun neden olduğunu ve stabil çalışma için cookies işlemesini doğru şekilde nasıl yapılandıracağınızı öğreneceğiz.
Proksiler kullanırken cookies neden kaybolur
İsteği bir proksiler aracılığıyla gönderdiğinizde, istemciniz ile hedef sunucu arasına ara bir düğüm yerleşir. Bu birkaç sorunu yaratır:
- Aynı oturum için farklı IP adresleri. Sunucu, isteklerin farklı adreslerden geldiğini fark edebilir ve cookies'leri şüpheli olarak reddedebilir.
- Set-Cookie başlıklarının kaybı. Yanlış proksiler yapılandırması, Set-Cookie başlıklarını istemciye iletmeyebilir.
- Etki alanı ve yol uyuşmazlığı. Proksiler Host başlığını yeniden yazarsa, etki alanı uyuşmazlığı nedeniyle cookies kaydedilmeyebilir.
- Durum kaydının olmaması. Her isteği cookies kaydı olmadan ayrı ayrı gönderirseniz, oturum kaybolur.
Cookie jar nedir ve nasıl kullanılır
Cookie jar, cookies'leri otomatik olarak yöneten bir depolama alanıdır. Her isteğe Cookie başlığını manuel olarak eklemenin yerine, kütüphanenin bunu otomatik olarak yapmasına izin verirsiniz.
Çoğu HTTP istemcisinin yerleşik cookie jar desteği vardır:
import requests
from requests.cookies import RequestsCookieJar
# Cookies depolamak için jar oluşturuyoruz
jar = RequestsCookieJar()
# İlk istek — sunucu Set-Cookie gönderecek
response1 = requests.get(
'https://example.com/login',
cookies=jar,
proxies={'https': 'http://proxy.example.com:8080'}
)
# Cookies otomatik olarak jar'da kaydedildi
print(jar)
# İkinci istek — cookies otomatik olarak gönderilecek
response2 = requests.get(
'https://example.com/dashboard',
cookies=jar,
proxies={'https': 'http://proxy.example.com:8080'}
)
Jar olmadan Set-Cookie'yi manuel olarak ayrıştırıp sonraki isteğe eklemeniz gerekir — bu güvenilmez ve hantaldır.
Cookies'leri istekler arasında kaydetme
Komut dosyanız uzun süre çalışıyorsa veya yeniden yükleme sonrasında oturumu kurtarmanız gerekiyorsa, cookies'leri dosyaya kaydedin:
import requests
from http.cookiejar import LWPCookieJar
# Dosyaya kaydetme ile jar oluşturuyoruz
jar = LWPCookieJar('cookies.txt')
# Eski cookies varsa yüklüyoruz
try:
jar.load(ignore_discard=True, ignore_expires=True)
except FileNotFoundError:
pass
# Isteklerde jar'ı kullanıyoruz
response = requests.get(
'https://example.com/login',
cookies=jar,
proxies={'https': 'http://proxy.example.com:8080'}
)
# Güncellenmiş cookies'leri kaydediyoruz
jar.save(ignore_discard=True, ignore_expires=True)
ignore_discard=True ve ignore_expires=True bayrakları geçici cookies'leri bile kaydetmenizi sağlar.
Cookies etki alanı bağlantısı sorunları
Cookies'lerin hangi etki alanları için gönderileceğini belirleyen bir Domain özniteliği vardır. Sorunlar şu durumlarda ortaya çıkar:
- Proksiler Host'u yeniden yazıyor. Proksiler Host başlığını değiştirirse, cookie jar, cookie'yi başka bir etki alanına ait olarak reddedebilir.
- Alt etki alanları uyuşmuyor.
example.comiçin cookie,api.example.com'e gönderilmeyebilir. - Yol uyuşmuyor.
/apiiçin cookie,/admin'e gönderilmez.
Cookie özniteliklerini şu şekilde kontrol edin:
import requests
response = requests.get(
'https://example.com',
proxies={'https': 'http://proxy.example.com:8080'}
)
# Tüm cookies'leri yazdırıyoruz
for cookie in response.cookies:
print(f"Name: {cookie.name}")
print(f"Value: {cookie.value}")
print(f"Domain: {cookie.domain}")
print(f"Path: {cookie.path}")
print(f"Secure: {cookie.secure}")
print(f"HttpOnly: {cookie.has_nonstandard_attr('HttpOnly')}")
print("---")
Domain çok dar ise, otomatik yönetim yerine cookies'leri açıkça belirtmeyi deneyin:
headers = {
'Cookie': 'session_id=abc123; user_token=xyz789'
}
response = requests.get(
'https://example.com/api',
headers=headers,
proxies={'https': 'http://proxy.example.com:8080'}
)
Secure ve HttpOnly bayrakları
Secure bayrağı, cookie'nin yalnızca HTTPS üzerinden gönderildiği anlamına gelir. HTTP proksisini HTTPS kaynağına erişmek için kullanıyorsanız, proksiye bağlantının korunduğundan veya proksinin HTTPS'yi doğru şekilde ilettiğinden emin olun.
HttpOnly bayrağı, JavaScript'ten cookie'ye erişimi yasaklar. Bu, isteklerde cookie gönderimini etkilemez, ancak tarayıcıdan bu tür cookies'leri okuyamayacağınızı hatırlamak önemlidir.
Konut proksilerini kullanırken şunları kontrol edin:
- Proksiler HTTPS'yi destekliyor (CONNECT yöntemi)
- Sertifikalar geçerli (
verify=Falseüretimde kullanmayın) - Başlıklar proksiler tarafından yeniden yazılmıyor
Kod örnekleri ile pratik uygulamalar
Örnek 1: Oturum kaydı ile giriş
import requests
from requests.cookies import RequestsCookieJar
jar = RequestsCookieJar()
proxy = 'http://proxy.example.com:8080'
# Giriş
login_response = requests.post(
'https://example.com/login',
data={'username': 'user', 'password': 'pass'},
cookies=jar,
proxies={'https': proxy}
)
if login_response.status_code == 200:
print("Giriş başarılı")
# Kaydedilmiş oturumu kullanıyoruz
dashboard = requests.get(
'https://example.com/dashboard',
cookies=jar,
proxies={'https': proxy}
)
print(dashboard.text)
Örnek 2: Birden fazla isteği işleme
import requests
from http.cookiejar import LWPCookieJar
import time
jar = LWPCookieJar('session.txt')
try:
jar.load(ignore_discard=True)
except:
pass
proxy = 'http://proxy.example.com:8080'
urls = [
'https://example.com/page1',
'https://example.com/page2',
'https://example.com/page3'
]
for url in urls:
response = requests.get(
url,
cookies=jar,
proxies={'https': proxy},
timeout=10
)
print(f"{url}: {response.status_code}")
jar.save(ignore_discard=True)
time.sleep(1) # Sunucuyu aşırı yüklemeyin
Örnek 3: Sorunlar olduğunda açık cookies iletimi
import requests
proxy = 'http://proxy.example.com:8080'
# Otomatik yönetim çalışmazsa
cookies_dict = {
'session_id': 'abc123def456',
'user_pref': 'dark_mode'
}
headers = {
'User-Agent': 'Mozilla/5.0...',
'Cookie': '; '.join([f"{k}={v}" for k, v in cookies_dict.items()])
}
response = requests.get(
'https://example.com/api/data',
headers=headers,
proxies={'https': proxy}
)
print(response.json())
Cookies sorunlarının hata ayıklaması
Cookies çalışmazsa, bu araçları kullanın:
| Araç | Amaç |
|---|---|
requests.Session |
Oturumdaki tüm istekler için cookies'leri otomatik olarak yönetir |
logging |
Tüm başlıkları görmek için requests için DEBUG'ı etkinleştirin |
Fiddler / Charles |
Trafiği yakala ve Set-Cookie ve Cookie başlıklarını gör |
curl -v |
Komut satırından proksiler aracılığıyla aynı şeyi test edin |
Hata ayıklama için günlüğü etkinleştirin:
import logging
import requests
logging.basicConfig(level=logging.DEBUG)
# Şimdi tüm istekler başlıkları ve cookies'leri yazdıracak
response = requests.get(
'https://example.com',
proxies={'https': 'http://proxy.example.com:8080'}
)
Proksinin cookies'leri bloke etmediğini kontrol edin:
curl -v -x http://proxy.example.com:8080 https://example.com
# Başlıklara bakın:
# Set-Cookie: ... (olmalı)
# Cookie: ... (sonraki istekte gönderilmeli)
İpucu: Konut proksilerini kullanıyorsanız, istekler arasında IP'yi döndürebileceklerini unutmayın. Cookies işleme mantığınızın bunu hesaba katması gerekir — bazı sunucular aynı oturumdaki farklı IP'lerden gelen istekleri reddeder.
Özet
Proksiler aracılığıyla çalışırken cookies sorunları doğru yapılandırma ile çözülür:
- Cookie jar kullanarak cookies'leri otomatik olarak yönetin
- Cookies'leri istekler arasında dosyaya kaydedin
- Etki alanı bağlantısı ve Path özniteliklerini kontrol edin
- Proksinin HTTPS desteğini doğrulayın
- Sorunları belirlemek için hata ayıklama kullanın
Proksiler aracılığıyla oturum yönetiminin güvenilir çalışması gereken otomasyon ve ayrıştırma görevleri için, HTTPS desteği ve cookies yönetimi olan konut proksileri uygundur. Basit cookie jar ile başlayın ve yalnızca gerekirse daha karmaşık şemalara geçin.