Modern web siteleri karmaşık yapılar sunarken, statik veri çekme yöntemleri yetersiz kalabiliyor. Peki, dinamik içeriklerle dolu bu sitelerden verileri nasıl verimli ve güvenilir bir şekilde toplayabiliriz? Bu makale, Python ve Selenium kütüphanesini kullanarak web otomasyonu ve veri kazıma tekniklerini adım adım öğrenmenizi sağlayacak, böylece siz de web’in sonsuz veri havuzundan faydalanabileceksiniz.
Günümüz dijital dünyasında veri, adeta yeni petrol olarak nitelendiriliyor. İşletmelerden araştırmacılara, her alanda doğru ve güncel verilere erişim büyük önem taşıyor. Web kazıma (web scraping), internet sitelerindeki yapılandırılmış veya yapılandırılmamış verileri otomatik olarak çekme işlemidir. Bu sayede, pazar araştırması yapabilir, fiyat karşılaştırmaları gerçekleştirebilir, rakip analizleri yürütebilir veya akademik çalışmalarınız için büyük veri setleri oluşturabilirsiniz. Ancak, web sitelerinin giderek daha dinamik bir yapıya bürünmesi, yani içeriklerinin çoğunun JavaScript tarafından yüklendiği veya kullanıcı etkileşimi gerektirdiği durumlarda, geleneksel veri çekme yöntemleri (requests ve BeautifulSoup gibi) çoğu zaman yetersiz kalır.
İşte tam bu noktada, Selenium Python veri çekme işlemleri için vazgeçilmez bir araç haline geliyor. Selenium, aslında web uygulamalarının test edilmesi için geliştirilmiş güçlü bir kütüphanedir. Ancak, bir web tarayıcısını programatik olarak kontrol edebilme yeteneği sayesinde, web kazıma alanında da kendine sağlam bir yer edinmiştir. Selenium, gerçek bir tarayıcıyı (Chrome, Firefox, Edge vb.) başlatır ve bir insan kullanıcının yapabileceği her türlü eylemi (tıklama, form doldurma, sayfa kaydırma, bekleme) taklit edebilir. Bu sayede, JavaScript ile yüklenen içerikleri de sorunsuz bir şekilde görebilir ve çekebiliriz.
Peki, Selenium’u diğer web kazıma araçlarından ayıran temel özellikler nelerdir? En başta, JavaScript motorunu çalıştıran gerçek bir tarayıcı ortamı sunması gelir. Bu, özellikle AJAX çağrıları, dinamik içerik yüklemeleri veya tek sayfa uygulamaları (SPA) gibi modern web teknolojileriyle inşa edilmiş sitelerden veri çekerken kritik bir avantaj sağlar. Ayrıca, Selenium sadece veri çekmekle kalmaz, aynı zamanda web sitelerindeki otomasyon görevleri için de kullanılabilir. Örneğin, bir web sitesine giriş yapabilir, belirli formları doldurabilir veya birden fazla sayfayı ziyaret edip çeşitli etkileşimlerde bulunabilirsiniz. Bu çok yönlülük, onu sadece bir veri çekme aracı olmaktan çıkarıp, geniş kapsamlı bir web otomasyon çözümüne dönüştürür.
Sonuç olarak, dinamik web sitelerinin karmaşık yapısını aşmak ve JavaScript ile yüklenen verilere erişmek istiyorsanız, Selenium Python ile veri çekme, öğrenilmesi gereken temel bir beceridir. Bu bölümde, web kazıma dünyasındaki yerini ve önemini vurguladık. Bir sonraki adımda, Selenium’u kurarak ve ilk adımlarımızı atarak bu güçlü aracı nasıl kullanacağımızı detaylıca inceleyeceğiz.
Selenium ve Python ile Veri Çekmeye Başlangıç: Adım Adım Rehber
Artık Selenium’un web kazıma dünyasındaki önemini anladığımıza göre, şimdi sıra geldi bu güçlü aracı pratik olarak kullanmaya başlamaya. Bu bölümde, Selenium ve gerekli tarayıcı sürücülerini (WebDriver) nasıl kuracağımızı, temel web elementlerini nasıl bulacağımızı ve onlarla nasıl etkileşime geçeceğimizi adım adım öğreneceğiz. Python ile Selenium’u kullanarak web sitelerinden veri çekme sürecini basit ve anlaşılır örneklerle ele alacağız.
Kurulum ve İlk Adımlar: Ortamınızı Hazırlama
Selenium ile çalışmaya başlamadan önce, Python ortamınızda bazı kurulumlar yapmanız gerekiyor. İlk olarak, Python’ın kurulu olduğundan emin olun. Ardından, pip aracılığıyla Selenium kütüphanesini yükleyeceğiz. Ayrıca, Selenium’un bir tarayıcıyı kontrol edebilmesi için ilgili tarayıcının WebDriver‘ına ihtiyacımız var. Her tarayıcının kendi WebDriver’ı bulunur (örneğin, Chrome için ChromeDriver, Firefox için GeckoDriver). Genellikle Chrome en yaygın tercih edilen tarayıcı olduğu için, biz de ChromeDriver örneği üzerinden ilerleyeceğiz.
- Python ve Pip Kurulumu: Python’ın bilgisayarınızda kurulu olduğunu varsayıyoruz. Kurulu değilse, python.org adresinden indirebilirsiniz.
- Selenium Kütüphanesini Kurma: Komut istemcisini veya terminali açın ve aşağıdaki komutu çalıştırın:
pip install selenium
Bu komut, Selenium kütüphanesini Python ortamınıza yükleyecektir. - WebDriver İndirme: Kullandığınız tarayıcıya uygun WebDriver'ı indirmeniz gerekiyor. Eğer Chrome kullanıyorsanız, ChromeDriver indirme sayfasını ziyaret edin. Tarayıcınızın sürümüne uygun ChromeDriver sürümünü indirdiğinizden emin olun (Chrome tarayıcınızın sürümünü "Ayarlar -> Chrome Hakkında" kısmından görebilirsiniz). İndirdiğiniz
chromedriver.exe(Windows) veyachromedriver(macOS/Linux) dosyasını Python betiğinizin bulunduğu dizine veya sistem PATH'inize ekleyebileceğiniz bir konuma kopyalayın. Kolaylık sağlaması açısından, şimdilik betiğinizle aynı dizine koymayı tercih edebiliriz.
Tüm bu adımları tamamladığınızda, ilk Selenium betiğinizi yazmaya hazırsınız demektir. Hadi basit bir örnekle başlayalım ve Google anasayfasını açalım:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
# WebDriver'ın yolunu belirtin
# Eğer chromedriver.exe dosyasını betiğinizin olduğu dizine koyduysanız, sadece dosya adını yazabilirsiniz.
# Veya tam yolu belirtin: 'C:/path/to/chromedriver.exe'
chromedriver_path = './chromedriver.exe'
service = Service(executable_path=chromedriver_path)
# Tarayıcıyı başlat
driver = webdriver.Chrome(service=service)
# Bir web sitesini aç
driver.get("https://www.google.com")
# Sayfanın başlığını yazdır
print(f"Sayfa Başlığı: {driver.title}")
# Tarayıcıyı kapat (isteğe bağlı, görmek için yorum satırı yapılabilir)
# driver.quit()
Bu kod bloğu, bilgisayarınızda bir Chrome tarayıcısı açacak, Google anasayfasına gidecek, sayfanın başlığını konsola yazdıracak ve ardından tarayıcıyı kapatacaktır. Bu basit adımlarla, Selenium'un web otomasyonu için temel yapı taşlarını anlamış oluyoruz.
Web Elementlerini Bulma ve Etkileşime Geçme: Verilere Ulaşma
Web sitelerinden veri çekmenin anahtarı, çekmek istediğimiz bilgilerin bulunduğu HTML elementlerini doğru bir şekilde bulabilmektir. Selenium, elementleri bulmak için çeşitli yöntemler sunar: ID, Name, Class Name, Tag Name, Link Text, Partial Link Text, XPath ve CSS Selector. En esnek ve güçlü yöntemler genellikle XPath ve CSS Selector'lardır.
Bir web elementini bulmak için öncelikle o elementin HTML yapısını incelememiz gerekir. Tarayıcınızın "Geliştirici Araçları" (F12) özelliğini kullanarak bu yapıya erişebilirsiniz. Örneğin, Google arama çubuğunu bulalım ve oraya bir metin yazıp arama yapalım:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys # Klavye tuşları için
chromedriver_path = './chromedriver.exe'
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
driver.get("https://www.google.com")
try:
# Arama çubuğunu bul (genellikle 'name' attribute'ı 'q' olur)
search_box = driver.find_element(By.NAME, "q")
# Arama çubuğuna metin yaz
search_box.send_keys("Selenium Python veri çekme")
# Enter tuşuna basarak arama yap
search_box.send_keys(Keys.RETURN)
# Arama sonuçları sayfasının başlığını yazdır
print(f"Arama Sonuçları Sayfası Başlığı: {driver.title}")
# İlk arama sonucunu bul ve tıklama (örneğin, h3 etiketiyle başlayan bir link)
# Bu kısmı daha spesifik bir CSS Selector veya XPath ile iyileştirmek gerekebilir
# Google'ın yapısı sürekli değişebilir, bu yüzden bu selektör her zaman çalışmayabilir.
first_result = driver.find_element(By.CSS_SELECTOR, "h3")
print(f"İlk sonuç: {first_result.text}")
first_result.click()
# Yeni açılan sayfanın başlığını yazdır
print(f"Tıklanan Sayfanın Başlığı: {driver.title}")
finally:
# İşlem bittikten sonra tarayıcıyı kapat
driver.quit()
Bu örnekte, find_element(By.NAME, "q") ile arama çubuğunu bulduk ve send_keys() metodu ile içine metin yazdık. Ardından, Keys.RETURN kullanarak Enter tuşuna basmış gibi davrandık. Son olarak, arama sonuçları sayfasındaki ilk h3 etiketini bularak ona tıkladık. Bu etkileşimler, Selenium'un web siteleriyle ne kadar derinlemesine etkileşim kurabildiğini göstermektedir.
Dinamik İçerik ve Bekleme Stratejileri: Sabırla Veri Toplama
Modern web sitelerinin en büyük özelliklerinden biri, içeriği dinamik olarak yüklemeleridir. Bu durum, Selenium gibi bir otomasyon aracının hemen bir elementi bulmaya çalışması durumunda "Element Not Found" hatasıyla karşılaşılmasına neden olabilir. Çünkü sayfa yüklendiğinde, element henüz DOM'a eklenmemiş olabilir. Bu tür senaryolar için Selenium'da bekleme stratejileri kullanmak hayati öneme sahiptir.
Selenium'da iki ana bekleme türü vardır: Implicit Waits (Örtük Beklemeler) ve Explicit Waits (Açık Beklemeler).
-
Implicit Waits (Örtük Beklemeler): Tarayıcıya, bir elementi bulmaya çalışırken belirli bir süreye kadar beklemesini söyler. Eğer element belirtilen süre içinde bulunursa işlem devam eder, bulunamazsa hata verir. Bu bekleme süresi bir kez ayarlandığında,
drivernesnesinin tüm ömrü boyunca geçerli olur.driver.implicitly_wait(10) # 10 saniyeye kadar bekleBu, basit senaryolar için kullanışlı olsa da, her element için aynı süreyi bekleyebileceği için gereksiz gecikmelere yol açabilir.
-
Explicit Waits (Açık Beklemeler): Daha esnek ve güçlü bir bekleme yöntemidir. Belirli bir koşul karşılanana kadar veya maksimum bir süre geçene kadar beklemeyi sağlar. Örneğin, bir elementin görünür hale gelmesini, tıklanabilir olmasını veya belirli bir metni içermesini bekleyebilirsiniz. Bu, özellikle AJAX çağrıları sonrası yüklenen içerikler için idealdir.
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Belirli bir elementin tıklanabilir olmasını 10 saniyeye kadar bekle element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "myButton")) ) element.click()expected_conditionsmodülü, bekleyebileceğiniz birçok farklı koşul sunar:presence_of_element_located,visibility_of_element_located,text_to_be_present_in_elementvb.
Doğru bekleme stratejilerini kullanmak, Selenium betiklerinizin hem daha stabil çalışmasını sağlar hem de gereksiz gecikmeleri önleyerek performansını artırır. Özellikle karmaşık ve JavaScript ağırlıklı sitelerde, açık beklemeler olmazsa olmazdır.
Gerçek Dünya Senaryosu: E-ticaret Sitesinden Ürün Verisi Çekme
Teorik bilgileri ve temel uygulamaları geride bıraktığımıza göre, şimdi öğrendiklerimizi bir araya getirerek gerçek bir senaryo üzerinde çalışalım: Bir e-ticaret sitesinden ürün verileri çekme. Bu vaka analizinde, belirli bir kategorideki ürünlerin adlarını, fiyatlarını ve linklerini toplayacağız. Bu, birçok veri kazıma projesinin temelini oluşturan yaygın bir görevdir.
Hayali bir e-ticaret sitesi olan "örnek-alisveris.com" adresindeki "Elektronik" kategorisindeki ürünleri çekmeye çalışacağız. Bu site, ürünleri sayfa kaydırdıkça dinamik olarak yükleyen ve bazı ürünlerin özelliklerini AJAX ile getiren bir yapıya sahip olabilir. Bu durum, hem element bulma hem de bekleme stratejileri konusunda bize pratik yapma imkanı sunacaktır.
Senaryo Detayları ve Hedeflenen Veriler
- Hedef Site:
https://www.example-alisveris.com/elektronik-kategorisi(Bu URL ve site gerçek değildir, sadece bir senaryo için kullanılmıştır. Kendi gerçek hedefinizi belirlerken lütfen sitenin kullanım koşullarını ve etik kuralları dikkate alın.) - Hedeflenen Veriler:
- Ürün Adı
- Ürün Fiyatı
- Ürün Linki (detay sayfasına giden)
- Zorluklar:
- Sayfalandırma (bir sonraki sayfaya geçme)
- Dinamik yüklenen içerikler (sayfa kaydırma ile gelen ürünler)
- Fiyat veya indirim gibi bazı verilerin geç yüklenmesi
Kodsal Uygulama: Adım Adım Veri Çekme
Aşağıdaki kod bloğu, bu senaryoyu nasıl ele alabileceğimizi gösteriyor. Örnek-alisveris.com yerine, siz kendi projenizdeki bir e-ticaret sitesini hedefleyerek CSS selector'ları ve XPath'leri buna göre ayarlamalısınız. Unutmayın ki, web sitelerinin HTML yapıları zamanla değişebilir, bu yüzden selector'larınızı periyodik olarak kontrol etmeniz gerekebilir.
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
chromedriver_path = './chromedriver.exe'
service = Service(executable_path=chromedriver_path)
driver = webdriver.Chrome(service=service)
driver.maximize_window() # Tarayıcı penceresini tam ekran yap
# Implicit wait ile tüm element aramaları için varsayılan bir bekleme süresi belirle
driver.implicitly_wait(5)
# Ürünleri toplayacağımız liste
all_products = []
try:
# Hedef kategori sayfasını aç
# GERÇEK BİR SİTE İLE DEĞİŞTİRİNİZ!
driver.get("https://www.hepsiburada.com/laptop-masaustu-bilgisayarlar-c-204")
# Sayfanın alt kısmına doğru kaydırarak dinamik içeriklerin yüklenmesini bekle
# Bu işlemi birden fazla kez tekrarlamak gerekebilir
last_height = driver.execute_script("return document.body.scrollHeight")
while True:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(3) # İçeriğin yüklenmesi için bekle
new_height = driver.execute_script("return document.body.scrollHeight")
if new_height == last_height:
break
last_height = new_height
# Ürün elementlerini bulmak için CSS Selector kullanıyoruz.
# Bu selector, örnek olarak bir e-ticaret sitesinin ürün listeleme yapısına göre yazılmıştır.
# Gerçek bir site için bu selector'ı geliştirici araçları ile bulmanız gerekmektedir.
# Örneğin, her bir ürün kartı 'div.productListContent-zAP0s5Qef_WjHq_PJb_P' gibi bir class'a sahip olabilir.
product_cards = driver.find_elements(By.CSS_SELECTOR, "li.productListContent-zAP0s5Qef_WjHq_PJb_P") # Örnek bir CSS Selector
print(f"Toplam {len(product_cards)} ürün kartı bulundu.")
for card in product_cards:
try:
# Ürün adını çek
# 'h3' etiketi altındaki 'a' etiketinin 'title' attribute'u veya 'text'i
product_name_element = card.find_element(By.CSS_SELECTOR, "h3 > a")
product_name = product_name_element.get_attribute("title") or product_name_element.text
# Ürün fiyatını çek (fiyatın genellikle belirli bir span veya div içinde olduğu varsayılır)
# Fiyatın dinamik yüklenmesi ihtimaline karşı explicit wait kullanabiliriz.
product_price_element = WebDriverWait(card, 5).until(
EC.presence_of_element_located((By.CSS_SELECTOR, "div.product-card-price > div > div.price-value-container > div")) # Örnek fiyat selector'ı
)
product_price = product_price_element.text
# Ürün linkini çek
product_link = product_name_element.get_attribute("href")
all_products.append({
"Adı": product_name.strip(),
"Fiyatı": product_price.strip(),
"Linki": product_link
})
except Exception as e:
print(f"Bir ürün kartı işlenirken hata oluştu: {e}")
# Hata olan ürünü atlayıp devam et
continue
# Toplanan verileri yazdır
for product in all_products:
print(f"Adı: {product['Adı']}, Fiyatı: {product['Fiyatı']}, Linki: {product['Linki']}")
finally:
driver.quit()
print(f"\nToplamda {len(all_products)} ürün bilgisi çekildi.")
Bu örnekte, sayfa kaydırma ile dinamik yüklenen ürünleri çekmek için bir while döngüsü kullandık. Sayfa yüksekliği değişmediği sürece kaydırmaya devam ederek tüm ürünlerin yüklenmesini bekledik. Ardından, her bir ürün kartı için ayrı ayrı CSS selector'lar kullanarak adı, fiyatı ve linki çektik. Fiyat gibi kritik verilerin geç yüklenme ihtimaline karşı, bu elementler için WebDriverWait ile açık bekleme kullandık.
time.sleep() ile rastgele gecikmeler eklemek, daha doğal bir kullanıcı davranışını taklit etmenizi ve engellenme riskinizi azaltmanızı sağlar. Ancak çok fazla bekleme süresi performansınızı düşürecektir.Bu vaka analizi, gerçek dünya senaryolarında Selenium'u nasıl uygulayabileceğimize dair sağlam bir temel sunuyor. Bir sonraki bölümde, daha ileri düzey teknikleri ve optimizasyon stratejilerini ele alarak, veri çekme becerilerinizi bir üst seviyeye taşıyacağız.
İleri Düzey Selenium Teknikleri ve Optimizasyon
Selenium ile temel veri çekme ve otomasyon işlemlerini öğrendiğimize göre, şimdi daha karmaşık senaryoları ele almak ve performansımızı artırmak için kullanabileceğimiz ileri düzey tekniklere odaklanalım. Bu bölümde, headless tarayıcılar, proxy ve user-agent yönetimi, hata yönetimi ve mobil uyumluluk gibi konuları işleyeceğiz.
Headless Tarayıcılar ve Performans Artışı: Görünmez Otomasyon
Varsayılan olarak, Selenium bir tarayıcı penceresi açar ve tüm işlemleri görsel olarak gerçekleştirir. Bu, geliştirme aşamasında ne olduğunu görmek için faydalı olsa da, üretim ortamında veya büyük ölçekli veri çekme işlemlerinde gereksiz kaynak tüketimine neden olabilir. Headless tarayıcılar, tarayıcıyı grafik arayüzü olmadan çalıştırma yeteneği sunar. Bu, özellikle sunucu ortamlarında veya aynı anda birden fazla tarayıcı çalıştırmanız gerektiğinde önemli performans artışı ve kaynak tasarrufu sağlar.
Chrome için headless modu etkinleştirmek oldukça basittir. ChromeOptions sınıfını kullanarak tarayıcıya "headless" argümanını eklemeniz yeterlidir:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
chromedriver_path = './chromedriver.exe'
service = Service(executable_path=chromedriver_path)
chrome_options = Options()
chrome_options.add_argument("--headless") # Headless modunu etkinleştir
chrome_options.add_argument("--disable-gpu") # GPU kullanımını devre dışı bırak (Linux'ta gerekli olabilir)
chrome_options.add_argument("--no-sandbox") # Güvenlik nedenleriyle bazı sistemlerde gerekli olabilir
driver = webdriver.Chrome(service=service, options=chrome_options)
driver.get("https://www.whatismybrowser.com/detect/what-is-my-user-agent")
print(f"Headless Modda Sayfa Başlığı: {driver.title}")
print(f"User-Agent: {driver.find_element(By.ID, 'detected_user_agent').text}")
driver.quit()
Bu kod, tarayıcı penceresi açmadan aynı işlemleri arka planda yürütecek ve böylece daha hızlı ve daha az kaynak tüketerek çalışacaktır. Bu, özellikle bulut tabanlı sunucularda çalışan veri çekme betikleri için kritik bir optimizasyondur.
Proxy ve User-Agent Yönetimi: Kimliğinizi Gizleme
Web siteleri, aşırı ve otomatik istekleri tespit etmek için IP adresinizi ve User-Agent bilginizi kullanabilir. Sık sık aynı IP adresinden veya standart bir User-Agent ile istekler gönderirseniz, siteler tarafından engellenebilirsiniz. Bu durumu aşmak için proxy sunucuları ve User-Agent değiştirme tekniklerini kullanırız.
-
Proxy Kullanımı: Proxy sunucusu, isteklerinizi başka bir IP adresi üzerinden göndermenizi sağlar. Bu, engellenme riskinizi azaltır ve farklı coğrafi konumlardan verilere erişmenize olanak tanır. Proxy ayarlarını
ChromeOptionsüzerinden yapabilirsiniz:from selenium.webdriver.chrome.options import Options chrome_options = Options() proxy = "IP_ADRESI:PORT" # Örneğin: "10.10.10.10:8888" # Eğer kimlik doğrulamalı proxy kullanıyorsanız, proxy eklentisi kullanmanız gerekebilir. chrome_options.add_argument(f'--proxy-server={proxy}') # Headless modu da ekleyelim chrome_options.add_argument("--headless") driver = webdriver.Chrome(service=service, options=chrome_options) driver.get("https://www.whatismyip.com/") # IP adresinizi kontrol etmek için bir site print(f"Proxy ile Çalışan IP: {driver.find_element(By.CSS_SELECTOR, 'h1#your-ip').text}") driver.quit() -
User-Agent Değiştirme: User-Agent, tarayıcınızın ve işletim sisteminizin sunucuya gönderdiği bir kimlik bilgisidir. Varsayılan Selenium User-Agent'ı kolayca tespit edilebilir. Daha yaygın bir tarayıcıdan geliyormuş gibi görünmek için User-Agent'ı değiştirebilirsiniz:
from selenium.webdriver.chrome.options import Options chrome_options = Options() # Popüler bir Chrome User-Agent'ı user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36" chrome_options.add_argument(f"user-agent={user_agent}") chrome_options.add_argument("--headless") driver = webdriver.Chrome(service=service, options=chrome_options) driver.get("https://www.whatismybrowser.com/detect/what-is-my-user-agent") print(f"Değiştirilen User-Agent: {driver.find_element(By.ID, 'detected_user_agent').text}") driver.quit()
Bu teknikler, bot tespit sistemlerini atlatmanıza yardımcı olabilir ancak her zaman etik kurallara ve sitelerin kullanım koşullarına uygun hareket etmeyi unutmamak önemlidir.
Hata Yönetimi ve Güvenilir Kazıma: Kesintisiz Veri Akışı
Web kazıma betikleri, ağ sorunları, elementlerin bulunamaması veya site yapısındaki ani değişiklikler gibi çeşitli nedenlerle hatalarla karşılaşabilir. Güvenilir bir kazıma betiği yazmak için hata yönetimi mekanizmaları eklemek kritik öneme sahiptir. Python'daki try-except bloklarını kullanarak olası hataları yakalayıp uygun şekilde işleyebiliriz.
from selenium.common.exceptions import NoSuchElementException, TimeoutException
try:
# Elementi bulmaya çalış
element = driver.find_element(By.ID, "nonExistentElement")
element.click()
except NoSuchElementException:
print("Hata: Element bulunamadı!")
except TimeoutException:
print("Hata: Bekleme süresi aşıldı, element yüklenmedi.")
except Exception as e:
print(f"Beklenmeyen bir hata oluştu: {e}")
finally:
print("İşlem tamamlandı veya hata oluştu.")
# driver.quit() # Hata oluşsa bile tarayıcıyı kapatmak için iyi bir yer.
Ayrıca, bir işlemin başarısız olması durumunda yeniden deneme (retry) mantığı uygulamak, betiğinizin daha dayanıklı olmasını sağlar. Örneğin, bir element bulunamadığında birkaç saniye bekleyip tekrar denemek gibi.
Mobil Uyumluluk ve Responsive Sitelerde Veri Çekme: Her Cihazdan Veri
Günümüzde web sitelerinin büyük bir kısmı responsive tasarıma sahiptir, yani farklı ekran boyutlarına (masaüstü, tablet, mobil) uyum sağlarlar. Veri çekerken, sitenin mobil görünümünden veri çekmek isteyebilirsiniz. Selenium, tarayıcı penceresinin boyutunu ayarlayarak veya User-Agent'ı mobil bir cihazınkiyle değiştirerek bu durumu simüle etmenize olanak tanır.
Tarayıcı penceresini yeniden boyutlandırma:
driver.set_window_size(375, 812) # iPhone X boyutları (genişlik, yükseklik)
# Veya daha gelişmiş mobil emülasyon için:
# chrome_options.add_experimental_option("mobileEmulation", { "deviceName": "iPhone X" })
Mobil uyumlu HTML'den bahsederken, web geliştiricileri genellikle CSS'in media query özelliğini kullanır. Bu, farklı ekran boyutlarına göre stil kuralları tanımlamayı sağlar. Veri çekerken bu bilgiyi anlamak, sitenin mobil versiyonunda hangi elementlerin görünüp görünmediğini tahmin etmenize yardımcı olabilir. İşte basit bir media query örneği:
/* Varsayılan stil (masaüstü) */
.content {
width: 960px;
margin: 0 auto;
}
/* Ekran genişliği 768px veya daha az olduğunda uygulanacak stil (tablet/mobil) */
@media screen and (max-width: 768px) {
.content {
width: 100%;
padding: 10px;
}
.sidebar {
display: none; /* Mobil görünümde yan menüyü gizle */
}
}
Bu CSS kodu, ekran genişliği 768 pikselin altına düştüğünde .content sınıfına sahip elementin genişliğini %100 yaparken, .sidebar sınıfına sahip elementleri gizler. Selenium ile veri çekerken, pencere boyutunu mobil bir cihazınki gibi ayarladığınızda, bu tür CSS kuralları devreye girecek ve sayfadaki elementlerin görünürlüğünü veya konumunu değiştirecektir. Dolayısıyla, mobil versiyondan veri çekmek istiyorsanız, element selector'larınızı buna göre test etmeniz gerekebilir.
Sonuç ve Sıkça Sorulan Sorular
Bu makale boyunca, Python ve Selenium kütüphanesini kullanarak dinamik web sitelerinden nasıl veri çekileceğini adım adım öğrendik. Temel kurulumdan başlayarak, web elementlerini bulma ve onlarla etkileşime geçme, bekleme stratejileri ile dinamik içeriği yönetme konularını ele aldık. Ayrıca, gerçek bir e-ticaret sitesi senaryosu üzerinden öğrendiklerimizi pekiştirdik. Son olarak, headless tarayıcılar, proxy ve User-Agent yönetimi, hata yönetimi ve mobil uyumluluk gibi ileri düzey tekniklerle betiklerimizi daha verimli ve güvenilir hale getirme yollarını keşfettik.
Selenium, modern web'in karmaşık yapısını aşarak, JavaScript ile yüklenen içeriklere ve kullanıcı etkileşimlerine kolayca erişmenizi sağlayan güçlü bir araçtır. Unutmayın ki, web kazıma projelerinizde her zaman hedef sitenin robots.txt dosyasını ve kullanım koşullarını kontrol etmeli, etik sınırlar içinde kalmalısınız. Doğru araçlar ve tekniklerle, web'in sunduğu sınırsız veri potansiyelini keşfedebilir ve projelerinize değer katabilirsiniz.
Sıkça Sorulan Sorular
Selenium ile web kazıma yasal mı ve etik mi?
Web kazımanın yasallığı ve etiği, çekilen verinin türüne, sitenin kullanım koşullarına ve bulunduğunuz ülkedeki yasalara göre değişir. Genel olarak, herkese açık verileri çekmek yasal olabilirken, kişisel verileri veya telif hakkı korunan içerikleri çekmek yasa dışı olabilir. Her zaman sitenin robots.txt dosyasını kontrol edin ve kullanım koşullarını okuyun. Ayrıca, sunucuya aşırı yük bindirmemeye özen gösterin ve kibar bir bot gibi davranın.
Selenium, Requests + BeautifulSoup ikilisine göre ne zaman tercih edilmelidir?
Selenium, web sitelerindeki içerik JavaScript ile dinamik olarak yüklendiğinde veya kullanıcı etkileşimi (tıklama, form doldurma, kaydırma vb.) gerektiren durumlar için tercih edilmelidir. Requests + BeautifulSoup ise statik HTML içeriğine sahip sitelerden veri çekmek için çok daha hızlı ve kaynak açısından verimli bir çözümdür. Özetle, dinamik içerik veya etkileşim = Selenium; statik içerik = Requests + BeautifulSoup.
Web kazıma sırasında sıkça karşılaşılan "Element Not Found" hatası nasıl çözülür?
Bu hata genellikle elementin henüz yüklenmemiş olmasından kaynaklanır. Çözüm olarak, Selenium'un bekleme stratejilerini (Implicit Waits veya Explicit Waits) kullanmalısınız. Özellikle WebDriverWait ve expected_conditions modülü ile belirli bir koşulun gerçekleşmesini beklemek, bu tür hataları büyük ölçüde önleyecektir.
Veri çekerken IP adresimin engellenmesini nasıl önleyebilirim?
IP adresinizin engellenmesini önlemek için çeşitli yöntemler vardır:
- Proxy kullanın: İsteklerinizi farklı IP adresleri üzerinden göndererek tespit edilme riskini azaltın.
- User-Agent değiştirin: Tarayıcınızın kimlik bilgisini sık sık değiştirerek daha doğal bir profil oluşturun.
- Rastgele gecikmeler ekleyin:
time.sleep()ile istekler arasına rastgele süreler ekleyerek bot davranışını gizleyin. - Headless modu kullanın: Daha az kaynak tüketerek ve daha hızlı çalışarak sunucu yükünü azaltın.
- İstek hızınızı sınırlayın: Birim zamandaki istek sayısını düşürün.
Çektiğim verileri hangi formatta kaydetmeliyim?
Çektiğiniz verileri genellikle CSV, JSON veya veritabanı formatlarında kaydedebilirsiniz.
- CSV: Basit, yapılandırılmış veriler için idealdir, Excel gibi programlarla kolayca açılır.
- JSON: Daha karmaşık, iç içe geçmiş veri yapıları için uygundur, web uygulamalarıyla entegrasyonu kolaydır.
- Veritabanı (SQL/NoSQL): Büyük veri setleri ve sürekli veri akışı için en iyi çözümdür, verilerin sorgulanması ve yönetimi kolaylaşır.
Seçiminiz, projenizin gereksinimlerine ve veriyi nasıl kullanacağınıza bağlı olacaktır.