Web kazıma, veri mühendisleri ve Python geliştiricileri için temel bir beceridir. Statik sitelerin ayrıştırılması basitken, modern web uygulamaları içeriği oluşturmak için JavaScript'e yoğun şekilde güvenir. Bu durum, geleneksel HTTP istemcileri için önemli bir zorluk yaratır. Bu yazıda, BeautifulSoup'un hızını Selenium'un tarayıcı otomasyonu gücüyle birleştirerek en karmaşık dinamik web sitelerini nasıl ele alacağımızı keşfedeceğiz.
Görev İçin Doğru Araçları Seçmek
Herhangi bir kod yazmadan önce, her aracın güçlü ve zayıf yönlerini anlamak kritiktir. BeautifulSoup, HTML ve XML dosyalarından veri çekmek için kullanılan bir Python kütüphanesidir. Seçtiğiniz ayrıştırıcı ile çalışarak, bir ayrıştırma ağacında gezinme, arama ve değiştirme işlemlerini yapmanın yerleşik yolunu sunar. Son derece hızlı ve hafiftir, bu da onu statik HTML için mükemmel kılar.
Bununla birlikte, BeautifulSoup JavaScript çalıştıramaz. İhtiyacınız olan veri bir API çağrısı aracılığıyla yükleniyorsa veya React veya Angular gibi bir çerçeve tarafından oluşturuluyorsa, BeautifulSoup sadece boş bir kabuk görecektir. İşte burada Selenium devreye girer. Selenium tarayıcıları otomatikleştirerek JavaScript'i çalıştırabilme ve öğelerin yüklenmesini bekleyebilme yeteneğine sahiptir. Basit bir HTTP isteğine göre daha yavaş olsa da, dinamik olarak oluşturulan içeriğe erişim için gereken bağlamı sağlar.
Ortamın Kurulması
Başlamak için gerekli kütüphaneleri yüklemeniz gerekir. Bunu pip kullanarak yapabilirsiniz:
pip install beautifulsoup4 selenium requests
Ayrıca tercih ettiğiniz tarayıcı için bir WebDriver'e de ihtiyacınız olacaktır. Bu örnekte Chrome kullanacağız. ChromeDriver'ı resmi web sitesinden indirebilir veya sürücü yönetimini otomatik olarak yapan Selenium Manager'ı (Selenium 4+ ile mevcuttur) kullanabilirsiniz.
Selenium WebDriver'ini başlatmak için temel bir kurulum aşağıdaki gibidir:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# Sürücüyü başlat
service = Service('chromedriver/yolu')
driver = webdriver.Chrome(service=service)
Selenium'u BeautifulSoup ile Entegre Etme
En verimli iş akışı, Selenium'u sayfayı yüklemek ve ham HTML'yi çıkarmak için kullanmak, ardından bu HTML'yi BeautifulSoup'a ayrıştırma için aktarmaktır. Bu yaklaşım, Selenium'un JavaScript'i işleme yeteneğinden yararlanırken BeautifulSoup'un sağlam ayrıştırma yeteneklerini de kullanır.
Sonsuz kaydırma aracılığıyla öğeleri yükleyen bir e-ticaret sitesinden bir ürün listesi kazımanız gerektiğini varsayalım. İlk olarak, Selenium'u öğelerin görünmesini beklemesi için yönlendirirsiniz:
from bs4 import BeautifulSoup
def dinamik_sayfa_kavrama(url):
driver.get(url)
# Belirli öğelerin yüklenmesini bekle
driver.implicitly_wait(10)
# JavaScript çalıştırıldıktan sonra sayfa kaynağını al
html_content = driver.page_source
# BeautifulSoup ile ayrıştır
soup = BeautifulSoup(html_content, 'html.parser')
# Tüm ürün kartlarını bul
products = soup.find_all('div', class_='product-card')
for product in products:
title = product.find('h2').text
price = product.find('span', class_='price').text
print(f"Ürün: {title}, Fiyat: {price}")
dinamik_sayfa_kavrama('https://example.com/products')
Dinamik Öğeleri İşleme ve En İyi Uygulamalar
Dinamik siteleri kazırken zamanlama her şeydir. Sabit uyku zamanlayıcılarına güvenmek verimsizdir ve kırılgandır. Bunun yerine, Selenium'un WebDriverWait ile açık bekleme kullanın. Bu, bir öğenin tıklanabilir veya görünür olması gibi belirli bir koşul gerçekleşmeden önce betiğinizin beklemesini sağlar.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, 'dynamic-content')))
Ayrıca, web sitesinin robots.txt dosyasına ve hizmet şartlarına her zaman saygı gösterin. İsteklerinize hız sınırlaması uygulamak, IP adresinizin engellenmesini önlemeye yardımcı olur ve web'in iyi bir vatandaşı olduğunuzdan emin olmanızı sağlar. Gerekirse oturumları korumak için başlıkları ve çerezleri düzgün şekilde kullanın.
Sonuç
BeautifulSoup ve Selenium'un birleştirilmesi, modern web kazıma zorlukları için güçlü bir çözüm sunar. Selenium'un JavaScript çalıştırma gibi ağır işleri üstlenmesine ve ardından sonucu ayrıştırma için BeautifulSoup'a aktarmasına izin vererek, her iki dünyanın da en iyisini elde edersiniz: güvenilirlik ve hız. Betiklerinizin sağlam olmasını sağlamak için uygun hata işleme ve bekleme mekanizmaları uyguladığınızdan emin olun. Bu tekniklerle, neredeyse her web kazıma görevine güvenle yaklaşabilirsiniz.