Selenium İle İnternetten Veri Çekme

Ömer Şenol
5 min readJul 1, 2022

Bu yazımda Python içerisindeki Selenium kütüphanesini kullanarak istenilen bir web siteden kolayca nasıl farklı yollarla veri çekebileceğimizi anlatacağım.

http://aitechcentral.com/blog/web-scraping-python-selenium/

Selenium kütüphanesi bir tarayıcıda yaptığımız neredeyse tüm işlemlerin yapılmasını sağlayan bir API’dir. Bu API sayesinde veri çekme, sayfada gezinme, inputlara girdi girme, html bloklarının özelliklerini almaya kadar bir çok işlemi yapabiliyoruz. Fakat selenium’un kullanılabilmesi için bir WebDriver’a ihtiyaç var. Bu WebDriver, bilgisayarınızda kurulu olan herhangi bir tarayıcıda yapılabilecek çoğu işlemin birebir otomatize edilebilmesini sağlar. Firefox, Google Chrome, Opera, Microsoft Edge gibi bir çok tarayıcıyı desteklemekte.

Veri çekme işlemi için Google Chrome’un WebDriver’ını kullanacağım. Bu WebDriver’ın indirme işlemi için aşağıdaki adımları takip edelim.

· Chrome için: https://chromedriver.storage.googleapis.com/index.html sitesinden sürümünüze uygun driver’ı indirmeniz gerekmektedir.

**(Sürüm öğrenmek için: Chrome > Yardım > Chrome Hakkında)

**(Ben bu yazıyı yazarken 103.0.5060.66 sürümünü kullanıyordum bu yüzden driver’ın 103.0.5060.53 sürümünü indirdim.)

Bu sürümün içindeki dosyalardan kendi sisteminizin özelliğine ait olanı indirebilirsiniz. Ben 64 bit Windows kullanıyorum fakat driver, 32 bit olarak yayınlanıyor bu yüzden win32 olanı indirebiliriz.

· Opera : https://github.com/operasoftware/operachromiumdriver/releases

· Firefox : https://github.com/mozilla/geckodriver/releases

· Microsoft Edge : https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

**Günlük hayatımda Opera kullanmama rağmen, Selenium için Google Chrome kullanmayı tavsiye ediyorum. Çünkü Opera’da bir kaç sitede hata yaşadım.

Giriş

Öncelikle kütüphanemizi indirmemiz gerekiyor. Bu indirme işlemini CMD ekranına “pip install selenium” yazarak gerçekleştirebiliriz.

Kütüphane indirme işlemi bittikten sonra projeyi oluşturmaya başlayabiliriz. Öncelikle ihtiyacımız olan kütüphaneleri eklemekle başlayalım

“warnings” kütüphanesi gereksiz uyarı yazılarının terminal ekranında çıkmasını engellediği için kullanıyoruz.

Bu projede örnek site olarak https://www.etstur.com/Antalya-Otelleri?check_in=13.07.2022&check_out=18.07.2022&adult_1=2 sitesindeki otel ilanlarının ismi, konumu, konaklama tipi, puanı, yorum sayısı, otel özellikleri ve fiyat bilgilerini alacağız.

WebDriver’ı python ile bu şekilde bağlayabiliriz.

· Burada “webdriver.Chrome()” fonksiyonu içerisine indirmiş olduğumuz Chrome driver’ının path’ini veriyoruz (Örneğin Opera kullanıyorsanız “webdriver.Opera()” fonksiyonunu kullanacaksınız).

· “set_window_size” fonksiyonu ile sabit bir boyutta açılmasını öneririm, çünkü boyut hareketli olursa HTML kodları ona göre değişiklik gösterebiliyor ve bu da bizim veri çekme kodlarımızın çalışmamasına sebep olabilir.

· “set_windows_position” driver’ın açılma yerini temsil ediyor (0,0) vererek en sol köşede açılmasını sağlıyoruz.

· “get()” fonksiyonuna açılacak sitenin adresini veriyoruz.

· İnput fonksiyonunu koyma sebebim ise web site açılır açılmaz veri çekmeye başlamaması için, çünkü sitenin yüklenmesi gerekebilir (yüklenmeden veri çekmeye çalışırsa hata alırız) bu yüzden Enter tuşuna basarak fonksiyona gönderip orada veri çekme işlemini başlatacağız. Buradan sonra fonksiyonun içeriğini yazmaya başlayacağız.

Veri Çekme Metotları

Selenium’un kullanımı, HTML bloklarının içinde dolaşarak işlem işlem yapması üzerinedir. Bu HTML bloklarında dolanmanın birkaç yöntemi vardır bu yöntemlerden hepsini teker teker anlatacağım.

Bir sayfadaki öğeleri bulmak için çeşitli stratejiler vardır. Durumunuza en uygun olanı kullanabilirsiniz. Selenium, bir sayfadaki öğeleri bulmak için aşağıdaki fonksiyonları sağlar:

· find_element() -> Bu fonksiyon sadece 1 HTML bloğunu bularak işlem yapar.

· find_elements() -> Bu fonksiyon ise arama kriterine göre tüm HTML bloklarını getirir ve bize liste döner.

Selenium’da 8 tane veri çekme yolu vardır. Bunlar;

1. ID

HTML bloklarının id etiketine göre veri çekilebilir. Bu sayfada ID ile bir veri çekme işlemi olmadığından arama kısmına ID ile erişip içerisine CTRL+A tuşunu yollayıp içerisindeki değeri seçip, DELETE yollayarak değeri silip, içerisine yeni bir örnek yazı yazmayı göstereceğim.

Sayfaya sağ tıklayıp öğeyi denetle dedikten sonra gerekli bloğu bularak ve id’sini alarak kodunu yazıyoruz. “send_keys()” fonksiyonu belirtilen elementin içerisine klavyeden değer girmeyi veya belirlenen tuşları göndermeyi sağlar.

2. XPATH

HTML kodlarında her bloğun kendine özgü bir XPATH’i bulunur. Selenium ile bu XPATH’e göre de element bulma işlemi gerçekleştirebiliyoruz. Bir elementin XPATH adresini almak için; üstüne sağ tıklayıp -> Copy -> Copy Xpath şeklinde yapıyoruz.

Burada otel isimlerini almak için ismin yazılı olduğu elementin XPATH’ini alıyoruz ve fonksiyona veriyoruz. Bu fonksiyon bize bir element dönüyor ve bu elementin içindeki yazıyı alabilmek için “text()” fonksiyonunu kullanıyoruz.

3. NAME

HTML bloklarında bulunabilen name etiketine verilmiş değere göre çekilir. Bu sayfada ID gibi NAME ile bir veri çekme işlemi olmadığından minimum ve maksimum fiyat kısımlarına örnek bir değer gönderelim. Daha sonra “Ara” butonunu XPATH ile bularak tıklama işlemi gerçekleştirelim.

Sayfaya sağ tıklayıp öğeyi denetle dedikten sonra gerekli bloğu bularak ve NAME etiketinin değerini alarak, kodunu yazıyoruz. “sleep” fonksiyonunu, girilen değerlerin gözükmesini sağlamak için ekledim.

4. LINK_TEXT

HTML bloklarında kullanılan <a> etiketi içinde yazılı olan değere göre veri çekme işlemi için kullanılır. “LINK_TEXT” vermiş olduğumuz değerin tamamını içeren etiketi bize dönerken, “PARTIAL_LINK_TEXT” vermiş olduğumuz değeri içeren etiketi döner.

Sayfada bulunan 2 adet <a> etiketini ele alalım. Bu 2 etikette “href” değerlerini almaya çalışacağız. Bu işlemi yapmak için <a> etiketini bulduruyoruz ve daha sonrasında “get_attribute” metodunu kullanarak o etiketin özelliklerin herhangi birini alabiliriz (Örneğin; style, href, id, class vb. değerleri). Ben burada bu etiketin içinde bulunan URL adreslerini aldım.

5. TAG_NAME

“TAG_NAME” metodu HTML etiketlerinden olan; a, div, p, h1, li vb. etiketlerden birini vererek o etiketlerin hepsini bulabilmeyi sağlar.

Ben burada <a> etiketine göre veri çekme işlemi yaptım. “find_elements()” metodunu kullanarak tüm etiketlerin gelmesini sağladım ve bu fonksiyon bize bir liste dönmüş oldu. “find_element()” metodunu kullansaydım sadece ilk gördüğü etiket değerini alır ve diğerleri gelmezdi. Daha sonra bu listeyi dönerek boş olmayan değerleri yazdırmaya çalıştığımda kısa bir örnek gözlemledim.

6. CLASS_NAME

Bu metot ile belirli bir class etiketine göre arama işlemi yapıyoruz. Burada sadece fiyat bilgilerinin kendilerine has class değeri olduğundan bu kod ile bize o sayfada bulunan tüm ilanların fiyat bilgilerini döndü.

7. CSS_SELECTOR

CSS_SELECTOR, CLASS_NAME metoduna çok benzer bir mantıkta çalışır. CSS_SELECTOR’da fark olarak belirli etiketin class değerine göre çekme işlemi yaptırılabilir. Fakat etiketin önemsiz olduğu durumlarda “.ornek” yazılarak tüm etiketlerdeki class değeri “ornek” olan etiketleri döndürür. Bu yüzden CLASS_NAME’e çok benzemektedir.

BONUS

“driver.find_element(By.XPATH,’//h2[contains(text(), “Gold Island”)]’)”

Burada bulunan “contains()” metotu ile içerisinde “Gold Island” yazan h2 etiketini bulmuş oluruz.

Bir web siteden, Python içerisinde bulunan Selenium kullanılarak veri çekme yöntemlerimi anlattığım bu yazımı okuduğunuz için teşekkür ediyorum. Diğer yazılarımı da incelemeyi unutmayın.

--

--