Proxy Yanlış Veri Döndürüyor: Nedenler ve Çözümler
Bir kazıma (parser) programı kurdunuz, veri toplamayı başlattınız, ancak sonuç olarak başka bir bölgeye ait fiyatlar, güncel olmayan içerik veya tamamen farklı bir sayfa görüyorsunuz. Proxy'nin neden yanlış veriler döndürebileceğini ve bunu nasıl düzeltebileceğinizi inceleyelim.
1. Proxy Tarafında Önbellekleme (Caching)
Eski verilerin alınmasının en yaygın nedeni önbelleklemedir. Bazı proxy sunucuları, yükü azaltmak ve performansı artırmak için web sitesi yanıtlarını kaydeder. Sonuç olarak, güncel veriler yerine bir haftalık verileri alırsınız.
Sorunu Nasıl Tespit Edersiniz?
- Tekrarlanan isteklerde veriler değişmiyor
- Fiyatlar veya stok durumu gerçek durumu yansıtmıyor
- Yanıttaki
Agebaşlığı yüksek bir değer gösteriyor
Çözüm
Önbelleklemeyi yasaklayan başlıklar ekleyin:
import requests
headers = {
'Cache-Control': 'no-cache, no-store, must-revalidate',
'Pragma': 'no-cache',
'Expires': '0'
}
response = requests.get(
'https://example.com/prices',
proxies={'http': proxy, 'https': proxy},
headers=headers
)
Eğer sağlayıcı yine de önbellekliyorsa, URL'ye rastgele bir parametre ekleyin:
import time
url = f'https://example.com/prices?_nocache={int(time.time())}'
2. Coğrafi Konum (Geolocation) Uyuşmazlığı
Almanya'dan bir proxy talep ediyorsunuz ama sonuç olarak ruble cinsinden fiyatlar alıyorsunuz. Veya Rusya verilerine ihtiyacınız var ama site ABD içeriği gösteriyor. Bunun birkaç nedeni olabilir.
Coğrafi Konum Neden Uyuşmuyor?
| Neden | Açıklama |
|---|---|
| Eski GeoIP Veritabanları | IP yakın zamanda başka bir bölgeye taşındı, ancak veritabanları henüz güncellenmedi |
| Site Kendi Veritabanını Kullanıyor | Hedef site, proxy sağlayıcısından farklı bir coğrafi konum belirleme yöntemi kullanıyor |
| Önceki Oturumun Çerezleri | Site, önceki ziyaretinizden bölgenizi hatırlıyor |
| Accept-Language | Dil başlığı, proxy coğrafyasıyla eşleşmiyor |
Çözüm
İstek parametrelerini istenen coğrafi konumla senkronize edin:
# Alman sitesi için kazıma
headers = {
'Accept-Language': 'de-DE,de;q=0.9,en;q=0.8',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)...'
}
# Çerezsiz temiz oturum
session = requests.Session()
session.cookies.clear()
response = session.get(
'https://example.de/preise',
proxies={'http': german_proxy, 'https': german_proxy},
headers=headers
)
Kazımadan önce IP'nin gerçek coğrafi konumunu kontrol edin:
def check_proxy_geo(proxy):
response = requests.get(
'http://ip-api.com/json/',
proxies={'http': proxy, 'https': proxy},
timeout=10
)
data = response.json()
return data.get('country'), data.get('city')
3. IP Rotasyonu Sorunları
Otomatik IP rotasyonu özelliğine sahip rezidansiyel proxy'ler kullanıldığında, IP'ler istekler arasında değişir. Bu, limitleri aşmayı önlemek için faydalı olsa da, veri tutarlılığı gerektiğinde sorun yaratır.
Tipik Belirtiler
- Sayfalama (pagination) yinelenen öğeler döndürür veya bazılarını atlar
- Sepet, istekler arasında temizlenir
- Oturum ortasında kimlik doğrulama düşer
- A/B testleri sitenin farklı sürümlerini gösterir
Çözüm: Yapışkan Oturumlar (Sticky Sessions)
Çoğu proxy sağlayıcısı, IP'yi belirli bir süre koruyan "yapışkan oturumları" destekler. Bu genellikle bağlantı dizesindeki bir parametreyle ayarlanır:
# Oturum kimliği içeren format örneği (sözdizimi sağlayıcıya bağlıdır)
proxy = 'http://user-session-abc123:pass@gate.provider.com:7777'
# Tek bir IP üzerinden giden tüm istekler
for page in range(1, 10):
response = requests.get(
f'https://example.com/catalog?page={page}',
proxies={'http': proxy, 'https': proxy}
)
Önemli: Yapışkan oturumlar genellikle 1-30 dakika sürer. Veri toplama işlemlerinizi bu süre aralığına sığacak şekilde planlayın.
4. Oturum (Session) ve Çerez (Cookie) İhlalleri
Modern web siteleri kişiselleştirme için yoğun olarak çerezler kullanır. Kazıma programınız bunları doğru işlemezse, yanlış veriler alırsınız veya tamamen engellenirsiniz.
Sık Yapılan Hatalar
- Set-Cookie'yi Yoksayma - Site oturumu takip edemez
- Farklı IP ile Çerez Kullanımı - Şüpheli davranışa yol açar
- Başlangıç İsteğinin Eksikliği - Doğrudan iç sayfaya gitmek, ana sayfadan "giriş" yapmadan
Doğru Yaklaşım
import requests
def create_browser_session(proxy):
session = requests.Session()
session.proxies = {'http': proxy, 'https': proxy}
# İlk ziyareti taklit etme - çerezleri alma
session.get('https://example.com/', headers={
'User-Agent': 'Mozilla/5.0...',
'Accept': 'text/html,application/xhtml+xml...',
'Accept-Language': 'en-US,en;q=0.9'
})
# Artık geçerli bir oturumla kazıma yapılabilir
return session
session = create_browser_session(proxy)
data = session.get('https://example.com/api/prices').json()
5. Kodlama ve Sıkıştırma Hataları
Bazen veriler doğru gelir ancak kodlama veya sıkıştırma sorunları nedeniyle yanlış görüntülenir. Özellikle Kiril alfabesi ve Asya dilleriyle çalışırken bu durum sıkça görülür.
Belirtiler
- Metin yerine garip karakterler:
Ценаyerine «Цена» - Gzip etkinleştirildiğinde boş yanıt
- HTML yerine ikili çöp
Çözüm
import requests
response = requests.get(url, proxies=proxies)
# Yöntem 1: Kodlamayı otomatik algılama
response.encoding = response.apparent_encoding
text = response.text
# Yöntem 2: Kodlamayı zorlama
text = response.content.decode('utf-8')
# Yöntem 3: Sıkıştırmayı devre dışı bırakma (eğer proxy gzip'i bozuyorsa)
headers = {'Accept-Encoding': 'identity'}
response = requests.get(url, proxies=proxies, headers=headers)
6. Gizli Engellemeler ve Captcha'lar
Her engelleme açıkça görünmez. Site, HTTP 200 kodu döndürmesine rağmen, gerçek veriler yerine bir yer tutucu, eski önbellek veya normal HTML içine yerleştirilmiş bir captcha sayfası sunabilir.
Gizli Engellemenin İşaretleri
- Yanıt boyutu şüpheli derecede küçük veya farklı sayfalar için aynı
- HTML içinde şu kelimeler bulunuyor: captcha, challenge, blocked, access denied
- Beklenen öğelerin (fiyatlar, açıklamalar, düğmeler) olmaması
- Başka bir sayfaya JavaScript yönlendirmesi
Yanıt Doğrulaması
def is_valid_response(response, expected_markers):
"""Yanıtın gerçek veri içerip içermediğini kontrol eder"""
text = response.text.lower()
# Engelleme sinyallerini kontrol etme
block_signals = ['captcha', 'blocked', 'access denied',
'rate limit', 'try again later']
for signal in block_signals:
if signal in text:
return False, f'Engellendi: {signal}'
# Beklenen verilerin varlığını kontrol etme
for marker in expected_markers:
if marker.lower() not in text:
return False, f'Eksik: {marker}'
# Boyut kontrolü (çok küçükse = yer tutucu)
if len(response.content) < 5000:
return False, 'Yanıt çok küçük'
return True, 'OK'
# Kullanım
valid, reason = is_valid_response(response, ['price', 'add to cart'])
if not valid:
print(f'Geçersiz yanıt: {reason}')
# Proxy değiştir, bekle, tekrar dene
Ciddi bot korumasına sahip siteler için, veri merkezlerinden ziyade mobil proxy'ler daha yüksek güvenilirlik düzeyi sunar.
7. Adım Adım Teşhis
Proxy yanlış veri döndürdüğünde, sorunun kaynağını hızlıca bulmak için şu algoritmayı kullanın:
Adım 1: Sorunu İzolasyon
# Yanıtları karşılaştır: proxy'siz vs proxy'li
def compare_responses(url, proxy):
direct = requests.get(url)
proxied = requests.get(url, proxies={'http': proxy, 'https': proxy})
print(f'Doğrudan: {len(direct.content)} bayt, durum kodu {direct.status_code}')
print(f'Proxy ile: {len(proxied.content)} bayt, durum kodu {proxied.status_code}')
# Karşılaştırma için her iki yanıtı da kaydedin
with open('direct.html', 'w') as f:
f.write(direct.text)
with open('proxied.html', 'w') as f:
f.write(proxied.text)
Adım 2: Yanıt Başlıklarını Kontrol Edin
response = requests.get(url, proxies=proxies)
# Teşhis için önemli başlıklar
important_headers = ['content-type', 'content-encoding',
'cache-control', 'age', 'x-cache',
'cf-ray', 'server']
for header in important_headers:
value = response.headers.get(header, 'ayarlanmadı')
print(f'{header}: {value}')
Adım 3: Kontrol Listesi
| Kontrol | Komut/Metot |
|---|---|
| Proxy'nin Gerçek IP'si | curl -x proxy:port ifconfig.me |
| IP Coğrafi Konumu | ip-api.com/json |
| Önbellekleme | Age, X-Cache başlıkları |
| Engelleme | HTML içinde "captcha", "blocked" araması |
| Kodlama | Content-Type charset |
Adım 4: Tam Teşhis Betiği
import requests
import json
def diagnose_proxy(proxy, target_url):
report = {}
# 1. Çalışma Durumu Kontrolü
try:
r = requests.get('http://httpbin.org/ip',
proxies={'http': proxy, 'https': proxy},
timeout=15)
report['proxy_ip'] = r.json().get('origin')
report['proxy_works'] = True
except Exception as e:
report['proxy_works'] = False
report['error'] = str(e)
return report
# 2. Coğrafi Konum
r = requests.get('http://ip-api.com/json/',
proxies={'http': proxy, 'https': proxy})
geo = r.json()
report['country'] = geo.get('country')
report['city'] = geo.get('city')
# 3. Hedef Siteye İstek
r = requests.get(target_url,
proxies={'http': proxy, 'https': proxy},
timeout=30)
report['status_code'] = r.status_code
report['content_length'] = len(r.content)
report['cached'] = 'age' in r.headers or 'x-cache' in r.headers
# 4. Engelleme Kontrolü
block_words = ['captcha', 'blocked', 'denied', 'cloudflare']
report['possibly_blocked'] = any(w in r.text.lower() for w in block_words)
return report
# Kullanım
result = diagnose_proxy('http://user:pass@proxy:port', 'https://target-site.com')
print(json.dumps(result, indent=2))
Sonuç
Proxy'den gelen yanlış veriler neredeyse her zaman çözülebilir bir sorundur. Çoğu durumda neden önbellekleme, coğrafi konum uyuşmazlığı veya oturum yönetimi hatalarından kaynaklanır. Sorunun kaynağını hızlıca bulmak için bu makaledeki teşhis betiğini kullanın.
Coğrafi konum doğruluğunun ve düşük engellenme oranının kritik olduğu görevler için, yapışkan oturumları destekleyen rezidansiyel proxy'ler en uygunudur — daha fazla bilgi için proxycove.com adresini ziyaret edin.