Web kazıma alanı, veri çıkarıcılar ile web sitesi sahipleri arasında süren bir silahlanma yarışıdır. Cloudflare, DataDome ve PerimeterX gibi bot karşıtı savunmalar giderek karmaşıklaştıkça, standart istek kütüphaneleri modern tespit mekanizmalarını aşmakta sıklıkla başarısız oluyor. Orta ve ileri düzey Python geliştiricileri için çözüm daha basit araçlarda değil, daha sofistike tarayıcı otomasyonunda yatmaktadır. Bu rehber, Selenium ve Headless Chrome kullanarak insan davranışını taklit eden ve tespitten kaçınan, sağlam bot dirençli kazıyıcılar oluşturmanın yollarını keşfediyor.
Neden Headless Chrome ve Selenium?
Geleneksel HTTP istemcileri, gerçek bir tarayıcı ortamının bağlamından yoksun istekler gönderir. JavaScript'i çalıştırmazlar, CSS'i işlemezler veya bir insan kullanıcının yaptığı gibi oturumlar boyunca çerezleri aynı şekilde yönetmezler. Modern web siteleri, dinamik içeriği yüklemek için istemci tarafı JavaScript'ine yoğun bir şekilde güvenir ve otomatik betikleri tanımlamak için parmak izi (fingerprinting) tekniklerini uygular.
Selenium, gerçek bir tarayıcı örneğini—bu bağlamda özellikle Chrome'u—kontrol etmek için bir köprü görevi görür. Headless Chrome kullanarak, grafiksel bir kullanıcı arayüzünün getirdiği ek yük olmadan bir tarayıcının tam işleme motorundan yararlanabiliriz. Bu, DOM'a, çerezlere ve yerel depolamaya erişim sağlar ve web sitelerinin bir bot ile bir insan kullanıcıyı ayırt etmesini önemli ölçüde zorlaştırır.
Sürücüyü Gizlilik Seçenekleriyle Başlatma
Bir bot dirençli kazıyıcı oluşturmanın ilk adımı, Chrome seçeneklerini doğru şekilde yapılandırmaktır. Varsayılan olarak, headless tarayıcılar güvenlik sistemlerinin tespit ettiği belirli bayraklar ve özellikler aracılığıyla kendini ortaya çıkarır. Bu dijital ayak izlerini ortadan kaldırmamız gerekiyor.
Aşağıda, otomasyona özgü sinyalleri devre dışı bırakan ve headless modu etkinleştiren temel bir kurulum bulunmaktadır:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
def setup_driver():
chrome_options = Options()
# Headless modda çalıştır
chrome_options.add_argument("--headless=new")
# Otomasyon ipuçlarını kaldır
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# Kararlılık ve gizlilik için temel ayarlar
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-dev-shm-usage")
chrome_options.add_argument("--window-size=1920,1080")
chrome_options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36")
driver = webdriver.Chrome(service=Service(), options=chrome_options)
# navigator.webdriver'i geçersiz kılmak için CDP komutunu çalıştır
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": "Object.defineProperty(navigator, 'webdriver', {get: () => undefined})"
})
return driver
driver = setup_driver()
Yukarıdaki koddaki en kritik satır CDP (Chrome DevTools Protocol) komutudur. Bu komut, birçok bot karşıtı hizmetin otomasyonu tespit etmek için kullandığı birincil gösterge olan navigator.webdriver özelliğini değiştirir. Bunu undefined olarak ayarlayarak botun varlığını gizlemiş oluruz.
İnsan Davranışını Taklit Etme
Kullandığınız tarayıcıyı gizlemeyi başarırsanız bile, etkileşim desenleriniz hala tespit edilebilir. Botlar genellikle anında hareket eder, tereddüt etmeden tıklar veya sabit hızlarda kaydırma yapar. İnsan gibi görünmek için rastgelelik ve gecikme eklememiz gerekir.
Selenium'un ActionChains özelliğini veya basit açık bekleme (explicit waits) yöntemlerini kullanabilirsiniz. Örneğin, sürücüyü başlattıktan hemen sonra doğrudan bir sayfaya gitmeyin. Kullanıcının düşünme süresini simüle etmek için rastgele bir gecikme ekleyin:
import time
import random
def human_delay(min_seconds=2, max_seconds=5):
time.sleep(random.uniform(min_seconds, max_seconds))
# Örnek kullanım
human_delay()
driver.get("https://example.com")
human_delay()
Ayrıca, kullanıcı ajanlarının (user agents) ve proxy IP'lerinin döndürülmesini düşünün. Bu, sağlam bir altyapı gerektirse de, büyük ölçekli kazıma operasyonları için gereklidir. Proxy IP'lerinizin veri merkezi IP'leri yerine evsel (residential) veya mobil proxy'ler olduğundan emin olun, çünkü ikinciler kolayca kara listeye alınır.
Dinamik İçerik ve Bot Karşıtı Kontrollerin Yönetilmesi
Çoğu bot karşıtı sistem, içeriğe erişime izin vermeden önce CAPTCHA'lar veya meydan okuma sayfaları sunar. Selenium, bu öğelerle bir insan gibi etkileşim kurmanıza olanak tanır. Ancak CAPTCHA çözme işlemini otomatikleştirmek karmaşıktır ve genellikle hizmet şartlarına aykırıdır. Daha iyi bir yaklaşım, sağlam yeniden deneme mantığı ve üstel geri çekilme (exponential backoff) uygulamaktır.
Bir sayfa yüklenmezse veya bir meydan okuma çıkarsa, rastgele bir süre bekleyip yeniden deneyin. Bu, sunucuya tekrar tekrar saldıran bir betiği değil, yavaş bir bağlantısı olan veya geçici bir arıza ile karşılaşmış bir kullanıcıyı taklit eder.
from selenium.common.exceptions import TimeoutException
try:
driver.find_element_by_css_selector(".content")
except TimeoutException:
print("İçerik yüklenmedi, yeniden deneniyor...")
human_delay(5, 15)
driver.refresh()
Sonuç
Bot dirençli kazıyıcılar oluşturmak artık requests ile hızlı bir betik yazmakla ilgili değildir. Tarayıcı ortamlarının, parmak izi tekniklerinin ve insan benzeri etkileşim desenlerinin kapsamlı bir şekilde anlaşılmasını gerektirir. Dikkatlice yapılandırılmış Headless Chrome ile Selenium kullanarak, otomasyon sinyallerini maskeleyerek ve davranışsal rastgelelik ekleyerek kazıma projelerinizin başarı oranını önemli ölçüde artırabilirsiniz. Web sitelerinin robots.txt dosyalarını ve hizmet şartlarını saydığınızı unutmayın; kazıma faaliyetlerinizin etik ve sürdürülebilir kalmasını sağlayın.