Selenium ile Web Sitesinden Veri Çekme (C#)

Merhaba, bu yazımızda tarayıcının web sitesine giderek tablodan istediğimiz verileri döngü ile çekmesini sağlayacağız bu sayede tek tık ile veri güncelleme ya da aklınıza başka ne geliyorsa yapabilirsiniz. Ben örnek olarak borsa verilerini çekmek istedim.

Ayrıca sayfa açılırken programın kitlenmemesi ve sayfanın tamamen yüklenmesini beklerken işlem yapılmamasının önüne geçmek için Thread özelliğini kullandım.

using System.Threading;
Kütüphanesini projemize çağırdıktan sonra;

Aşağıdaki kodu ekliyoruz. Bu sayede birden fazla Thread kullanımına olan sağlıyor.

public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
}

Tasarım olarak böyle bir görüntü tercih ettim. Listbox1’e adı, listbox2’ye alış fiyatı ve listbox3’e satış fiyatını çekeceğim.

http://bigpara.hurriyet.com.tr/borsa/canli-borsa/ adresinden verileri çekmeye karar verdim. Bu sebeple öncelikle adrese giderek neyi hangi yol ile çekeceğime karar veriyorum.

ChroPath uygulaması ile çekmek istediğim verilerinin XPath yolunu kopyalıyorum. Tablo oldukları içinde genelde tek değişiklikle bir alt satıra geçilebiliyor. Bu örnekte ilk satır için;
İsmin xPath’ı:
/html[1]/body[1]/div[7]/div[4]/div[1]/div[1]/div[1]/div[3]/div[5]/div[1]/div[1]/div[2]/ul[1]/li[1]/a[2]
Alış Fiyatının xPath’ı: /html[1]/body[1]/div[7]/div[4]/div[1]/div[1]/div[1]/div[3]/div[5]/div[1]/div[1]/div[2]/ul[1]/li[3]
Satış Fiyatının xPath’ı ise: /html[1]/body[1]/div[7]/div[4]/div[1]/div[1]/div[1]/div[3]/div[5]/div[1]/div[1]/div[2]/ul[1]/li[4] olarak gözükmektedir.

Bir alt satıra baktığımda ise sadece ul‘nin 1 yerine 2 olduğu gözükmektedir. Bu sebeple hepsini for döngüsüne alarak ul’yi otomatik arttırabilir ve tek seferde çekebilirim.

Thread Cek; 


İsminde bir thread nesnesi oluşturuyorum. Bu thread nesnesini başlatmak için içinde çağıracağım bir metod oluşturmalıyım. Bu sebeple ihtiyacım olan kodları bu metodun içine yazıyorum.

  private void veriCek()
        {
            ChromeDriverService servis = ChromeDriverService.CreateDefaultService();//chrome servisinin varsayılan ayarları ile servis nesnesini canlandırdık
            servis.HideCommandPromptWindow = true; //konsolu göster/gizle varsayılan ayarını true yaptık
            IWebDriver tarayici = new ChromeDriver(servis); //tarayıcı isminde chrome tarayıcısı oluşturduk ve tarayıcıya yapılan ayarları atadık.
            //Buraya kadar olan işlemler proje çalıştığında otomatik olarak çıkan ChromeDriver konsol ekranını gizlemeye yarıyor.

            tarayici.Navigate().GoToUrl("http://bigpara.hurriyet.com.tr/borsa/canli-borsa/"); //olusturulan tarayıcı tırnak içerisindeki adrese yönlendirdik
            Thread.Sleep(3000); //metodu 3 saniyeliğine beklemeye aldık bu sayede sayfa tamamen yüklenecek
            int satirSayisi = tarayici.FindElements(By.XPath("//div[@id='sortable']/ul")).Count(); //tablodaki satır sayısını bulduk

            for (int i = 1; i < satirSayisi; i++)
            {
                IWebElement adi = tarayici.FindElement(By.XPath("/html[1]/body[1]/div[7]/div[4]/div[1]/div[1]/div[1]/div[3]/div[5]/div[1]/div[1]/div[2]/ul[" + i + "]/li[1]/a[2]")); //İsmi buldu ve adi nesnesine atadı
                listBox1.Items.Add(adi.Text);
                IWebElement alis = tarayici.FindElement(By.XPath("/html[1]/body[1]/div[7]/div[4]/div[1]/div[1]/div[1]/div[3]/div[5]/div[1]/div[1]/div[2]/ul[" + i + "]/li[3]")); //Alış fiyatını buldu ve alis nesnesine atadı
                listBox2.Items.Add(alis.Text);
                IWebElement satis = tarayici.FindElement(By.XPath("/html[1]/body[1]/div[7]/div[4]/div[1]/div[1]/div[1]/div[3]/div[5]/div[1]/div[1]/div[2]/ul[" + i + "]/li[4]")); //Satış Fiyatını buldu ve satis nesnesine atadı
                listBox3.Items.Add(satis.Text);
            }
        }

Gördüğünüz gibi VeriCek isminde bir metod oluşturduk ve bu metodu ihtiyacımız olan kodlar ile doldurduk. Kodların yanlarında açıklamaları mevcuttur.

Daha sonradan bu metodun Değerleri Çek butonunun click eventine aşağıdaki kodları yazıyoruz.

private void button2_Click(object sender, EventArgs e)
        {
            Cek = new Thread(veriCek);
            Cek.Start();
        }

Artık uygulamamız hazır çalıştıralım bakalım.

Görüldüğü gibi projemiz isteğimiz verileri internet sitesinden çekti. Bu uygulama örnek alınarak istediğiniz verileri istediğiniz siteden çektirerek işlemlerinizi hızlandırabilirsiniz.

İyi çalışmalar.

Yorum bırakın