Python Programming

Dinamik Web Kazıma Uzmanlığı: Python'da BeautifulSoup ve Selenium Birlikte Kullanımı

Web kazıma son on yılda önemli ölçüde gelişti. Erken dönem betikleri yalnızca statik HTTP isteklerine dayanırken, modern web React, Angular ve Vue.js gibi çerçevelerle oluşturulan Tek Sayfa Uygulamaları (SPA'lar) tarafından domine ediliyor. Bu uygulamalar içeriği JavaScript aracılığıyla dinamik olarak işler, bu da requests ve BeautifulSoup gibi geleneksel araçları tek başlarına etkisiz hale getirir. Çözüm, tarayıcı otomasyonu ve JavaScript yürütme işlemlerini üstlenmek için Selenium'dan yararlanmak ve ardından işlenmiş HTML'yi hızlı ve verimli bir şekilde ayrıştırmak için BeautifulSoup'a aktarmak gibi hibrit bir yaklaşım sunar.

Neden Bu Hibrit Yaklaşım Önemlidir?

Sadece Selenium kullanarak veri çıkarmak kaynak yoğun ve yavaş olabilir. Selenium, DOM yapılarını hızlı bir şekilde ayrıştırmak için değil, tarayıcı eylemlerini otomatikleştirmek için tasarlanmıştır. Buna karşılık, BeautifulSoup inanılmaz derecede hızlı ve hafiftir ancak JavaScript yürütemez. İkisini birleştirdiğinizde, her iki dünyanın en iyisini elde edersiniz: Selenium, gördüğünüz verinin kazınan veri olduğundan emin olur (geç yükleme, sonsuz kaydırma ve AJAX çağrıları gibi durumları yönetir), BeautifulSoup ise işlenmiş ağaçta gezinmek ve arama yapmak için temiz, Python'a özgü bir API sağlar.

Ortamınızı Hazırlama

Koda başlamadan önce gerekli kütüphanelerin yüklü olduğundan emin olun. Tarayıcı kontrolü için selenium ve ayrıştırma için beautifulsoup4 gereksiniminiz olacaktır. Ek olarak, bir WebDriver'e ihtiyacınız olacaktır. Chrome için sürücü indirmelerini otomatik olarak yönetmek üzere webdriver-manager kullanabilirsiniz.

pip install selenium beautifulsoup4 webdriver-manager

Temel İş Akışı

Süreç genellikle şu adımları izler:

  1. Selenium WebDriver'ini başlatın.
  2. Hedef URL'ye gidin.
  3. Belirli öğelerin yüklenmesini veya JavaScript'in yürütülmesini bitirmesini bekleyin.
  4. Sayfa kaynağını veya belirli bir öğenin HTML'sini çıkarın.
  5. HTML dizgesini ayrıştırmak için BeautifulSoup'a aktarın.
  6. BeautifulSoup'un yöntemlerini kullanarak gerekli verileri çıkarın.
  7. Tarayıcıyı kapatarak temizlik yapın.

Pratik Kod Örneği

Pratik bir uygulamaya bakalım. Bir kullanıcı etkileşimi veya zaman gecikmesinden sonra yorumları veya makaleleri yükleyen dinamik bir sayfayı kazıyacağız.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
from webdriver_manager.chrome import ChromeDriverManager

# Sürücüyü başlat
driver = webdriver.Chrome(ChromeDriverManager().install())

try:
    # 1. URL'ye gidin
    url = "https://example.com/dynamic-content"
    driver.get(url)

    # 2. Dinamik içeriğin yüklenmesini bekleyin
    # 'comments' sınıfına sahip kapsayıcının mevcut olmasını bekler (en fazla 10 saniye)
    wait = WebDriverWait(driver, 10)
    wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".comments-container")))

    # 3. İşlenmiş HTML kaynağını alın
    page_source = driver.page_source

    # 4. BeautifulSoup ile ayrıştırın
    soup = BeautifulSoup(page_source, "html.parser")

    # 5. Veriyi çıkarın
    comments = soup.select(".comment-text")
    for comment in comments:
        print(comment.get_text(strip=True))

finally:
    # 6. Sürücüyü kapatın
    driver.quit()

Performans ve Etik İçin En İyi Uygulamalar

Bu kombinasyonu kullanırken performans kritiktir. İhtiyacınız olan her veri parçası için driver.find_element() çağrısından kaçının. Bunun yerine, sayfanın yüklenmesini bekleyin, tüm page_source'u alın ve ardından yerel olarak ayrıştırın. Bu, ağ yükünü ve tarayıcı etkileşimlerini önemli ölçüde azaltır.

Ayrıca, her zaman robots.txt'e saygı duyun ve istekler arasında gecikmeler uygulayın. Kazıma, veri edinimi ile sunucu yük yönetimi arasında hassas bir denge gerektirir. Başlıksız tarayıcılar kullanmak (options.add_argument("--headless") ekleyerek) kaynak tüketimini de azaltabilir; ancak bazı web sitelerinin başlıksız tarayıcıları algılayıp engellediğini unutmayın.

Sonuç

Selenium ve BeautifulSoup'u birleştirmek, modern web kazıma zorlukları için güçlü bir stratejidir. Geliştiricilere, statik ayrıştırmanın sınırlamalarını aşma imkanı tanırken BeautifulSoup'un API'sinin hızını ve esnekliğini korumalarına olanak tanır. Her aracı ne zaman kullanmaları gerektiğini ve bunları sorunsuz bir şekilde nasıl entegre edeceklerini anlayarak, günümüzün JavaScript ağırlıklı web ekosisteminin karmaşıklığını yönetebilen sağlam kazıcılar oluşturabilirsiniz. İhtiyacınız olan verilere sürdürülebilir erişimi sağlamak için etik kazıma uygulamalarını önceliklendirmeyi unutmayın.

Share: