$ Python Selenium ile Bot Tespitini Aşarak Tam Sayfa Ekran Görüntüsü Alma
Web otomasyonu yaparken karşılaşılan en büyük zorluklardan biri, Cloudflare gibi gelişmiş bot tespit sistemleridir. Standart bir Selenium kurulumu bu tür korumalar tarafından kolayca fark edilir. Bu makalede, undetected-chromedriver kütüphanesini kullanarak bu engelleri nasıl aşacağımızı ve Chrome Geliştirici Protokolü (CDP) aracılığıyla bir web sayfasının tam ekran görüntüsünü nasıl alacağımızı öğreneceğiz.
Neden undetected-chromedriver?
undetected-chromedriver (kısaca uc), standart Selenium WebDriver'ını, bot olduğunu belli eden izleri (örneğin, navigator.webdriver bayrağı) gizleyecek şekilde optimize eder. Bu sayede, otomasyon betiğinizin gerçek bir kullanıcı tarafından yönetilen bir tarayıcı gibi görünmesini sağlar ve bot tespit sistemlerine yakalanma olasılığını büyük ölçüde düşürür.
Ekran Görüntüsü İçin CDP Kullanımı
Selenium'un standart get_screenshot_as_png() metodu genellikle sadece o an ekranda görünen kısmın (viewport) fotoğrafını çeker. Sayfanın tamamının görüntüsünü almak için, tarayıcıyla daha düşük seviyede iletişim kurmamızı sağlayan Chrome Geliştirici Protokolü'nü (CDP) kullanabiliriz. Page.captureScreenshot komutu, sayfanın tamamını yakalamak için bize esnek parametreler sunar.
Adım Adım Kodun Açıklaması
- Gerekli Kütüphaneleri Kurma: İlk olarak, projemiz için gerekli olan
seleniumveundetected-chromedriverkütüphanelerini kurarız. - Sürücüyü Başlatma: Standart Selenium yerine
uc.Chrome()ile bir tarayıcı örneği oluştururuz. - Sayfaya Gitme: Hedef web sitesine gideriz.
- Sayfa Boyutlarını Alma: Sayfanın tam genişliğini ve yüksekliğini elde etmek için bir JavaScript komutu çalıştırırız. Bu, ekran görüntüsünün boyutlarını belirlemek için kritiktir.
- CDP Komutunu Çalıştırma:
driver.execute_cdp_cmdmetodu ilePage.captureScreenshotkomutunu çağırırız. Bu komuta, sayfanın tamamını yakalaması için gerekli parametreleri (clip) ve formatı (jpegveyapng) veririz. - Görüntüyü Kaydetme: CDP'den dönen base64 formatındaki görüntü verisini çözer ve bir dosya olarak kaydederiz.
Örnek Python Kodu
Aşağıdaki kod, `virtualscrap.com` adresinin tam sayfa ekran görüntüsünü alır ve `screenshot.png` olarak kaydeder.
import base64
import undetected_chromedriver as uc
from time import sleep
if __name__ == '__main__':
# undetected-chromedriver'ı başlat
driver = uc.Chrome()
try:
# Hedef sayfaya git
driver.get("https://virtualscrap.com/")
# Sayfanın tam olarak yüklenmesi için kısa bir bekleme
sleep(3)
# CDP ile sayfa boyutlarını al
page_rect = driver.execute_cdp_cmd("Page.getLayoutMetrics", {})
# Ekran görüntüsü için CDP komutunu yapılandır
screenshot_config = {
"captureBeyondViewport": True,
"format": "png",
"fromSurface": True,
"clip": {
"width": page_rect['contentSize']['width'],
"height": page_rect['contentSize']['height'],
"x": 0,
"y": 0,
"scale": 1
}
}
# Ekran görüntüsünü al
result = driver.execute_cdp_cmd("Page.captureScreenshot", screenshot_config)
# Base64 verisini PNG dosyasına yaz
screenshot = base64.b64decode(result['data'])
with open('screenshot.png', 'wb') as f:
f.write(screenshot)
print("Ekran görüntüsü 'screenshot.png' olarak başarıyla kaydedildi.")
finally:
# Tarayıcıyı kapat
driver.quit()