{"id":33013,"date":"2025-10-28T12:31:21","date_gmt":"2025-10-28T09:31:21","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/"},"modified":"2025-10-28T12:31:21","modified_gmt":"2025-10-28T09:31:21","slug":"selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/","title":{"rendered":"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden verileri nas\u0131l verimli ve g\u00fcvenilir bir \u015fekilde toplayabiliriz? Bu makale, Python ve Selenium k\u00fct\u00fcphanesini kullanarak web otomasyonu ve veri kaz\u0131ma tekniklerini ad\u0131m ad\u0131m \u00f6\u011frenmenizi sa\u011flayacak, b\u00f6ylece siz de web&#8217;in sonsuz veri havuzundan faydalanabileceksiniz.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz dijital d\u00fcnyas\u0131nda veri, adeta yeni petrol olarak nitelendiriliyor. \u0130\u015fletmelerden ara\u015ft\u0131rmac\u0131lara, her alanda do\u011fru ve g\u00fcncel verilere eri\u015fim b\u00fcy\u00fck \u00f6nem ta\u015f\u0131yor. Web kaz\u0131ma (web scraping), internet sitelerindeki yap\u0131land\u0131r\u0131lm\u0131\u015f veya yap\u0131land\u0131r\u0131lmam\u0131\u015f verileri otomatik olarak \u00e7ekme i\u015flemidir. Bu sayede, pazar ara\u015ft\u0131rmas\u0131 yapabilir, fiyat kar\u015f\u0131la\u015ft\u0131rmalar\u0131 ger\u00e7ekle\u015ftirebilir, rakip analizleri y\u00fcr\u00fctebilir veya akademik \u00e7al\u0131\u015fmalar\u0131n\u0131z i\u00e7in b\u00fcy\u00fck veri setleri olu\u015fturabilirsiniz. Ancak, web sitelerinin giderek daha dinamik bir yap\u0131ya b\u00fcr\u00fcnmesi, yani i\u00e7eriklerinin \u00e7o\u011funun JavaScript taraf\u0131ndan y\u00fcklendi\u011fi veya kullan\u0131c\u0131 etkile\u015fimi gerektirdi\u011fi durumlarda, geleneksel veri \u00e7ekme y\u00f6ntemleri (<code>requests<\/code> ve <code>BeautifulSoup<\/code> gibi) \u00e7o\u011fu zaman yetersiz kal\u0131r.<\/p>\n<p>\u0130\u015fte tam bu noktada, <b>Selenium Python veri \u00e7ekme<\/b> i\u015flemleri i\u00e7in vazge\u00e7ilmez bir ara\u00e7 haline geliyor. Selenium, asl\u0131nda web uygulamalar\u0131n\u0131n test edilmesi i\u00e7in geli\u015ftirilmi\u015f g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. Ancak, bir web taray\u0131c\u0131s\u0131n\u0131 programatik olarak kontrol edebilme yetene\u011fi sayesinde, web kaz\u0131ma alan\u0131nda da kendine sa\u011flam bir yer edinmi\u015ftir. Selenium, ger\u00e7ek bir taray\u0131c\u0131y\u0131 (Chrome, Firefox, Edge vb.) ba\u015flat\u0131r ve bir insan kullan\u0131c\u0131n\u0131n yapabilece\u011fi her t\u00fcrl\u00fc eylemi (t\u0131klama, form doldurma, sayfa kayd\u0131rma, bekleme) taklit edebilir. Bu sayede, JavaScript ile y\u00fcklenen i\u00e7erikleri de sorunsuz bir \u015fekilde g\u00f6rebilir ve \u00e7ekebiliriz.<\/p>\n<p>Peki, <b>Selenium&#8217;u di\u011fer web kaz\u0131ma ara\u00e7lar\u0131ndan ay\u0131ran temel \u00f6zellikler nelerdir?<\/b> En ba\u015fta, JavaScript motorunu \u00e7al\u0131\u015ft\u0131ran ger\u00e7ek bir taray\u0131c\u0131 ortam\u0131 sunmas\u0131 gelir. Bu, \u00f6zellikle AJAX \u00e7a\u011fr\u0131lar\u0131, dinamik i\u00e7erik y\u00fcklemeleri veya tek sayfa uygulamalar\u0131 (SPA) gibi modern web teknolojileriyle in\u015fa edilmi\u015f sitelerden veri \u00e7ekerken kritik bir avantaj sa\u011flar. Ayr\u0131ca, Selenium sadece veri \u00e7ekmekle kalmaz, ayn\u0131 zamanda web sitelerindeki otomasyon g\u00f6revleri i\u00e7in de kullan\u0131labilir. \u00d6rne\u011fin, bir web sitesine giri\u015f yapabilir, belirli formlar\u0131 doldurabilir veya birden fazla sayfay\u0131 ziyaret edip \u00e7e\u015fitli etkile\u015fimlerde bulunabilirsiniz. Bu \u00e7ok y\u00f6nl\u00fcl\u00fck, onu sadece bir veri \u00e7ekme arac\u0131 olmaktan \u00e7\u0131kar\u0131p, geni\u015f kapsaml\u0131 bir web otomasyon \u00e7\u00f6z\u00fcm\u00fcne d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/p>\n<p>Sonu\u00e7 olarak, dinamik web sitelerinin karma\u015f\u0131k yap\u0131s\u0131n\u0131 a\u015fmak ve JavaScript ile y\u00fcklenen verilere eri\u015fmek istiyorsan\u0131z, Selenium Python ile veri \u00e7ekme, \u00f6\u011frenilmesi gereken temel bir beceridir. Bu b\u00f6l\u00fcmde, web kaz\u0131ma d\u00fcnyas\u0131ndaki yerini ve \u00f6nemini vurgulad\u0131k. Bir sonraki ad\u0131mda, Selenium&#8217;u kurarak ve ilk ad\u0131mlar\u0131m\u0131z\u0131 atarak bu g\u00fc\u00e7l\u00fc arac\u0131 nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h2>Selenium ve Python ile Veri \u00c7ekmeye Ba\u015flang\u0131\u00e7: Ad\u0131m Ad\u0131m Rehber<\/h2>\n<p>Art\u0131k Selenium&#8217;un web kaz\u0131ma d\u00fcnyas\u0131ndaki \u00f6nemini anlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi s\u0131ra geldi bu g\u00fc\u00e7l\u00fc arac\u0131 pratik olarak kullanmaya ba\u015flamaya. Bu b\u00f6l\u00fcmde, Selenium ve gerekli taray\u0131c\u0131 s\u00fcr\u00fcc\u00fclerini (WebDriver) nas\u0131l kuraca\u011f\u0131m\u0131z\u0131, temel web elementlerini nas\u0131l bulaca\u011f\u0131m\u0131z\u0131 ve onlarla nas\u0131l etkile\u015fime ge\u00e7ece\u011fimizi ad\u0131m ad\u0131m \u00f6\u011frenece\u011fiz. Python ile Selenium&#8217;u kullanarak web sitelerinden veri \u00e7ekme s\u00fcrecini basit ve anla\u015f\u0131l\u0131r \u00f6rneklerle ele alaca\u011f\u0131z.<\/p>\n<h3>Kurulum ve \u0130lk Ad\u0131mlar: Ortam\u0131n\u0131z\u0131 Haz\u0131rlama<\/h3>\n<p>Selenium ile \u00e7al\u0131\u015fmaya ba\u015flamadan \u00f6nce, Python ortam\u0131n\u0131zda baz\u0131 kurulumlar yapman\u0131z gerekiyor. \u0130lk olarak, Python&#8217;\u0131n kurulu oldu\u011fundan emin olun. Ard\u0131ndan, <code>pip<\/code> arac\u0131l\u0131\u011f\u0131yla Selenium k\u00fct\u00fcphanesini y\u00fckleyece\u011fiz. Ayr\u0131ca, Selenium&#8217;un bir taray\u0131c\u0131y\u0131 kontrol edebilmesi i\u00e7in ilgili taray\u0131c\u0131n\u0131n <b>WebDriver<\/b>&#8216;\u0131na ihtiyac\u0131m\u0131z var. Her taray\u0131c\u0131n\u0131n kendi WebDriver&#8217;\u0131 bulunur (\u00f6rne\u011fin, Chrome i\u00e7in ChromeDriver, Firefox i\u00e7in GeckoDriver). Genellikle Chrome en yayg\u0131n tercih edilen taray\u0131c\u0131 oldu\u011fu i\u00e7in, biz de ChromeDriver \u00f6rne\u011fi \u00fczerinden ilerleyece\u011fiz.<\/p>\n<ol>\n<li><b>Python ve Pip Kurulumu:<\/b> Python&#8217;\u0131n bilgisayar\u0131n\u0131zda kurulu oldu\u011funu varsay\u0131yoruz. Kurulu de\u011filse, python.org adresinden indirebilirsiniz.<\/li>\n<li><b>Selenium K\u00fct\u00fcphanesini Kurma:<\/b> Komut istemcisini veya terminali a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<br \/>\n      <codetag><\/p>\n<pre><code class=\"language-python\">pip install selenium<\/pre>\n<p><\/code><\/codetag><br \/>\n      Bu komut, Selenium k\u00fct\u00fcphanesini Python ortam\u0131n\u0131za y\u00fckleyecektir.<\/li>\n<li><b>WebDriver \u0130ndirme:<\/b> Kulland\u0131\u011f\u0131n\u0131z taray\u0131c\u0131ya uygun WebDriver'\u0131 indirmeniz gerekiyor. E\u011fer Chrome kullan\u0131yorsan\u0131z, <a href=\"https:\/\/chromedriver.chromium.org\/downloads\">ChromeDriver indirme sayfas\u0131n\u0131<\/a> ziyaret edin. Taray\u0131c\u0131n\u0131z\u0131n s\u00fcr\u00fcm\u00fcne uygun ChromeDriver s\u00fcr\u00fcm\u00fcn\u00fc indirdi\u011finizden emin olun (Chrome taray\u0131c\u0131n\u0131z\u0131n s\u00fcr\u00fcm\u00fcn\u00fc \"Ayarlar -> Chrome Hakk\u0131nda\" k\u0131sm\u0131ndan g\u00f6rebilirsiniz). \u0130ndirdi\u011finiz <code>chromedriver.exe<\/code> (Windows) veya <code>chromedriver<\/code> (macOS\/Linux) dosyas\u0131n\u0131 Python beti\u011finizin bulundu\u011fu dizine veya sistem PATH'inize ekleyebilece\u011finiz bir konuma kopyalay\u0131n. Kolayl\u0131k sa\u011flamas\u0131 a\u00e7\u0131s\u0131ndan, \u015fimdilik beti\u011finizle ayn\u0131 dizine koymay\u0131 tercih edebiliriz.<\/li>\n<\/ol>\n<p>T\u00fcm bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, ilk Selenium beti\u011finizi yazmaya haz\u0131rs\u0131n\u0131z demektir. Hadi basit bir \u00f6rnekle ba\u015flayal\u0131m ve Google anasayfas\u0131n\u0131 a\u00e7al\u0131m:<\/p>\n<p>  <codetag><\/p>\n<pre><code class=\"language-python\">from selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom selenium.webdriver.common.by import By\n\n# WebDriver'\u0131n yolunu belirtin\n# E\u011fer chromedriver.exe dosyas\u0131n\u0131 beti\u011finizin oldu\u011fu dizine koyduysan\u0131z, sadece dosya ad\u0131n\u0131 yazabilirsiniz.\n# Veya tam yolu belirtin: 'C:\/path\/to\/chromedriver.exe'\nchromedriver_path = '.\/chromedriver.exe' \nservice = Service(executable_path=chromedriver_path)\n\n# Taray\u0131c\u0131y\u0131 ba\u015flat\ndriver = webdriver.Chrome(service=service)\n\n# Bir web sitesini a\u00e7\ndriver.get(\"https:\/\/www.google.com\")\n\n# Sayfan\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 yazd\u0131r\nprint(f\"Sayfa Ba\u015fl\u0131\u011f\u0131: {driver.title}\")\n\n# Taray\u0131c\u0131y\u0131 kapat (iste\u011fe ba\u011fl\u0131, g\u00f6rmek i\u00e7in yorum sat\u0131r\u0131 yap\u0131labilir)\n# driver.quit()\n<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Bu kod blo\u011fu, bilgisayar\u0131n\u0131zda bir Chrome taray\u0131c\u0131s\u0131 a\u00e7acak, Google anasayfas\u0131na gidecek, sayfan\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 konsola yazd\u0131racak ve ard\u0131ndan taray\u0131c\u0131y\u0131 kapatacakt\u0131r. Bu basit ad\u0131mlarla, Selenium'un web otomasyonu i\u00e7in temel yap\u0131 ta\u015flar\u0131n\u0131 anlam\u0131\u015f oluyoruz.<\/p>\n<h3>Web Elementlerini Bulma ve Etkile\u015fime Ge\u00e7me: Verilere Ula\u015fma<\/h3>\n<p>Web sitelerinden veri \u00e7ekmenin anahtar\u0131, \u00e7ekmek istedi\u011fimiz bilgilerin bulundu\u011fu HTML elementlerini do\u011fru bir \u015fekilde bulabilmektir. Selenium, elementleri bulmak i\u00e7in \u00e7e\u015fitli y\u00f6ntemler sunar: ID, Name, Class Name, Tag Name, Link Text, Partial Link Text, XPath ve CSS Selector. En esnek ve g\u00fc\u00e7l\u00fc y\u00f6ntemler genellikle <b>XPath<\/b> ve <b>CSS Selector<\/b>'lard\u0131r.<\/p>\n<p>Bir web elementini bulmak i\u00e7in \u00f6ncelikle o elementin HTML yap\u0131s\u0131n\u0131 incelememiz gerekir. Taray\u0131c\u0131n\u0131z\u0131n \"Geli\u015ftirici Ara\u00e7lar\u0131\" (F12) \u00f6zelli\u011fini kullanarak bu yap\u0131ya eri\u015febilirsiniz. \u00d6rne\u011fin, Google arama \u00e7ubu\u011funu bulal\u0131m ve oraya bir metin yaz\u0131p arama yapal\u0131m:<\/p>\n<p>  <codetag><\/p>\n<pre><code class=\"language-python\">from selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.common.keys import Keys # Klavye tu\u015flar\u0131 i\u00e7in\n\nchromedriver_path = '.\/chromedriver.exe'\nservice = Service(executable_path=chromedriver_path)\ndriver = webdriver.Chrome(service=service)\n\ndriver.get(\"https:\/\/www.google.com\")\n\ntry:\n    # Arama \u00e7ubu\u011funu bul (genellikle 'name' attribute'\u0131 'q' olur)\n    search_box = driver.find_element(By.NAME, \"q\")\n\n    # Arama \u00e7ubu\u011funa metin yaz\n    search_box.send_keys(\"Selenium Python veri \u00e7ekme\")\n\n    # Enter tu\u015funa basarak arama yap\n    search_box.send_keys(Keys.RETURN)\n\n    # Arama sonu\u00e7lar\u0131 sayfas\u0131n\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 yazd\u0131r\n    print(f\"Arama Sonu\u00e7lar\u0131 Sayfas\u0131 Ba\u015fl\u0131\u011f\u0131: {driver.title}\")\n\n    # \u0130lk arama sonucunu bul ve t\u0131klama (\u00f6rne\u011fin, h3 etiketiyle ba\u015flayan bir link)\n    # Bu k\u0131sm\u0131 daha spesifik bir CSS Selector veya XPath ile iyile\u015ftirmek gerekebilir\n    # Google'\u0131n yap\u0131s\u0131 s\u00fcrekli de\u011fi\u015febilir, bu y\u00fczden bu selekt\u00f6r her zaman \u00e7al\u0131\u015fmayabilir.\n    first_result = driver.find_element(By.CSS_SELECTOR, \"h3\")\n    print(f\"\u0130lk sonu\u00e7: {first_result.text}\")\n    first_result.click()\n\n    # Yeni a\u00e7\u0131lan sayfan\u0131n ba\u015fl\u0131\u011f\u0131n\u0131 yazd\u0131r\n    print(f\"T\u0131klanan Sayfan\u0131n Ba\u015fl\u0131\u011f\u0131: {driver.title}\")\n\nfinally:\n    # \u0130\u015flem bittikten sonra taray\u0131c\u0131y\u0131 kapat\n    driver.quit()\n<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Bu \u00f6rnekte, <code>find_element(By.NAME, \"q\")<\/code> ile arama \u00e7ubu\u011funu bulduk ve <code>send_keys()<\/code> metodu ile i\u00e7ine metin yazd\u0131k. Ard\u0131ndan, <code>Keys.RETURN<\/code> kullanarak Enter tu\u015funa basm\u0131\u015f gibi davrand\u0131k. Son olarak, arama sonu\u00e7lar\u0131 sayfas\u0131ndaki ilk <code>h3<\/code> etiketini bularak ona t\u0131klad\u0131k. Bu etkile\u015fimler, Selenium'un web siteleriyle ne kadar derinlemesine etkile\u015fim kurabildi\u011fini g\u00f6stermektedir.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Elementleri bulmakta zorlan\u0131yorsan\u0131z, taray\u0131c\u0131n\u0131z\u0131n geli\u015ftirici ara\u00e7lar\u0131ndaki \"Element Se\u00e7\" arac\u0131n\u0131 kullan\u0131n ve istedi\u011finiz elemente t\u0131klay\u0131n. Ard\u0131ndan, sa\u011f t\u0131klayarak \"Copy\" se\u00e7ene\u011finden \"Copy selector\" veya \"Copy XPath\" ile direkt olarak selector'\u0131 alabilirsiniz. Bu, zaman kazand\u0131ran pratik bir y\u00f6ntemdir.<\/div>\n<h3>Dinamik \u0130\u00e7erik ve Bekleme Stratejileri: Sab\u0131rla Veri Toplama<\/h3>\n<p>Modern web sitelerinin en b\u00fcy\u00fck \u00f6zelliklerinden biri, i\u00e7eri\u011fi dinamik olarak y\u00fcklemeleridir. Bu durum, Selenium gibi bir otomasyon arac\u0131n\u0131n hemen bir elementi bulmaya \u00e7al\u0131\u015fmas\u0131 durumunda \"Element Not Found\" hatas\u0131yla kar\u015f\u0131la\u015f\u0131lmas\u0131na neden olabilir. \u00c7\u00fcnk\u00fc sayfa y\u00fcklendi\u011finde, element hen\u00fcz DOM'a eklenmemi\u015f olabilir. Bu t\u00fcr senaryolar i\u00e7in Selenium'da bekleme stratejileri kullanmak hayati \u00f6neme sahiptir.<\/p>\n<p>Selenium'da iki ana bekleme t\u00fcr\u00fc vard\u0131r: <b>Implicit Waits (\u00d6rt\u00fck Beklemeler)<\/b> ve <b>Explicit Waits (A\u00e7\u0131k Beklemeler)<\/b>.<\/p>\n<ul>\n<li>\n<p><b>Implicit Waits (\u00d6rt\u00fck Beklemeler):<\/b> Taray\u0131c\u0131ya, bir elementi bulmaya \u00e7al\u0131\u015f\u0131rken belirli bir s\u00fcreye kadar beklemesini s\u00f6yler. E\u011fer element belirtilen s\u00fcre i\u00e7inde bulunursa i\u015flem devam eder, bulunamazsa hata verir. Bu bekleme s\u00fcresi bir kez ayarland\u0131\u011f\u0131nda, <code>driver<\/code> nesnesinin t\u00fcm \u00f6mr\u00fc boyunca ge\u00e7erli olur.<\/p>\n<p>      <codetag><\/p>\n<pre><code class=\"language-python\">driver.implicitly_wait(10) # 10 saniyeye kadar bekle<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Bu, basit senaryolar i\u00e7in kullan\u0131\u015fl\u0131 olsa da, her element i\u00e7in ayn\u0131 s\u00fcreyi bekleyebilece\u011fi i\u00e7in gereksiz gecikmelere yol a\u00e7abilir.<\/p>\n<\/li>\n<li>\n<p><b>Explicit Waits (A\u00e7\u0131k Beklemeler):<\/b> Daha esnek ve g\u00fc\u00e7l\u00fc bir bekleme y\u00f6ntemidir. Belirli bir ko\u015ful kar\u015f\u0131lanana kadar veya maksimum bir s\u00fcre ge\u00e7ene kadar beklemeyi sa\u011flar. \u00d6rne\u011fin, bir elementin g\u00f6r\u00fcn\u00fcr hale gelmesini, t\u0131klanabilir olmas\u0131n\u0131 veya belirli bir metni i\u00e7ermesini bekleyebilirsiniz. Bu, \u00f6zellikle AJAX \u00e7a\u011fr\u0131lar\u0131 sonras\u0131 y\u00fcklenen i\u00e7erikler i\u00e7in idealdir.<\/p>\n<p>      <codetag><\/p>\n<pre><code class=\"language=\"python\"\">from selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n# Belirli bir elementin t\u0131klanabilir olmas\u0131n\u0131 10 saniyeye kadar bekle\nelement = WebDriverWait(driver, 10).until(\n    EC.element_to_be_clickable((By.ID, \"myButton\"))\n)\nelement.click()<\/pre>\n<p><\/code><\/codetag><\/p>\n<p><code>expected_conditions<\/code> mod\u00fcl\u00fc, bekleyebilece\u011finiz bir\u00e7ok farkl\u0131 ko\u015ful sunar: <code>presence_of_element_located<\/code>, <code>visibility_of_element_located<\/code>, <code>text_to_be_present_in_element<\/code> vb.<\/p>\n<\/li>\n<\/ul>\n<p>Do\u011fru bekleme stratejilerini kullanmak, Selenium betiklerinizin hem daha stabil \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar hem de gereksiz gecikmeleri \u00f6nleyerek performans\u0131n\u0131 art\u0131r\u0131r. \u00d6zellikle karma\u015f\u0131k ve JavaScript a\u011f\u0131rl\u0131kl\u0131 sitelerde, a\u00e7\u0131k beklemeler olmazsa olmazd\u0131r.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: E-ticaret Sitesinden \u00dcr\u00fcn Verisi \u00c7ekme<\/h2>\n<p>Teorik bilgileri ve temel uygulamalar\u0131 geride b\u0131rakt\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi \u00f6\u011frendiklerimizi bir araya getirerek ger\u00e7ek bir senaryo \u00fczerinde \u00e7al\u0131\u015fal\u0131m: Bir e-ticaret sitesinden \u00fcr\u00fcn verileri \u00e7ekme. Bu vaka analizinde, belirli bir kategorideki \u00fcr\u00fcnlerin adlar\u0131n\u0131, fiyatlar\u0131n\u0131 ve linklerini toplayaca\u011f\u0131z. Bu, bir\u00e7ok veri kaz\u0131ma projesinin temelini olu\u015fturan yayg\u0131n bir g\u00f6revdir.<\/p>\n<p>Hayali bir e-ticaret sitesi olan \"\u00f6rnek-alisveris.com\" adresindeki \"Elektronik\" kategorisindeki \u00fcr\u00fcnleri \u00e7ekmeye \u00e7al\u0131\u015faca\u011f\u0131z. Bu site, \u00fcr\u00fcnleri sayfa kayd\u0131rd\u0131k\u00e7a dinamik olarak y\u00fckleyen ve baz\u0131 \u00fcr\u00fcnlerin \u00f6zelliklerini AJAX ile getiren bir yap\u0131ya sahip olabilir. Bu durum, hem element bulma hem de bekleme stratejileri konusunda bize pratik yapma imkan\u0131 sunacakt\u0131r.<\/p>\n<h3>Senaryo Detaylar\u0131 ve Hedeflenen Veriler<\/h3>\n<ul>\n<li><b>Hedef Site:<\/b> <code>https:\/\/www.example-alisveris.com\/elektronik-kategorisi<\/code> (Bu URL ve site ger\u00e7ek de\u011fildir, sadece bir senaryo i\u00e7in kullan\u0131lm\u0131\u015ft\u0131r. Kendi ger\u00e7ek hedefinizi belirlerken l\u00fctfen sitenin kullan\u0131m ko\u015fullar\u0131n\u0131 ve etik kurallar\u0131 dikkate al\u0131n.)<\/li>\n<li><b>Hedeflenen Veriler:<\/b>\n<ul>\n<li>\u00dcr\u00fcn Ad\u0131<\/li>\n<li>\u00dcr\u00fcn Fiyat\u0131<\/li>\n<li>\u00dcr\u00fcn Linki (detay sayfas\u0131na giden)<\/li>\n<\/ul>\n<\/li>\n<li><b>Zorluklar:<\/b>\n<ul>\n<li>Sayfaland\u0131rma (bir sonraki sayfaya ge\u00e7me)<\/li>\n<li>Dinamik y\u00fcklenen i\u00e7erikler (sayfa kayd\u0131rma ile gelen \u00fcr\u00fcnler)<\/li>\n<li>Fiyat veya indirim gibi baz\u0131 verilerin ge\u00e7 y\u00fcklenmesi<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Kodsal Uygulama: Ad\u0131m Ad\u0131m Veri \u00c7ekme<\/h3>\n<p>A\u015fa\u011f\u0131daki kod blo\u011fu, bu senaryoyu nas\u0131l ele alabilece\u011fimizi g\u00f6steriyor. \u00d6rnek-alisveris.com yerine, siz kendi projenizdeki bir e-ticaret sitesini hedefleyerek CSS selector'lar\u0131 ve XPath'leri buna g\u00f6re ayarlamal\u0131s\u0131n\u0131z. Unutmay\u0131n ki, web sitelerinin HTML yap\u0131lar\u0131 zamanla de\u011fi\u015febilir, bu y\u00fczden selector'lar\u0131n\u0131z\u0131 periyodik olarak kontrol etmeniz gerekebilir.<\/p>\n<p>  <codetag><\/p>\n<pre><code class=\"language-python\">from selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.ui import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\nimport time\n\nchromedriver_path = '.\/chromedriver.exe'\nservice = Service(executable_path=chromedriver_path)\ndriver = webdriver.Chrome(service=service)\ndriver.maximize_window() # Taray\u0131c\u0131 penceresini tam ekran yap\n\n# Implicit wait ile t\u00fcm element aramalar\u0131 i\u00e7in varsay\u0131lan bir bekleme s\u00fcresi belirle\ndriver.implicitly_wait(5) \n\n# \u00dcr\u00fcnleri toplayaca\u011f\u0131m\u0131z liste\nall_products = []\n\ntry:\n    # Hedef kategori sayfas\u0131n\u0131 a\u00e7\n    # GER\u00c7EK B\u0130R S\u0130TE \u0130LE DE\u011e\u0130\u015eT\u0130R\u0130N\u0130Z!\n    driver.get(\"https:\/\/www.hepsiburada.com\/laptop-masaustu-bilgisayarlar-c-204\") \n    \n    # Sayfan\u0131n alt k\u0131sm\u0131na do\u011fru kayd\u0131rarak dinamik i\u00e7eriklerin y\u00fcklenmesini bekle\n    # Bu i\u015flemi birden fazla kez tekrarlamak gerekebilir\n    last_height = driver.execute_script(\"return document.body.scrollHeight\")\n    while True:\n        driver.execute_script(\"window.scrollTo(0, document.body.scrollHeight);\")\n        time.sleep(3) # \u0130\u00e7eri\u011fin y\u00fcklenmesi i\u00e7in bekle\n        new_height = driver.execute_script(\"return document.body.scrollHeight\")\n        if new_height == last_height:\n            break\n        last_height = new_height\n\n    # \u00dcr\u00fcn elementlerini bulmak i\u00e7in CSS Selector kullan\u0131yoruz.\n    # Bu selector, \u00f6rnek olarak bir e-ticaret sitesinin \u00fcr\u00fcn listeleme yap\u0131s\u0131na g\u00f6re yaz\u0131lm\u0131\u015ft\u0131r.\n    # Ger\u00e7ek bir site i\u00e7in bu selector'\u0131 geli\u015ftirici ara\u00e7lar\u0131 ile bulman\u0131z gerekmektedir.\n    # \u00d6rne\u011fin, her bir \u00fcr\u00fcn kart\u0131 'div.productListContent-zAP0s5Qef_WjHq_PJb_P' gibi bir class'a sahip olabilir.\n    product_cards = driver.find_elements(By.CSS_SELECTOR, \"li.productListContent-zAP0s5Qef_WjHq_PJb_P\") # \u00d6rnek bir CSS Selector\n\n    print(f\"Toplam {len(product_cards)} \u00fcr\u00fcn kart\u0131 bulundu.\")\n\n    for card in product_cards:\n        try:\n            # \u00dcr\u00fcn ad\u0131n\u0131 \u00e7ek\n            # 'h3' etiketi alt\u0131ndaki 'a' etiketinin 'title' attribute'u veya 'text'i\n            product_name_element = card.find_element(By.CSS_SELECTOR, \"h3 > a\") \n            product_name = product_name_element.get_attribute(\"title\") or product_name_element.text\n            \n            # \u00dcr\u00fcn fiyat\u0131n\u0131 \u00e7ek (fiyat\u0131n genellikle belirli bir span veya div i\u00e7inde oldu\u011fu varsay\u0131l\u0131r)\n            # Fiyat\u0131n dinamik y\u00fcklenmesi ihtimaline kar\u015f\u0131 explicit wait kullanabiliriz.\n            product_price_element = WebDriverWait(card, 5).until(\n                EC.presence_of_element_located((By.CSS_SELECTOR, \"div.product-card-price > div > div.price-value-container > div\")) # \u00d6rnek fiyat selector'\u0131\n            )\n            product_price = product_price_element.text\n            \n            # \u00dcr\u00fcn linkini \u00e7ek\n            product_link = product_name_element.get_attribute(\"href\")\n\n            all_products.append({\n                \"Ad\u0131\": product_name.strip(),\n                \"Fiyat\u0131\": product_price.strip(),\n                \"Linki\": product_link\n            })\n        except Exception as e:\n            print(f\"Bir \u00fcr\u00fcn kart\u0131 i\u015flenirken hata olu\u015ftu: {e}\")\n            # Hata olan \u00fcr\u00fcn\u00fc atlay\u0131p devam et\n            continue\n\n    # Toplanan verileri yazd\u0131r\n    for product in all_products:\n        print(f\"Ad\u0131: {product['Ad\u0131']}, Fiyat\u0131: {product['Fiyat\u0131']}, Linki: {product['Linki']}\")\n\nfinally:\n    driver.quit()\n\nprint(f\"\\nToplamda {len(all_products)} \u00fcr\u00fcn bilgisi \u00e7ekildi.\")\n<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Bu \u00f6rnekte, sayfa kayd\u0131rma ile dinamik y\u00fcklenen \u00fcr\u00fcnleri \u00e7ekmek i\u00e7in bir <code>while<\/code> d\u00f6ng\u00fcs\u00fc kulland\u0131k. Sayfa y\u00fcksekli\u011fi de\u011fi\u015fmedi\u011fi s\u00fcrece kayd\u0131rmaya devam ederek t\u00fcm \u00fcr\u00fcnlerin y\u00fcklenmesini bekledik. Ard\u0131ndan, her bir \u00fcr\u00fcn kart\u0131 i\u00e7in ayr\u0131 ayr\u0131 CSS selector'lar kullanarak ad\u0131, fiyat\u0131 ve linki \u00e7ektik. Fiyat gibi kritik verilerin ge\u00e7 y\u00fcklenme ihtimaline kar\u015f\u0131, bu elementler i\u00e7in <code>WebDriverWait<\/code> ile a\u00e7\u0131k bekleme kulland\u0131k.<\/p>\n<div class=\"expert-tip\">Uzman \u0130pucu: Web siteleri anti-bot \u00f6nlemleri alabilir. S\u00fcrekli ve h\u0131zl\u0131 istekler atmak yerine, <code>time.sleep()<\/code> ile rastgele gecikmeler eklemek, daha do\u011fal bir kullan\u0131c\u0131 davran\u0131\u015f\u0131n\u0131 taklit etmenizi ve engellenme riskinizi azaltman\u0131z\u0131 sa\u011flar. Ancak \u00e7ok fazla bekleme s\u00fcresi performans\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcrecektir.<\/div>\n<p>Bu vaka analizi, ger\u00e7ek d\u00fcnya senaryolar\u0131nda Selenium'u nas\u0131l uygulayabilece\u011fimize dair sa\u011flam bir temel sunuyor. Bir sonraki b\u00f6l\u00fcmde, daha ileri d\u00fczey teknikleri ve optimizasyon stratejilerini ele alarak, veri \u00e7ekme becerilerinizi bir \u00fcst seviyeye ta\u015f\u0131yaca\u011f\u0131z.<\/p>\n<h2>\u0130leri D\u00fczey Selenium Teknikleri ve Optimizasyon<\/h2>\n<p>Selenium ile temel veri \u00e7ekme ve otomasyon i\u015flemlerini \u00f6\u011frendi\u011fimize g\u00f6re, \u015fimdi daha karma\u015f\u0131k senaryolar\u0131 ele almak ve performans\u0131m\u0131z\u0131 art\u0131rmak i\u00e7in kullanabilece\u011fimiz ileri d\u00fczey tekniklere odaklanal\u0131m. Bu b\u00f6l\u00fcmde, headless taray\u0131c\u0131lar, proxy ve user-agent y\u00f6netimi, hata y\u00f6netimi ve mobil uyumluluk gibi konular\u0131 i\u015fleyece\u011fiz.<\/p>\n<h3>Headless Taray\u0131c\u0131lar ve Performans Art\u0131\u015f\u0131: G\u00f6r\u00fcnmez Otomasyon<\/h3>\n<p>Varsay\u0131lan olarak, Selenium bir taray\u0131c\u0131 penceresi a\u00e7ar ve t\u00fcm i\u015flemleri g\u00f6rsel olarak ger\u00e7ekle\u015ftirir. Bu, geli\u015ftirme a\u015famas\u0131nda ne oldu\u011funu g\u00f6rmek i\u00e7in faydal\u0131 olsa da, \u00fcretim ortam\u0131nda veya b\u00fcy\u00fck \u00f6l\u00e7ekli veri \u00e7ekme i\u015flemlerinde gereksiz kaynak t\u00fcketimine neden olabilir. <b>Headless taray\u0131c\u0131lar<\/b>, taray\u0131c\u0131y\u0131 grafik aray\u00fcz\u00fc olmadan \u00e7al\u0131\u015ft\u0131rma yetene\u011fi sunar. Bu, \u00f6zellikle sunucu ortamlar\u0131nda veya ayn\u0131 anda birden fazla taray\u0131c\u0131 \u00e7al\u0131\u015ft\u0131rman\u0131z gerekti\u011finde \u00f6nemli performans art\u0131\u015f\u0131 ve kaynak tasarrufu sa\u011flar.<\/p>\n<p>Chrome i\u00e7in headless modu etkinle\u015ftirmek olduk\u00e7a basittir. <code>ChromeOptions<\/code> s\u0131n\u0131f\u0131n\u0131 kullanarak taray\u0131c\u0131ya \"headless\" arg\u00fcman\u0131n\u0131 eklemeniz yeterlidir:<\/p>\n<p>  <codetag><\/p>\n<pre><code class=\"language-python\">from selenium import webdriver\nfrom selenium.webdriver.chrome.service import Service\nfrom selenium.webdriver.chrome.options import Options\n\nchromedriver_path = '.\/chromedriver.exe'\nservice = Service(executable_path=chromedriver_path)\n\nchrome_options = Options()\nchrome_options.add_argument(\"--headless\") # Headless modunu etkinle\u015ftir\nchrome_options.add_argument(\"--disable-gpu\") # GPU kullan\u0131m\u0131n\u0131 devre d\u0131\u015f\u0131 b\u0131rak (Linux'ta gerekli olabilir)\nchrome_options.add_argument(\"--no-sandbox\") # G\u00fcvenlik nedenleriyle baz\u0131 sistemlerde gerekli olabilir\n\ndriver = webdriver.Chrome(service=service, options=chrome_options)\n\ndriver.get(\"https:\/\/www.whatismybrowser.com\/detect\/what-is-my-user-agent\")\nprint(f\"Headless Modda Sayfa Ba\u015fl\u0131\u011f\u0131: {driver.title}\")\nprint(f\"User-Agent: {driver.find_element(By.ID, 'detected_user_agent').text}\")\n\ndriver.quit()\n<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Bu kod, taray\u0131c\u0131 penceresi a\u00e7madan ayn\u0131 i\u015flemleri arka planda y\u00fcr\u00fctecek ve b\u00f6ylece daha h\u0131zl\u0131 ve daha az kaynak t\u00fcketerek \u00e7al\u0131\u015facakt\u0131r. Bu, \u00f6zellikle bulut tabanl\u0131 sunucularda \u00e7al\u0131\u015fan veri \u00e7ekme betikleri i\u00e7in kritik bir optimizasyondur.<\/p>\n<h3>Proxy ve User-Agent Y\u00f6netimi: Kimli\u011finizi Gizleme<\/h3>\n<p>Web siteleri, a\u015f\u0131r\u0131 ve otomatik istekleri tespit etmek i\u00e7in IP adresinizi ve User-Agent bilginizi kullanabilir. S\u0131k s\u0131k ayn\u0131 IP adresinden veya standart bir User-Agent ile istekler g\u00f6nderirseniz, siteler taraf\u0131ndan engellenebilirsiniz. Bu durumu a\u015fmak i\u00e7in <b>proxy sunucular\u0131<\/b> ve <b>User-Agent de\u011fi\u015ftirme<\/b> tekniklerini kullan\u0131r\u0131z.<\/p>\n<ul>\n<li>\n<p><b>Proxy Kullan\u0131m\u0131:<\/b> Proxy sunucusu, isteklerinizi ba\u015fka bir IP adresi \u00fczerinden g\u00f6ndermenizi sa\u011flar. Bu, engellenme riskinizi azalt\u0131r ve farkl\u0131 co\u011frafi konumlardan verilere eri\u015fmenize olanak tan\u0131r. Proxy ayarlar\u0131n\u0131 <code>ChromeOptions<\/code> \u00fczerinden yapabilirsiniz:<\/p>\n<p>      <codetag><\/p>\n<pre><code class=\"language-python\">from selenium.webdriver.chrome.options import Options\n\nchrome_options = Options()\nproxy = \"IP_ADRESI:PORT\" # \u00d6rne\u011fin: \"10.10.10.10:8888\"\n# E\u011fer kimlik do\u011frulamal\u0131 proxy kullan\u0131yorsan\u0131z, proxy eklentisi kullanman\u0131z gerekebilir.\nchrome_options.add_argument(f'--proxy-server={proxy}')\n\n# Headless modu da ekleyelim\nchrome_options.add_argument(\"--headless\")\n\ndriver = webdriver.Chrome(service=service, options=chrome_options)\ndriver.get(\"https:\/\/www.whatismyip.com\/\") # IP adresinizi kontrol etmek i\u00e7in bir site\nprint(f\"Proxy ile \u00c7al\u0131\u015fan IP: {driver.find_element(By.CSS_SELECTOR, 'h1#your-ip').text}\")\ndriver.quit()\n<\/pre>\n<p><\/code><\/codetag>\n    <\/li>\n<li>\n<p><b>User-Agent De\u011fi\u015ftirme:<\/b> User-Agent, taray\u0131c\u0131n\u0131z\u0131n ve i\u015fletim sisteminizin sunucuya g\u00f6nderdi\u011fi bir kimlik bilgisidir. Varsay\u0131lan Selenium User-Agent'\u0131 kolayca tespit edilebilir. Daha yayg\u0131n bir taray\u0131c\u0131dan geliyormu\u015f gibi g\u00f6r\u00fcnmek i\u00e7in User-Agent'\u0131 de\u011fi\u015ftirebilirsiniz:<\/p>\n<p>      <codetag><\/p>\n<pre><code class=\"language-python\">from selenium.webdriver.chrome.options import Options\n\nchrome_options = Options()\n# Pop\u00fcler bir Chrome User-Agent'\u0131\nuser_agent = \"Mozilla\/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/108.0.0.0 Safari\/537.36\"\nchrome_options.add_argument(f\"user-agent={user_agent}\")\nchrome_options.add_argument(\"--headless\")\n\ndriver = webdriver.Chrome(service=service, options=chrome_options)\ndriver.get(\"https:\/\/www.whatismybrowser.com\/detect\/what-is-my-user-agent\")\nprint(f\"De\u011fi\u015ftirilen User-Agent: {driver.find_element(By.ID, 'detected_user_agent').text}\")\ndriver.quit()\n<\/pre>\n<p><\/code><\/codetag>\n    <\/li>\n<\/ul>\n<p>Bu teknikler, bot tespit sistemlerini atlatman\u0131za yard\u0131mc\u0131 olabilir ancak her zaman etik kurallara ve sitelerin kullan\u0131m ko\u015fullar\u0131na uygun hareket etmeyi unutmamak \u00f6nemlidir.<\/p>\n<h3>Hata Y\u00f6netimi ve G\u00fcvenilir Kaz\u0131ma: Kesintisiz Veri Ak\u0131\u015f\u0131<\/h3>\n<p>Web kaz\u0131ma betikleri, a\u011f sorunlar\u0131, elementlerin bulunamamas\u0131 veya site yap\u0131s\u0131ndaki ani de\u011fi\u015fiklikler gibi \u00e7e\u015fitli nedenlerle hatalarla kar\u015f\u0131la\u015fabilir. G\u00fcvenilir bir kaz\u0131ma beti\u011fi yazmak i\u00e7in <b>hata y\u00f6netimi<\/b> mekanizmalar\u0131 eklemek kritik \u00f6neme sahiptir. Python'daki <code>try-except<\/code> bloklar\u0131n\u0131 kullanarak olas\u0131 hatalar\u0131 yakalay\u0131p uygun \u015fekilde i\u015fleyebiliriz.<\/p>\n<p>  <codetag><\/p>\n<pre><code class=\"language-python\">from selenium.common.exceptions import NoSuchElementException, TimeoutException\n\ntry:\n    # Elementi bulmaya \u00e7al\u0131\u015f\n    element = driver.find_element(By.ID, \"nonExistentElement\")\n    element.click()\nexcept NoSuchElementException:\n    print(\"Hata: Element bulunamad\u0131!\")\nexcept TimeoutException:\n    print(\"Hata: Bekleme s\u00fcresi a\u015f\u0131ld\u0131, element y\u00fcklenmedi.\")\nexcept Exception as e:\n    print(f\"Beklenmeyen bir hata olu\u015ftu: {e}\")\nfinally:\n    print(\"\u0130\u015flem tamamland\u0131 veya hata olu\u015ftu.\")\n    # driver.quit() # Hata olu\u015fsa bile taray\u0131c\u0131y\u0131 kapatmak i\u00e7in iyi bir yer.\n<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Ayr\u0131ca, bir i\u015flemin ba\u015far\u0131s\u0131z olmas\u0131 durumunda yeniden deneme (retry) mant\u0131\u011f\u0131 uygulamak, beti\u011finizin daha dayan\u0131kl\u0131 olmas\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir element bulunamad\u0131\u011f\u0131nda birka\u00e7 saniye bekleyip tekrar denemek gibi.<\/p>\n<h3>Mobil Uyumluluk ve Responsive Sitelerde Veri \u00c7ekme: Her Cihazdan Veri<\/h3>\n<p>G\u00fcn\u00fcm\u00fczde web sitelerinin b\u00fcy\u00fck bir k\u0131sm\u0131 responsive tasar\u0131ma sahiptir, yani farkl\u0131 ekran boyutlar\u0131na (masa\u00fcst\u00fc, tablet, mobil) uyum sa\u011flarlar. Veri \u00e7ekerken, sitenin mobil g\u00f6r\u00fcn\u00fcm\u00fcnden veri \u00e7ekmek isteyebilirsiniz. Selenium, taray\u0131c\u0131 penceresinin boyutunu ayarlayarak veya User-Agent'\u0131 mobil bir cihaz\u0131nkiyle de\u011fi\u015ftirerek bu durumu sim\u00fcle etmenize olanak tan\u0131r.<\/p>\n<p>Taray\u0131c\u0131 penceresini yeniden boyutland\u0131rma:<\/p>\n<p>  <codetag><\/p>\n<pre><code class=\"language-python\">driver.set_window_size(375, 812) # iPhone X boyutlar\u0131 (geni\u015flik, y\u00fckseklik)\n# Veya daha geli\u015fmi\u015f mobil em\u00fclasyon i\u00e7in:\n# chrome_options.add_experimental_option(\"mobileEmulation\", { \"deviceName\": \"iPhone X\" })\n<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Mobil uyumlu HTML'den bahsederken, web geli\u015ftiricileri genellikle CSS'in <b>media query<\/b> \u00f6zelli\u011fini kullan\u0131r. Bu, farkl\u0131 ekran boyutlar\u0131na g\u00f6re stil kurallar\u0131 tan\u0131mlamay\u0131 sa\u011flar. Veri \u00e7ekerken bu bilgiyi anlamak, sitenin mobil versiyonunda hangi elementlerin g\u00f6r\u00fcn\u00fcp g\u00f6r\u00fcnmedi\u011fini tahmin etmenize yard\u0131mc\u0131 olabilir. \u0130\u015fte basit bir media query \u00f6rne\u011fi:<\/p>\n<p>  <codetag><\/p>\n<pre><code class=\"language-css\">\/* Varsay\u0131lan stil (masa\u00fcst\u00fc) *\/\n.content {\n  width: 960px;\n  margin: 0 auto;\n}\n\n\/* Ekran geni\u015fli\u011fi 768px veya daha az oldu\u011funda uygulanacak stil (tablet\/mobil) *\/\n@media screen and (max-width: 768px) {\n  .content {\n    width: 100%;\n    padding: 10px;\n  }\n  .sidebar {\n    display: none; \/* Mobil g\u00f6r\u00fcn\u00fcmde yan men\u00fcy\u00fc gizle *\/\n  }\n}\n<\/pre>\n<p><\/code><\/codetag><\/p>\n<p>Bu CSS kodu, ekran geni\u015fli\u011fi 768 pikselin alt\u0131na d\u00fc\u015ft\u00fc\u011f\u00fcnde <code>.content<\/code> s\u0131n\u0131f\u0131na sahip elementin geni\u015fli\u011fini %100 yaparken, <code>.sidebar<\/code> s\u0131n\u0131f\u0131na sahip elementleri gizler. Selenium ile veri \u00e7ekerken, pencere boyutunu mobil bir cihaz\u0131nki gibi ayarlad\u0131\u011f\u0131n\u0131zda, bu t\u00fcr CSS kurallar\u0131 devreye girecek ve sayfadaki elementlerin g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fcn\u00fc veya konumunu de\u011fi\u015ftirecektir. Dolay\u0131s\u0131yla, mobil versiyondan veri \u00e7ekmek istiyorsan\u0131z, element selector'lar\u0131n\u0131z\u0131 buna g\u00f6re test etmeniz gerekebilir.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makale boyunca, Python ve Selenium k\u00fct\u00fcphanesini kullanarak dinamik web sitelerinden nas\u0131l veri \u00e7ekilece\u011fini ad\u0131m ad\u0131m \u00f6\u011frendik. Temel kurulumdan ba\u015flayarak, web elementlerini bulma ve onlarla etkile\u015fime ge\u00e7me, bekleme stratejileri ile dinamik i\u00e7eri\u011fi y\u00f6netme konular\u0131n\u0131 ele ald\u0131k. Ayr\u0131ca, ger\u00e7ek bir e-ticaret sitesi senaryosu \u00fczerinden \u00f6\u011frendiklerimizi peki\u015ftirdik. Son olarak, headless taray\u0131c\u0131lar, proxy ve User-Agent y\u00f6netimi, hata y\u00f6netimi ve mobil uyumluluk gibi ileri d\u00fczey tekniklerle betiklerimizi daha verimli ve g\u00fcvenilir hale getirme yollar\u0131n\u0131 ke\u015ffettik.<\/p>\n<p>Selenium, modern web'in karma\u015f\u0131k yap\u0131s\u0131n\u0131 a\u015farak, JavaScript ile y\u00fcklenen i\u00e7eriklere ve kullan\u0131c\u0131 etkile\u015fimlerine kolayca eri\u015fmenizi sa\u011flayan g\u00fc\u00e7l\u00fc bir ara\u00e7t\u0131r. Unutmay\u0131n ki, web kaz\u0131ma projelerinizde her zaman hedef sitenin <code>robots.txt<\/code> dosyas\u0131n\u0131 ve kullan\u0131m ko\u015fullar\u0131n\u0131 kontrol etmeli, etik s\u0131n\u0131rlar i\u00e7inde kalmal\u0131s\u0131n\u0131z. Do\u011fru ara\u00e7lar ve tekniklerle, web'in sundu\u011fu s\u0131n\u0131rs\u0131z veri potansiyelini ke\u015ffedebilir ve projelerinize de\u011fer katabilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<h4>Selenium ile web kaz\u0131ma yasal m\u0131 ve etik mi?<\/h4>\n<p>Web kaz\u0131man\u0131n yasall\u0131\u011f\u0131 ve eti\u011fi, \u00e7ekilen verinin t\u00fcr\u00fcne, sitenin kullan\u0131m ko\u015fullar\u0131na ve bulundu\u011funuz \u00fclkedeki yasalara g\u00f6re de\u011fi\u015fir. Genel olarak, herkese a\u00e7\u0131k verileri \u00e7ekmek yasal olabilirken, ki\u015fisel verileri veya telif hakk\u0131 korunan i\u00e7erikleri \u00e7ekmek yasa d\u0131\u015f\u0131 olabilir. Her zaman sitenin <code>robots.txt<\/code> dosyas\u0131n\u0131 kontrol edin ve kullan\u0131m ko\u015fullar\u0131n\u0131 okuyun. Ayr\u0131ca, sunucuya a\u015f\u0131r\u0131 y\u00fck bindirmemeye \u00f6zen g\u00f6sterin ve kibar bir bot gibi davran\u0131n.<\/p>\n<h4>Selenium, Requests + BeautifulSoup ikilisine g\u00f6re ne zaman tercih edilmelidir?<\/h4>\n<p>Selenium, web sitelerindeki i\u00e7erik JavaScript ile dinamik olarak y\u00fcklendi\u011finde veya kullan\u0131c\u0131 etkile\u015fimi (t\u0131klama, form doldurma, kayd\u0131rma vb.) gerektiren durumlar i\u00e7in tercih edilmelidir. Requests + BeautifulSoup ise statik HTML i\u00e7eri\u011fine sahip sitelerden veri \u00e7ekmek i\u00e7in \u00e7ok daha h\u0131zl\u0131 ve kaynak a\u00e7\u0131s\u0131ndan verimli bir \u00e7\u00f6z\u00fcmd\u00fcr. \u00d6zetle, dinamik i\u00e7erik veya etkile\u015fim = Selenium; statik i\u00e7erik = Requests + BeautifulSoup.<\/p>\n<h4>Web kaz\u0131ma s\u0131ras\u0131nda s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan \"Element Not Found\" hatas\u0131 nas\u0131l \u00e7\u00f6z\u00fcl\u00fcr?<\/h4>\n<p>Bu hata genellikle elementin hen\u00fcz y\u00fcklenmemi\u015f olmas\u0131ndan kaynaklan\u0131r. \u00c7\u00f6z\u00fcm olarak, Selenium'un bekleme stratejilerini (Implicit Waits veya Explicit Waits) kullanmal\u0131s\u0131n\u0131z. \u00d6zellikle <code>WebDriverWait<\/code> ve <code>expected_conditions<\/code> mod\u00fcl\u00fc ile belirli bir ko\u015fulun ger\u00e7ekle\u015fmesini beklemek, bu t\u00fcr hatalar\u0131 b\u00fcy\u00fck \u00f6l\u00e7\u00fcde \u00f6nleyecektir.<\/p>\n<h4>Veri \u00e7ekerken IP adresimin engellenmesini nas\u0131l \u00f6nleyebilirim?<\/h4>\n<p>IP adresinizin engellenmesini \u00f6nlemek i\u00e7in \u00e7e\u015fitli y\u00f6ntemler vard\u0131r:<\/p>\n<ul>\n<li><b>Proxy kullan\u0131n:<\/b> \u0130steklerinizi farkl\u0131 IP adresleri \u00fczerinden g\u00f6ndererek tespit edilme riskini azalt\u0131n.<\/li>\n<li><b>User-Agent de\u011fi\u015ftirin:<\/b> Taray\u0131c\u0131n\u0131z\u0131n kimlik bilgisini s\u0131k s\u0131k de\u011fi\u015ftirerek daha do\u011fal bir profil olu\u015fturun.<\/li>\n<li><b>Rastgele gecikmeler ekleyin:<\/b> <code>time.sleep()<\/code> ile istekler aras\u0131na rastgele s\u00fcreler ekleyerek bot davran\u0131\u015f\u0131n\u0131 gizleyin.<\/li>\n<li><b>Headless modu kullan\u0131n:<\/b> Daha az kaynak t\u00fcketerek ve daha h\u0131zl\u0131 \u00e7al\u0131\u015farak sunucu y\u00fck\u00fcn\u00fc azalt\u0131n.<\/li>\n<li><b>\u0130stek h\u0131z\u0131n\u0131z\u0131 s\u0131n\u0131rlay\u0131n:<\/b> Birim zamandaki istek say\u0131s\u0131n\u0131 d\u00fc\u015f\u00fcr\u00fcn.<\/li>\n<\/ul>\n<h4>\u00c7ekti\u011fim verileri hangi formatta kaydetmeliyim?<\/h4>\n<p>\u00c7ekti\u011finiz verileri genellikle CSV, JSON veya veritaban\u0131 formatlar\u0131nda kaydedebilirsiniz.<\/p>\n<ul>\n<li><b>CSV:<\/b> Basit, yap\u0131land\u0131r\u0131lm\u0131\u015f veriler i\u00e7in idealdir, Excel gibi programlarla kolayca a\u00e7\u0131l\u0131r.<\/li>\n<li><b>JSON:<\/b> Daha karma\u015f\u0131k, i\u00e7 i\u00e7e ge\u00e7mi\u015f veri yap\u0131lar\u0131 i\u00e7in uygundur, web uygulamalar\u0131yla entegrasyonu kolayd\u0131r.<\/li>\n<li><b>Veritaban\u0131 (SQL\/NoSQL):<\/b> B\u00fcy\u00fck veri setleri ve s\u00fcrekli veri ak\u0131\u015f\u0131 i\u00e7in en iyi \u00e7\u00f6z\u00fcmd\u00fcr, verilerin sorgulanmas\u0131 ve y\u00f6netimi kolayla\u015f\u0131r.<\/li>\n<\/ul>\n<p>  Se\u00e7iminiz, projenizin gereksinimlerine ve veriyi nas\u0131l kullanaca\u011f\u0131n\u0131za ba\u011fl\u0131 olacakt\u0131r.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1403],"tags":[],"class_list":{"0":"post-33013","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-python","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131<\/title>\n<meta name=\"description\" content=\"Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden verileri nas\u0131l verimli ve g\u00fcvenilir bir \u015fekilde toplayabiliriz? Bu makale, Python ve Selenium k\u00fct\u00fcphanesini kullanarak web otomasyonu ve veri kaz\u0131ma tekniklerini ad\u0131m ad\u0131m \u00f6\u011frenmenizi sa\u011flayacak, b\u00f6ylece siz de web&#039;in sonsuz veri havuzundan faydalanabileceksiniz.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131\" \/>\n<meta property=\"og:description\" content=\"Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden verileri nas\u0131l verimli ve g\u00fcvenilir bir \u015fekilde toplayabiliriz? Bu makale, Python ve Selenium k\u00fct\u00fcphanesini kullanarak web otomasyonu ve veri kaz\u0131ma tekniklerini ad\u0131m ad\u0131m \u00f6\u011frenmenizi sa\u011flayacak, b\u00f6ylece siz de web&#039;in sonsuz veri havuzundan faydalanabileceksiniz.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-28T09:31:21+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"23 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131\",\"datePublished\":\"2025-10-28T09:31:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/\"},\"wordCount\":3365,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Python\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/\",\"name\":\"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-28T09:31:21+00:00\",\"description\":\"Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden verileri nas\u0131l verimli ve g\u00fcvenilir bir \u015fekilde toplayabiliriz? Bu makale, Python ve Selenium k\u00fct\u00fcphanesini kullanarak web otomasyonu ve veri kaz\u0131ma tekniklerini ad\u0131m ad\u0131m \u00f6\u011frenmenizi sa\u011flayacak, b\u00f6ylece siz de web'in sonsuz veri havuzundan faydalanabileceksiniz.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131","description":"Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden verileri nas\u0131l verimli ve g\u00fcvenilir bir \u015fekilde toplayabiliriz? Bu makale, Python ve Selenium k\u00fct\u00fcphanesini kullanarak web otomasyonu ve veri kaz\u0131ma tekniklerini ad\u0131m ad\u0131m \u00f6\u011frenmenizi sa\u011flayacak, b\u00f6ylece siz de web'in sonsuz veri havuzundan faydalanabileceksiniz.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/","og_locale":"tr_TR","og_type":"article","og_title":"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131","og_description":"Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden verileri nas\u0131l verimli ve g\u00fcvenilir bir \u015fekilde toplayabiliriz? Bu makale, Python ve Selenium k\u00fct\u00fcphanesini kullanarak web otomasyonu ve veri kaz\u0131ma tekniklerini ad\u0131m ad\u0131m \u00f6\u011frenmenizi sa\u011flayacak, b\u00f6ylece siz de web'in sonsuz veri havuzundan faydalanabileceksiniz.","og_url":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-28T09:31:21+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"23 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131","datePublished":"2025-10-28T09:31:21+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/"},"wordCount":3365,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Python"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/","url":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/","name":"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-28T09:31:21+00:00","description":"Modern web siteleri karma\u015f\u0131k yap\u0131lar sunarken, statik veri \u00e7ekme y\u00f6ntemleri yetersiz kalabiliyor. Peki, dinamik i\u00e7eriklerle dolu bu sitelerden verileri nas\u0131l verimli ve g\u00fcvenilir bir \u015fekilde toplayabiliriz? Bu makale, Python ve Selenium k\u00fct\u00fcphanesini kullanarak web otomasyonu ve veri kaz\u0131ma tekniklerini ad\u0131m ad\u0131m \u00f6\u011frenmenizi sa\u011flayacak, b\u00f6ylece siz de web'in sonsuz veri havuzundan faydalanabileceksiniz.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/selenium-ve-python-ile-dinamik-web-sitelerinden-veri-cekme-sanati\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Selenium ve Python ile Dinamik Web Sitelerinden Veri \u00c7ekme Sanat\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33013","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=33013"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33013\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33013"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33013"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33013"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}