İçeriğe geç

Python ile web sitesi parsing: engelleri aşmak için proxy kullanımı

Кейсы
Python ile web sitesi parsing: engelleri aşmak için proxy kullanımı

Python ile web sitesi verisi çekme (parsing), özellikle büyük ölçekte, otomatik veri çıkarımını engellemek için tasarlanmış anti-bot önlemleriyle kaçınılmaz olarak karşılaşır. Proxy'ler bu sorunun temel çözümüdür: IP adresinizi gizleyen, kimlikleri rotasyona sokan ve coğrafi hedefleme sağlayan vazgeçilmez bir katman olarak çalışır; böylece hedef sitelerin uyguladığı istek limitlerini (rate limit), IP yasaklarını ve coğrafi kısıtlamaları etkili biçimde aşarsınız.

Modern veri ortamında web parsing'in önemi

Günümüzün dijital ekonomisinde, herkese açık web verilerini verimli şekilde toplayıp analiz edebilmek kritik bir rekabet avantajıdır. Şirketler web parsing'i pek çok amaçla kullanır: pazar araştırması, rekabet istihbaratı, fiyat takibi, potansiyel müşteri (lead) üretimi, duygu analizi ve akademik araştırma bunlardan bazılarıdır. requests, BeautifulSoup ve Selenium gibi güçlü kütüphane ekosistemiyle Python, gelişmiş web scraper'lar geliştirmek için tercih edilen dil olarak öne çıkar.

Ancak otomatik veri toplama eylemi çoğu zaman site sahiplerinin çıkarlarıyla çatışır ve giderek daha gelişmiş anti-bot ile anti-scraping mekanizmalarının devreye alınmasına yol açar. Bu önlemler otomatik erişimi tespit edip caydırmak; sunucu kaynaklarını, fikri mülkiyeti ve kullanıcı gizliliğini korumak için tasarlanır. Parsing yapanların karşılaştığı yaygın zorluklar şunlardır:

  • IP engelleme: Siteler, kısa sürede çok fazla istek gönderen IP adreslerini tespit edip engeller.
  • Rate limiting: Bir IP'nin belirli bir zaman aralığında yapabileceği istek sayısına üst sınır konulması.
  • CAPTCHA'lar: İnsan kullanıcıları botlardan ayırmak için tasarlanmış doğrulamalar.
  • User-Agent dizesi kontrolleri: Tarayıcıya ait olmayan veya güncel olmayan user-agent dizelerinin tespiti.
  • Coğrafi kısıtlamalar: İçeriğe erişimin kullanıcının coğrafi konumuna göre sınırlanması.
  • Honeypot'lar ve tuzaklar: Otomatik tarayıcıları yakalamak için yerleştirilen gizli bağlantılar veya öğeler.
  • JavaScript ile oluşturulan içerik: Dinamik içeriğin görüntülenmesi için tam bir tarayıcı ortamı gerektirir.

Bu zorlukları çözmeden büyük ölçekli parsing denemek, kaçınılmaz olarak anında engellenmeye, eksik veri kümelerine ve boşa harcanan işlem kaynaklarına yol açar. Yerel makinenizden veya bir bulut sunucusundan tek bir IP adresiyle doğrudan çalışmak, ciddi hiçbir web parsing projesi için sürdürülebilir değildir.

Sağlam parsing'in temel taşı olarak proxy'ler

Proxy'ler, Python scraper'ınız ile hedef site arasında aracı bir sunucu görevi görür. Scraper'ınız siteye doğrudan bağlanmak yerine isteğini proxy sunucusuna gönderir, o da isteği hedef siteye iletir. Site sizin IP adresinizi değil, proxy sunucusunun IP adresini görür. Proxy'leri web parsing için vazgeçilmez kılan temel mekanizma budur.

Proxy'ler anti-bot sorunlarını birkaç kritik yoldan doğrudan çözer:

  • IP rotasyonu: İstekleri çok sayıda farklı IP adresinden oluşan bir havuz üzerinden yönlendiren proxy'ler, tek bir IP'nin istek limitlerine takılmasını veya şüpheli etkinlik olarak işaretlenmesini engeller. Her istek ya da bir dizi istek farklı bir IP'den çıkabilir ve böylece çok sayıda bireysel kullanıcının davranışı taklit edilir.
  • Coğrafi hedefleme: Belirli ülkelerde veya bölgelerde bulunan proxy'ler, scraper'ınızın coğrafi kısıtlamalı içeriğe erişmesini sağlar. Bu, farklı bölgelerde pazar araştırması yapmak ya da bölgesel içerik engellerini aşmak için kritiktir. Örneğin GProxy, dünya genelinde yüzlerce lokasyondan proxy seçmenize imkân veren kapsamlı coğrafi hedefleme seçenekleri sunar.
  • Anonimlik ve güvenlik: Proxy'ler gerçek IP adresinizi gizler; parsing sürecinde bir anonimlik katmanı ekler ve kimliğinizi korur. Bu, özellikle hassas verilerle veya rekabet istihbaratıyla çalışırken önemlidir.
  • Yük dağıtımı: Büyük ölçekli parsing işlerinde sağlam bir proxy ağı, istek yükünü birden çok IP adresine dağıtır; hiçbir IP'nin saldırgan bir bot gibi görünmemesini sağlar ve veriye daha hızlı, daha verimli ulaşmanızı mümkün kılar.
  • Yasakları aşma: Bir IP engellenirse scraper havuzdaki başka bir IP'ye geçer ve çalışma kesintisiz devam eder.

Ciddi her web parsing girişimi için yüksek kaliteli bir proxy hizmetini entegre etmek bir seçenek değil, zorunluluktur. GProxy, bu ihtiyaçları karşılamak için özel olarak tasarlanmış çeşitli proxy çözümleri sunar ve başarılı veri çıkarımı için gereken güvenilir, yüksek hızlı ve temiz IP adreslerini sağlar.

Optimal parsing stratejileri için proxy türlerini anlamak

Bütün proxy'ler aynı değildir. Doğru proxy türünü seçmek, parsing operasyonunuzun başarısı ve verimliliği açısından belirleyicidir. En uygun seçim; hedef sitenin anti-bot gelişmişliğine, ihtiyaç duyulan veri hacmine ve bütçenize bağlıdır.

Residential proxy'ler

Residential proxy'ler, internet servis sağlayıcılarının (ISP) gerçek ev kullanıcılarına atadığı IP adresleridir. Fiziksel konumlar ve cihazlarla ilişkilendirilmiş meşru IP adresleridir. Bu da onları siteler nezdinde son derece güvenilir kılar; çünkü internette gezinen gerçek insanlardan geliyor gibi görünürler. Sitelerin, residential proxy üzerinden gelen bir isteği gerçek bir kullanıcının isteğinden ayırt etmesi son derece zordur.

  • Artıları: En yüksek anonimlik ve güven düzeyi, gelişmiş anti-bot sistemlerini aşmakta mükemmel, şehir/eyalet düzeyinde coğrafi hedefleme, nadiren engellenir.
  • Eksileri: Gerçek kullanıcı cihazları üzerinden yönlendirildiği için genelde veri merkezi proxy'lerinden daha yavaştır; maliyeti daha yüksektir.
  • Kullanım alanları: Çok korumalı sitelerden veri çekme (e-ticaret, sosyal medya, uçuş toplayıcıları), reklam doğrulama, marka koruma, coğrafi kısıtlamalı içeriğe yüksek güvenle erişim. GProxy'nin residential ağı dünya genelinde milyonlarca IP'ye erişim sağlar ve en zorlu hedeflerde bile benzersiz başarı oranları sunar.

Veri merkezi proxy'leri

Veri merkezi proxy'leri, çoğunlukla büyük veri merkezlerinde barındırılan ikincil şirketler tarafından sağlanan IP adresleridir. Bir ISP veya fiziksel bir ev adresiyle ilişkili değildirler. Hız ve maliyet avantajı sunsalar da "dijital ayak izleri" gelişmiş anti-bot sistemleri tarafından bazen daha kolay tespit edilebilir; özellikle çok sayıda istek aynı alt ağdan (subnet) geliyorsa.

  • Artıları: Çok yüksek hız, IP başına daha düşük maliyet, anonimliğin daha az kritik olduğu yüksek hacimli istekler için ideal, geniş havuzlar mevcut.
  • Eksileri: Residential IP'lere kıyasla daha düşük güven düzeyi, gelişmiş anti-bot sistemleri tarafından tespit ve engellenmeye daha açık, sınırlı coğrafi hedefleme (genelde ülke/şehir düzeyinde, residential kadar ayrıntılı değil).
  • Kullanım alanları: Daha az korumalı sitelerden veri çekme, hızın öncelikli olduğu büyük ölçekli veri toplama, herkese açık bilgilere erişim (örneğin haber siteleri, genel dizinler), SEO takibi.

Mobil proxy'ler

Mobil proxy'ler, mobil operatörlerin mobil cihazlara (akıllı telefon, tablet) atadığı IP adreslerini kullanır. Dinamik yapıları ve tek bir mobil IP adresini çoğu zaman çok sayıda kullanıcının paylaşması nedeniyle en güvenilir proxy türüdür. Siteler, meşru mobil kullanıcıları engelleme riski nedeniyle mobil IP'leri nadiren engeller.

  • Artıları: Son derece yüksek güven, en agresif anti-bot sistemlerini aşmakta mükemmel, oldukça dinamik IP'ler.
  • Eksileri: En pahalı proxy türü, genelde veri merkezi proxy'lerinden daha yavaş, havuzlar daha küçük.
  • Kullanım alanları: Çok hassas, mobil öncelikli sitelerden veri çekme, çok katı anti-bot önlemleri olan sosyal medya platformları, uygulama verisi toplama.

Paylaşımlı ve özel (dedicated) proxy'ler

  • Paylaşımlı proxy'ler: Bu IP'ler aynı anda birden çok müşteri tarafından kullanılır. Daha ucuzdur, ancak başka kullanıcıların kötü niyetli faaliyetleri yüzünden "yanmış" olma riski taşır.
  • Özel (dedicated) proxy'ler: Bu IP'ler yalnızca tek bir kullanıcıya tahsis edilir. Daha yüksek güvenilirlik, daha iyi performans ve daha temiz bir geçmiş sunar; bu da onları kritik parsing görevleri için ideal kılar. GProxy hem residential hem de veri merkezi proxy'leri için özel (dedicated) seçenekler sunar.

HTTP/HTTPS ve SOCKS5 proxy'leri

  • HTTP/HTTPS proxy'leri: Öncelikli olarak web trafiği (HTTP/HTTPS) için tasarlanmış uygulama katmanı proxy'leridir. Web protokollerini anlar ve başlıkları değiştirebilirler. Web scraping işlerinin çoğu bunları kullanır.
  • SOCKS5 proxy'leri: Yalnızca HTTP/HTTPS değil, her tür trafiği ve protokolü işleyebilen daha alt seviye proxy'lerdir. Daha çok yönlüdürler, ancak genelde ağ trafiğini yorumlamaz, ham veri aktarımı sunarlar. Web dışı scraping görevleri için veya daha yüksek düzeyde anonimlik istendiğinde kullanışlıdır.
Özellik Residential proxy'ler Veri merkezi proxy'leri Mobil proxy'ler
Güven düzeyi En yüksek (gerçek ISP IP'leri) Orta (ticari IP'ler) Son derece yüksek (mobil operatör IP'leri)
Hız Orta Çok yüksek Orta ile düşük arası
Maliyet Yüksek Düşük ile orta arası Çok yüksek
Tespit riski Çok düşük Orta ile yüksek arası Son derece düşük
Coğrafi hedefleme Çok ayrıntılı (şehir/eyalet) Ülke/büyük şehir Ülke/büyük şehir
En uygun kullanım Karmaşık, çok korumalı siteler; coğrafyaya özgü veriler Yüksek hacimli, daha az korumalı siteler; hızın kritik olduğu işler Aşırı hassas siteler; sosyal medya; uygulama verileri

GProxy gibi güvenilir bir sağlayıcıdan doğru proxy türünü seçmek, etkili ve dayanıklı bir web parsing sistemi kurmanın ilk kritik adımıdır.

Python ile web sitesi parsing: engelleri aşmak için proxy nasıl kullanılır

Web parsing için Python'da proxy uygulaması

Popüler kütüphanelerle proxy'leri Python parsing betiklerinize entegre etmek oldukça basittir. Statik içerik için requests, dinamik ve JavaScript ile oluşturulan içerik için Selenium konularını ele alacağız.

requests kütüphanesini kullanmak

requests kütüphanesi, Python'da HTTP istekleri yapmanın fiilî standardıdır. Proxy yapılandırması için basit bir yol sunar.

Temel proxy kurulumu

Proxy yapılandırmanızı, protokolleri proxy URL'lerine eşleyen bir sözlük olarak tanımlarsınız.

import requests

# GProxy kimlik bilgilerinizle ve proxy endpoint'inizle değiştirin
proxy_host = "proxy.gproxy.net"
proxy_port = 12345
proxy_user = "your_username"
proxy_pass = "your_password"

proxies = {
    "http": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
    "https": f"http://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
}

target_url = "http://httpbin.org/ip" # IP'nizi gösteren basit bir servis

try:
    response = requests.get(target_url, proxies=proxies, timeout=10)
    response.raise_for_status() # Hatalı durum kodları için istisna fırlatır
    print(f"Request successful! IP used: {response.json()['origin']}")
except requests.exceptions.RequestException as e:
    print(f"Request failed: {e}")

SOCKS5 proxy'leri için proxy URL'sinde "socks5://" belirtirsiniz:

proxies_socks5 = {
    "http": f"socks5://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
    "https": f"socks5://{proxy_user}:{proxy_pass}@{proxy_host}:{proxy_port}",
}

Birden çok proxy ile çalışmak (basit rotasyon)

Sürekli parsing için bir proxy havuzuna ve bunları rotasyona sokacak bir mekanizmaya ihtiyacınız olacak. Temel bir round-robin yaklaşımı iyi bir başlangıçtır.

import requests
import random
import time

# GProxy proxy listesi (kendi gerçek listenizle değiştirin)
# Biçim: "user:pass@host:port"
proxy_list = [
    "user1:[email protected]:12345",
    "user2:[email protected]:12345",
    "user3:[email protected]:12345",
    # ... daha fazla proxy
]

def get_random_proxy():
    proxy_str = random.choice(proxy_list)
    return {
        "http": f"http://{proxy_str}",
        "https": f"http://{proxy_str}",
    }

target_url = "http://httpbin.org/ip"

for i in range(5): # Proxy'leri değiştirerek 5 istek yapar
    current_proxies = get_random_proxy()
    print(f"Attempting request {i+1} with proxy: {current_proxies['http'].split('@')[1]}")
    try:
        response = requests.get(target_url, proxies=current_proxies, timeout=15)
        response.raise_for_status()
        print(f"Success! Origin IP: {response.json()['origin']}")
    except requests.exceptions.RequestException as e:
        print(f"Request failed: {e}")
    time.sleep(random.uniform(1, 3)) # Rastgele bir gecikme ekler

Dinamik içerik için Selenium kullanmak

Siteler içeriği oluşturmak için büyük ölçüde JavaScript'e dayanıyorsa, Selenium gibi bir headless tarayıcı otomasyon aracı gereklidir. Selenium'u tarayıcı seçenekleri üzerinden proxy kullanacak şekilde yapılandırabilirsiniz.

Chrome ile proxy kurulumu (gizlilik için undetected_chromedriver önerilir)

Daha güçlü bir gizlilik için, yaygın bot tespit tekniklerini aşmaya çalıştığından, standart selenium.webdriver.Chrome yerine sıklıkla undetected_chromedriver tercih edilir.

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import undetected_chromedriver as uc
import time

# GProxy kimlik bilgilerinizle ve proxy endpoint'inizle değiştirin
proxy_host = "proxy.gproxy.net"
proxy_port = 12345
proxy_user = "your_username"
proxy_pass = "your_password"

# Chrome seçeneklerini ayarla
chrome_options = Options()
# chrome_options.add_argument("--headless") # Headless mod için yorum satırını kaldırın
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument(f"--proxy-server=http://{proxy_host}:{proxy_port}") # HTTP/HTTPS için

# Kimlik doğrulamalı proxy'ler için Selenium bir uzantı gerektirir
# Ya da undetected_chromedriver kullanıyorsanız kimlik bilgilerini çoğu zaman doğrudan proxy dizesinde geçebilirsiniz
# Yine de sağlamlık açısından, kimlik doğrulama için genelde bir proxy uzantısı daha güvenilirdir.

# Selenium'da kimlik doğrulamalı proxy'leri ele almanın basit bir yolu proxy uzantısıdır
# Bu örnekte sadelik adına, kimlik doğrulaması olmayan bir proxy varsayacağız ya da
# undetected_chromedriver'ın kimlik doğrulamayı --proxy-server dizesi üzerinden hallettiğini kabul edeceğiz.
# Daha karmaşık kimlik doğrulama için bir proxy uzantısının CRX dosyasını üretmeniz gerekir.

# undetected_chromedriver'ı başlat
driver = uc.Chrome(options=chrome_options)

# Proxy'niz kimlik doğrulama istiyorsa ve uzantı kullanmıyorsanız,
# proxy dizesi doğru biçimlendirildiğinde undetected_chromedriver bunu çoğu zaman halleder.
# Ancak standart Selenium'da genellikle bir uzantı gerekir.
# Kimlik bilgilerini doğrudan geçmeyi deneyelim; UC'de bu bazen işe yarar.
# Not: Standart Selenium'da bu genellikle bir proxy uzantısı veya özel bir driver kurulumu gerektirir.
# `uc.Chrome` yapıcısı `user:pass@host:port` biçimini daha iyi ele alabilir.

# UC için doğrudan proxy dizesi örneği (değişkenlik gösterebilir)
# GProxy residential proxy'leriniz IP whitelist ile çalışıyorsa dizede user/pass gerekmez.
# user/pass gerekiyorsa, `undetected_chromedriver` kütüphanesi bu konuda genelde daha akıllıdır.
# Sadelik için kimlik doğrulamasız proxy sunucusu argümanına bağlı kalalım
# ya da proxy'nin IP whitelist'te olduğunu varsayalım.
# IP whitelist olmadan kimlik doğrulamalı proxy'lerde genelde bir proxy uzantısı kullanılır.

target_url = "http://httpbin.org/ip" # Ya da JS ağırlıklı dinamik bir site

try:
    driver.get(target_url)
    print(f"Current URL: {driver.current_url}")
    # İçeriği burada ayrıştırırsınız, örneğin driver.find_element_by_tag_name("pre").text
    # httpbin.org/ip adresinde IP doğrudan body veya pre etiketinde görünür.
    print(f"Page content (showing IP): {driver.find_element('tag name', 'body').text}")
except Exception as e:
    print(f"Selenium request failed: {e}")
finally:
    driver.quit()

Standart Selenium'da kimlik doğrulamalı proxy'ler için genellikle kimlik doğrulamayı yönetecek özel bir Chrome uzantısı oluşturmanız gerekir; bu da daha zahmetlidir. undetected_chromedriver, kimlik bilgilerini doğrudan geçmeye çalışarak veya IP whitelist bekleyerek bunu çoğu zaman basitleştirir.

User-Agent ve başlıkların yönetimi

Proxy'lerin ötesinde, user-agent'ları ve diğer HTTP başlıklarını rotasyona sokmak da kritiktir. Siteler botları tespit etmek için bunları inceler. Her zaman gerçekçi ve değişen bir user-agent dizesi gönderin ve Accept-Language, Referer, Connection gibi diğer başlıkları da göz önünde bulundurun.

import requests
import random

user_agents = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 13_1) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.1 Safari/605.1.15",
]

def get_random_headers():
    return {
        "User-Agent": random.choice(user_agents),
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Language": "en-US,en;q=0.5",
        "Connection": "keep-alive",
    }

# requests ile örnek kullanım
headers = get_random_headers()
# response = requests.get(target_url, proxies=current_proxies, headers=headers)

Hata yönetimi

Üretim düzeyinde her scraper için sağlam hata yönetimi kritiktir. Buna bağlantı hatalarını, HTTP durum kodlarını (örneğin 403 Forbidden, 429 Too Many Requests) yakalamak ve muhtemelen farklı bir proxy ile yeniden deneme mantığı kurmak dahildir.

import requests
import time

def make_request_with_retry(url, proxies, headers, max_retries=3):
    for attempt in range(max_retries):
        try:
            response = requests.get(url, proxies=proxies, headers=headers, timeout=20)
            response.raise_for_status() # Hatalı yanıtlar için HTTPError fırlatır (4xx veya 5xx)
            return response
        except requests.exceptions.HTTPError as e:
            print(f"HTTP Error on attempt {attempt+1}: {e.response.status_code} - {e.response.reason}")
            if e.response.status_code in [403, 429]: # Forbidden veya Too Many Requests
                print("Switching proxy and retrying...")
                # Gerçek bir senaryoda burada yeni bir proxy alırsınız
                time.sleep(random.uniform(5, 10)) # Yeniden denemeden önce bekle
            else:
                raise # Diğer HTTP hatalarını yeniden fırlat
        except requests.exceptions.RequestException as e:
            print(f"Network/Connection Error on attempt {attempt+1}: {e}")
            print("Retrying with current proxy after delay...")
            time.sleep(random.uniform(3, 7)) # Ağ sorunları için bekle
    raise Exception(f"Failed to retrieve {url} after {max_retries} attempts.")

# Örnek kullanım:
# response = make_request_with_retry(target_url, get_random_proxy(), get_random_headers())
Python ile web sitesi parsing: engelleri aşmak için proxy nasıl kullanılır

İleri düzey proxy yönetimi ve en iyi uygulamalar

Büyük ölçekli, sürekli parsing operasyonlarında basit bir round-robin proxy rotasyonu her zaman yeterli olmaz. İleri düzey yönetim teknikleri verimliliği ve güvenilirliği sağlar, engellenmeleri en aza indirir.

Proxy havuzu yönetimi

İyi yönetilen bir proxy havuzu, başarılı bir scraper'ın belkemiğidir. Bu, yalnızca bir proxy listesine sahip olmaktan fazlasını gerektirir.

  • Proxy'leri yükleme: Proxy listenizi bir dosyadan (CSV, JSON), bir veritabanından ya da doğrudan proxy sağlayıcısının API'sinden yükleyin. GProxy, kolay entegrasyon ve dinamik proxy alımı için API'ler sunar.
  • Akıllı rotasyon: Round-robin'in ötesine geçip akıllı rotasyon uygulayın. Bir proxy 403 veya 429 durum koduyla başarısız olursa onu "kötü" ya da "geçici olarak engelli" işaretleyin ve belirli bir süre (örneğin 10-30 dakika) kullanmayın. Taze, henüz kullanılmamış proxy'lere öncelik verin.
  • Proxy doğrulama ve sağlık kontrolleri: Proxy'lerinizin sağlığını ve gecikmesini düzenli olarak kontrol edin. Sürekli yavaş olan, erişilemeyen ya da yanlış içerik döndüren proxy'leri kaldırın veya işaretleyin. httpbin.org/ip gibi bir servise yapılan basit bir kontrol, bağlantıyı ve IP adresini doğrulamaya yeter.
  • Sticky oturumlar: Bazı siteler bir dizi istek boyunca aynı IP adresinin korunmasını gerektirir (örneğin giriş yapma, sepete ekleme). GProxy'nin sticky residential proxy'lerini kullanın; bunlar yeni bir IP'ye geçmeden önce aynı IP'yi yapılandırılabilir bir süre boyunca (örneğin 10 dakika, 30 dakika) korur.

Rate limiting ve throttling

Proxy'lerle bile, tek bir IP'den (rotasyona giren bir IP olsa dahi) bir siteye fazla agresif yüklenmek engellenmeye yol açabilir. İstekler arasına gecikmeler koyun.

  • time.sleep(): En basit yaklaşım, istekler arasına rastgele bir gecikme eklemektir (örneğin time.sleep(random.uniform(1, 5))). Rastgele gecikmeler, sabit gecikmelere kıyasla insan davranışını daha iyi taklit eder.
  • Üstel geri çekilme (exponential backoff): Bir istek başarısız olduğunda (örneğin 429 durumu), yeniden denemeden önce üstel olarak artan bir süre bekleyin. Örneğin önce 2 saniye, sonra 4, sonra 8 saniye.
  • Eşzamanlılık limitleri: Tek bir alan adına yapılan eşzamanlı istek sayısını yönetin. Farklı proxy'lerle bile olsa aynı hedefe aynı anda yüzlerce bağlantı açmayın.

requests.Session() ile oturum yönetimi

requests.Session() kullanmak faydalıdır; çünkü çerezler ve bağlantı havuzu gibi bazı parametreleri istekler arasında korur. Bu, performansı iyileştirebilir ve aynı proxy üzerinden yapılan birden çok istekte tutarlı bir "kimlik" korumaya yardımcı olur.

import requests

s = requests.Session()
s.proxies = get_random_proxy() # Oturum için proxy ayarla
s.headers.update(get_random_headers()) # Oturum için başlıkları ayarla

try:
    response1 = s.get("http://example.com/page1")
    # Çerezler ve bağlantı sonraki isteklerde yeniden kullanılır
    response2 = s.get("http://example.com/page2")
except requests.exceptions.RequestException as e:
    print(f"Session request failed: {e}")

Proxy'lerin ötesinde gizlilik (stealth) teknikleri

Proxy'ler şarttır, ancak daha büyük bir bulmacanın yalnızca bir parçasıdır. İnsan davranışını gerçekten taklit etmek ve gelişmiş bot tespitinden kaçmak için:

  • Gerçekçi User-Agent dizeleri: Gösterildiği gibi, güncel tarayıcılara ait çeşitli user-agent'ları rotasyona sokun.
  • Tarayıcı parmak izi (fingerprinting): Selenium kullanırken yaygın Selenium tespit vektörlerinden kaçının. undetected_chromedriver gibi kütüphaneler bu konuda yardımcı olur.
  • Referer başlıkları: Gezinmeyi taklit etmek için gerçekçi Referer başlıkları gönderin.
  • Çerez yönetimi: Çerezleri gerçek bir tarayıcı gibi kabul edin ve yönetin. requests.Session() bunu otomatik olarak yapar.
  • JavaScript çalıştırma: Büyük ölçüde JavaScript'e dayanan siteler için Selenium veya Playwright gereklidir. Tarayıcı ortamınızın tüm tarayıcı yeteneklerine sahip olduğundan emin olun.
  • Rastgele gecikmeler: Eylemler ve istekler arasına insana benzer, tekdüze olmayan gecikmeler koyun.

Yaygın tuzaklar ve sorun giderme

En iyi stratejilerle bile parsing bir kedi-fare oyunudur. Yaygın tuzakları anlamak, etkili sorun gidermeye yardımcı olur.

  • Proxy tükenmesi: Taze, engellenmemiş IP'lerin bitmesi. Bu, ücretsiz veya düşük kaliteli proxy listelerinde yaygın bir sorundur. GProxy gibi bir sağlayıcıdan geniş ve çeşitli, yüksek kaliteli bir residential proxy havuzuna yatırım yapmak bunu büyük ölçüde azaltır.
  • Düşük proxy kalitesi: Güvenilmez, yavaş veya çoktan "yanmış" proxy'ler kullanmak. Ücretsiz proxy'ler neredeyse her zaman zaman kaybıdır. Genelde aşırı yüklüdür, yavaştır veya hızla engellenir. Her zaman itibarlı ücretli hizmetleri tercih edin.
  • Hatalı yapılandırma: Proxy URL'lerindeki basit yazım hataları, yanlış portlar veya hatalı kimlik doğrulama bilgileri. Proxy dizelerinizi iki kez kontrol edin ve sağlayıcının belirttiği biçimle eşleştiğinden emin olun.
  • IP'nin ötesinde site parmak izi: Siteler, IP rotasyona girse bile botları tespit etmek için çeşitli teknikler kullanır. Buna user-agent, HTTP başlıkları, tarayıcı özellikleri (örneğin ekran boyutu, eklentiler), JavaScript çalıştırma kalıpları ve hatta fare hareketlerinin analizi dahildir. İyi proxy'lere rağmen engelleniyorsanız bu diğer vektörleri inceleyin.
  • CAPTCHA'lar: Proxy'ler CAPTCHA'ları çözmez. Sürekli CAPTCHA ile karşılaşıyorsanız bir CAPTCHA çözüm servisiyle (örneğin 2Captcha, Anti-Captcha) entegrasyonu değerlendirin ya da scraping deseninizi daha az bot benzeri olacak şekilde yeniden gözden geçirin.
  • Coğrafi kısıtlama uyumsuzluğu: Bölgeye özgü içerik için yanlış coğrafi konumdan proxy kullanmak. Hedef içeriğin bölgesini doğrulayın ve GProxy'nin geniş lokasyon seçenekleri arasından uygun proxy'leri seçin.
  • SSL/TLS hataları: Güncel olmayan Python sürümleri veya eksik SSL sertifikaları, özellikle proxy üzerinden yönlendirme yaparken HTTPS sitelerinde hatalara yol açabilir. Python ortamınızın güncel ve SSL için doğru yapılandırılmış olduğundan emin olun.

Öne çıkan noktalar

Gelişmiş anti-bot önlemleri karşısında Python ile web parsing'de ustalaşmak, temelde sağlam bir proxy stratejisine dayanır. Proxy'ler yalnızca bir eklenti değil; kimliğinizi gizleyerek, IP adreslerini rotasyona sokarak ve coğrafi kısıtlamaları aşarak sürekli ve büyük ölçekli veri çıkarımını mümkün kılan ayrılmaz bir bileşendir.

Proxy türü seçimi — yüksek güven için residential, hız için veri merkezi ya da en üst düzey gizlilik için mobil — kritiktir ve hedef sitenin savunmalarıyla ve projenizin özel gereksinimleriyle uyumlu olmalıdır. Bu proxy'leri Python'da akıllı rotasyon, oturum yönetimi ve diğer gizlilik teknikleriyle birlikte etkili şekilde uygulamak, kırılgan bir scraper'ı dayanıklı bir veri toplama makinesine dönüştürür.

Parsing başarınızı en üst düzeye çıkarmak için birkaç pratik ipucu:

  1. Küçük başlayın ve gözlemleyin: Büyük ölçekli bir parsing operasyonunu başlatmadan önce hedef sitede mutlaka küçük ölçekli testler yapın. Sitenin davranışını, hata kodlarını ve yanıtlardaki değişiklikleri gözlemleyin. Bu, anti-bot mekanizmalarını anlamanıza ve proxy stratejinizi ince ayar yapmanıza yardımcı olur.
  2. Akıllı proxy yönetimine öncelik verin: Basit round-robin rotasyonun ötesine geçin. Başarısız olan proxy'leri kaldıracak veya geçici olarak kara listeye alacak, sağlıklı olanlara öncelik verecek ve gerektiğinde sticky oturum kullanacak bir mantık kurun. Bu proaktif yönetim, veri alma oranlarını belirgin şekilde artırır ve kesinti süresini azaltır.
  3. Kaliteli proxy sağlayıcılarına yatırım yapın: Ücretsiz ya da ucuz, güvenilmez proxy cazibesine kapılmayın. Bunlar kaçınılmaz olarak hayal kırıklığına, boşa harcanan geliştirme süresine ve düşük veri kalitesine yol açar. GProxy gibi itibarlı bir sağlayıcıyla çalışın; residential, veri merkezi ve mobil proxy'lerden oluşan çeşitli ve yüksek kaliteli bir ağ sunarak tutarlı performans ve ihtiyacınız olan IP'lere erişim sağlar.
support_agent
GProxy Support
Usually replies within minutes
Hi there!
Send us a message and we'll reply as soon as possible.