JavaScript ile yüklenen sayfalardan Selenium ile veri nasıl çekilir?
Beceri rehberi

JavaScript ile yüklenen sayfalardan Selenium ile veri nasıl çekilir?

Hazırlayan: Mindset Institute EditörlüğüGüncellendi: 6 dk okuma

JavaScript ile oluşan sayfalardan Selenium ile veri çekmeyi öğrenin: açık bekleme, eleman seçimi, kaydırma, BeautifulSoup ile birleştirme ve alternatifler.

Neden requests ve BeautifulSoup yetmez, Selenium ne yapar?

Bazı sayfalarda tarayıcı ilk yanıtta yalnızca iskeleti alır; asıl içerik JavaScript çalıştıktan sonra, sayfa yüklendikten sonra çekilen veriyle ekrana basılır. Bu tür sayfalarda requests ile indirdiğiniz HTML'de aradığınız veri yoktur. Çözümlemeye geçmeden önce kontrol edin: Tarayıcıda "sayfa kaynağını görüntüle" ile gördüğünüzde veri varsa statik yöntemler yeter; yoksa içerik dinamiktir.

Selenium, gerçek bir tarayıcıyı kodla yönetir: Sayfayı açar, JavaScript'in çalışmasını bekler, düğmelere tıklar, kaydırır, formları doldurur. Veriyi ise tarayıcıdaki oluşmuş sayfadan okursunuz. Bu, BeautifulSoup'un çözümleyemediği sayfaların içine girmenizi sağlar.

Ancak Selenium ağır bir araçtır: Her sayfa için tam bir tarayıcı ve işleme süresi gerekir. Sırasıyla şu seçenekleri değerlendirin: Önce sayfanın veri çektiği arka uç çağrısı (genellikle JSON döndüren bir API) bulunabiliyor mu bakın. Tarayıcı geliştirici araçlarının ağ sekmesinde bu çağrıyı görebilirsiniz; bulursanız doğrudan requests ile çağırmak çok daha hızlı ve dayanıklıdır. Bulamıyorsanız, ya da veri etkileşimle (tıklama, giriş) oluşuyorsa Selenium doğru araçtır.

Tarayıcıyı başlatmak ve sayfayı açmak

Temel akış şöyledir: Tarayıcı sürücüsünü başlatın, sayfaya gidin, işi yapın, tarayıcıyı kapatın. Kapatmayı unutmak arka planda tarayıcı süreçlerinin birikmesine yol açar; bu yüzden try ve finally kullanın.

from selenium import webdriver from selenium.webdriver.common.by import By

surucu = webdriver.Chrome() try: surucu.get(adres) # veri çekme adımları finally: surucu.quit()

Tarayıcı sürücüsü ile tarayıcının sürümleri uyumlu olmalıdır; sürüm uyumsuzluğu ilk çalıştırmada en sık hata nedenidir. Kurulum ayrıntıları ve başsız (görünür pencere olmadan çalışan) mod ayarları tarayıcıya ve Selenium sürümüne göre değiştiği için güncel belgeye bakın. Geliştirme sırasında pencereyi görünür tutmak, ne olduğunu izlemeyi kolaylaştırır; üretim ortamında başsız çalışmak yaygındır.

Kullanılan bellek ve süre çok sayfada hızla artar. Büyük işlerde tek tarayıcı oturumunu birçok sayfa için yeniden kullanın, her sayfa için yeniden açmayın. Çerezleri ve oturum durumunu bilinçli yönetin.

Bekleme stratejisi: en önemli konu

Dinamik sayfada veri ne zaman geldiğini bilmeden okumaya çalışırsanız boş sonuç ya da "element bulunamadı" hatası alırsınız. Çözüm, belirli bir süre uyumak değil, belirli bir koşulu beklemektir.

Selenium belgesine göre bekleme örtük ve açık olarak ayrılır. Örtük bekleme (implicitly_wait), oturum boyunca her eleman aramasına uygulanan genel bir süredir. Açık bekleme (explicit wait) ise belirli bir koşul gerçekleşene ya da süre dolana kadar tekrar tekrar kontrol eden bir döngüdür. Belge uyarı yapar: Örtük ve açık beklemeyi karıştırmayın, aksi halde bekleme süreleri öngörülemez hale gelir. Pratikte açık beklemeyi tercih edin.

from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC

bekle = WebDriverWait(surucu, ZAMAN_ASIMI) liste = bekle.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.product")))

Süre dolduğunda TimeoutException fırlatılır; bunu yakalayıp yeniden deneme ya da kayda geçirme mantığı kurun. Belgedeki bekleme koşulları arasında presence_of_element_located, visibility_of_element_located, element_to_be_clickable, text_to_be_present_in_element, invisibility_of_element_located ve staleness_of vardır. Hangisini seçeceğiniz iş akışına bağlıdır: Veri okumak için çoğunlukla elemanın DOM'da bulunması (presence), tıklama için tıklanabilir olması (clickable) gerekir.

time.sleep yalnızca son çare olmalıdır; sabit uyku ya gereksiz yavaşlatır ya da yetersiz kalır.

Elemanları seçmek ve veriyi okumak

Bekleme tamamlanınca elemanları bulup verilerini okursunuz. Seçici olarak CSS seçici çoğu zaman en okunur yoldur:

kartlar = surucu.find_elements(By.CSS_SELECTOR, "div.product") for kart in kartlar: ad = kart.find_element(By.CSS_SELECTOR, "h2").text baglanti = kart.find_element(By.CSS_SELECTOR, "a").get_attribute("href") kayitlar.append({"ad": ad, "baglanti": baglanti})

find_element tek eleman döndürür ve bulamazsa istisna fırlatır; find_elements liste döndürür ve bulamazsa boş liste verir. Eleman metni .text ile, öznitelikleri get_attribute ile okunur. Seçicileri kararlı özniteliklere (anlamlı sınıf adı, kimlik, veri özniteliği) dayandırın; otomatik üretilmiş rastgele sınıf adları sitenin sonraki sürümünde kırılır.

Bazen en pratik yol araçları birleştirmektir: Selenium sayfayı yükler ve beklemeyi yönetir, sonra surucu.page_source ile oluşmuş HTML metnini alıp BeautifulSoup ile çözümlersiniz. Böylece tarayıcıdan yalnızca gerekli olanı (render) alırsınız, geri kalan çözümleme Selenium'dan hızlı ve rahattır; ayrıca bellekte daha az eleman referansı tutulur.

Eleman referansları sayfa değişince geçersizleşir (stale element). Döngü içinde sayfayı yenileyen bir işlem yapıyorsanız elemanları yeniden bulun; beklerken staleness_of koşulundan yararlanabilirsiniz.

Tıklama, sayfalama ve sonsuz kaydırma

Birçok dinamik sayfa tüm içeriği tek seferde yüklemez. Yaygın kalıplar şunlardır:

  • Sayfalama: "Sonraki" düğmesine tıklayın, yeni içeriğin geldiğini bekleyin (örneğin eski ilk elemanın bayatlamasını ya da yeni elemanın görünmesini), sonra okuyun. Düğme kalmayınca ya da tıklanamaz olunca döngüyü bitirin.
  • "Daha fazla yükle" düğmesi: Aynı mantık; her tıklamadan sonra eleman sayısının arttığını doğrulayın, artış yoksa duracak koşulu bağlayın.
  • Sonsuz kaydırma: Sayfayı en alta kaydırıp yeni içeriğin gelmesini bekleyin. Kaydırma için JavaScript çalıştırılır:

surucu.execute_script("window.scrollTo(0, document.body.scrollHeight);")

Her kaydırmadan sonra sayfa yüksekliğini ya da eleman sayısını karşılaştırın; değişmiyorsa sonuna ulaşmışsınızdır. Sonsuz döngüye karşı en fazla deneme sınırı ekleyin.

Bir sayfa iframe içinde içerik gösteriyorsa önce iframe'e geçmeniz gerekir; belgedeki frame_to_be_available_and_switch_to_it koşulu bunu bekleyip geçişi yapar.

Bu etkileşimleri kurarken tarayıcının görünür modunda adımları izleyin. Çoğu hata, bekleme koşulunun yanlış seçilmesinden ya da elemanın görünür alana girmemesinden çıkar.

Sık yapılan hatalar, etik ve alternatifler

Dinamik sayfa çekimlerinde tekrar eden hatalar:

  • Sabit uyku ile beklemek. Ağ yavaşladığında kırılır, hızlıyken zaman harcar. Koşul bekleyin.
  • Örtük ve açık beklemeyi birlikte kullanmak. Belge bunu açıkça önermez; süreler öngörülemez hale gelir.
  • Tarayıcıyı kapatmamak. try ve finally ya da bağlam yöneticisi kullanın.
  • İlk yanıt ile oluşmuş sayfayı karıştırmak. page_source yalnızca JavaScript tamamlandıktan sonra okunmalıdır.
  • Kırılgan seçiciler. Konuma dayalı, uzun zincirli seçiciler küçük tasarım değişikliğinde bozulur.
  • Her şeyi Selenium ile yapmak. API çağrısı bulunabiliyorsa onu kullanın; çok daha hızlı, ucuz ve dayanıklıdır.
  • Hız sınırı koymamak. İstekler arasında anlamlı aralıklar bırakın.

Etik ve hukuki çerçeve statik sayfalardaki kadar geçerlidir: sitenin kullanım koşulları, robots.txt, kişisel verilerin korunması ve telif. Giriş duvarını, doğrulama kodunu (captcha) ya da bot koruma önlemlerini aşmaya çalışmak çoğu zaman koşulların ihlalidir ve hukuki risk taşır; bu durumda site sahibiyle izin konuşun ya da resmî API'yi tercih edin.

Alternatifler: Sayfanın kendi API'si, resmî veri setleri, RSS ya da veri sağlayıcıları. Verinin kalıcı olarak ihtiyaç duyulduğu bir kurumsal süreçse, kırılgan bir tarayıcı betiğine bağımlı olmak yerine sağlayıcıyla veri anlaşması çoğunlukla daha sürdürülebilirdir.

Bu beceriyi Mindset programlarında nerede çalışırsınız?

Dinamik sayfalardan veri toplama; pazar ve rakip izleme, katalog ve ilan derleme, kamu portallarından rapor verisi toplama ve araştırma ekiplerinin veri ihtiyacı gibi işlerde analistler, veri mühendisleri ve otomasyon geliştiricileri için devreye girer. Ayrıca JavaScript ağırlıklı kurumsal portallarda tekrarlayan rapor indirme işlerini otomatikleştirmek isteyen operasyon ekipleri için de ilgilidir.

Python ile Web Scraping ve Veri Toplama programının modül başlıkları arasında web scraping temelleri ve yasal çerçeve, BeautifulSoup ile statik sayfa çözümleme, Selenium ile dinamik ve JavaScript içerik çekme, API entegrasyonu ve JSON veri toplama ile veri depolama, otomasyon ve boru hattı bulunur. Bu sıra, bir veri toplama işinde önce statik yöntemi, gerekirse tarayıcı otomasyonunu, mümkünse doğrudan API'yi seçme karar sırasını da yansıtır. Data Scraping ve Veri Madenciliği Programı ise toplanan verinin temizlenmesi ve madenciliğine uzanan bir yol arayan ekipler için daha geniş bir seçenektir.

İlgili Mindset programı

Python ile Web Scraping ve Veri Toplama

Sık sorulanlar

Sık sorulan sorular

Selenium ile BeautifulSoup birlikte nasıl kullanılır?

Selenium sayfayı açar, JavaScript'in ve bekleme koşullarının tamamlanmasını sağlar. Ardından page_source ile oluşmuş HTML metnini alır ve BeautifulSoup'a verirsiniz. Böylece tarayıcıyı yalnızca yükleme için kullanıp çözümlemeyi daha hızlı ve rahat yapan BeautifulSoup'a bırakırsınız.

time.sleep yerine ne kullanmalıyım?

Açık bekleme kullanın. WebDriverWait ile expected_conditions modülündeki bir koşulu (eleman bulundu, görünür oldu, tıklanabilir oldu) bekleyin. Koşul gerçekleşince hemen devam edilir, gerçekleşmezse süre dolunca TimeoutException fırlatılır. Sabit uyku ağ hızına duyarsızdır ve ya zaman kaybettirir ya da yetersiz kalır.

Selenium ile veri çekmek yerine API kullanabilir miyim?

Çoğu zaman evet ve tercih edilir. Tarayıcı geliştirici araçlarının ağ sekmesinde sayfanın veri çektiği isteği bulabilirsiniz; genellikle JSON döndürür. Bu isteği doğrudan çağırmak Selenium'dan çok daha hızlıdır. Yalnızca sitenin kullanım koşulları buna izin veriyorsa uygulayın; belirsizse izin isteyin.

Selenium başsız modda çalıştırılabilir mi?

Evet, çoğu tarayıcı pencere göstermeden çalıştırılabilir; sunucuda ve zamanlanmış işlerde yaygındır. Ayar adı tarayıcıya ve Selenium sürümüne göre değişir, bu yüzden güncel belgeye bakın. Geliştirme sırasında pencereyi görünür tutmak hata ayıklamayı kolaylaştırır; bazı siteler başsız tarayıcıyı farklı davranışla karşılayabilir.

Dinamik sayfadan veri çekmek yasal mı?

Sitenin kullanım koşullarına, robots.txt'e, telif ve kişisel veri mevzuatına bağlıdır. Teknik olarak ulaşabilmeniz yasal olduğu anlamına gelmez. Bot korumasını ve giriş engellerini aşmak çoğu zaman koşulları ihlal eder. Belirsiz durumlarda site sahibinden izin alın, resmî API'yi tercih edin ve hukuk ekibine danışın.

Selenium ile Dinamik Sayfadan Veri Çekme (Python)