.NET 5 ve PuppeteerSharp ile Google'da Video Araması Yapmak

PuppeteerSharp kütüphanesi, bir node.js kütüphanesi olan Puppeteer'ın .NET platformunda kullanılması için oluşturulmuş bir kütüphanedir. 

Aşağıdaki yazımda PuppeteerSharp kütüphanesini ilgili detaylı olarak anlattığım yazıyı bulabilirsiniz.

PuppeteerSharp Kütüphanesi Nedir? Ne Amaçla Kullanılır?

Bu yazımda ise PuppeteerSharp kütüphanesini kullanarak .Net 5 alt yapısı ile Google araması yapacağız.  

Projemizde aşağıdaki gibi 3 adet proje yer alacaktır. 

  • PuppeteerSharp.ConsoleApp: Konsol uygulamamızdır. Bütün metotları buradan çalıştıracağız.
  • PuppeteerSharp.Methods: PuppeteerSharp metotlarını kullanarak kendi metotlarımızın bulunduğu projemizdir.
  • PuppeteerSharp.Models: Metotlarımızdan gelen başarılı / başarısız sonuç nesnelerini döndürdüğümüz projemizdir. 


Örnek senaryomuzda Google üzerinden aranacak bir kelimeye ait - bu örneğimize özel "Beşiktaş" kelimesi - video sonuçlarını url listesi olarak listeleyeceğimiz bir yapı kuracağız. Akışımız aşağıdaki gibi listelenebilir.

1.) PuppeteerSharp ile Google sitesine bağlanmak.
2.) Google sitesindeyken Arama textbox ve Ara butonuna ait HTML name özelliğini kullanarak arama yapmak ve javascript kodu ile arama gerçekleştirmek
3.) Arama sonuçları yüklendikten sonra Videolar sekmesine ait HTML name özelliğini kullanarak arama sonuçlarını getirmek
4.) Videolar listelendikten sonra videoların bulunduğu divdeki a tagındaki href değerini PuppeteerSharp metodu ile almak.

Yukarıda belirtilen isterleri sağlamak için PuppeteerSharp.Methods projesindeki PuppeteerMethods sınıfında aşağıdaki metotları tanımladık.
  • OpenChromium metodu ile Page türünden bir sayfa tanımlanır. Bu metot, using bloklarında olmalıdır. Page nesnesi, IDisposable olduğu için işi bittiğinde kaynakları serbest bırakacaktır. 
Bu metotta ilk önce, Chromium tarayıcısını headless yani arka planda gizli olarak çalışmasını sağladık. İlk yüklemede uzun sürmesinin sebebi Chromium tarayıcısının zip olarak indirilip açılma aşamasının bulunmasıdır. Diğer çalıştırmalarda bu işleme gerek kalmayacaktır. 

Metotta, BrowserFetcher nesnesi tanımlama işleminde BrowserFetcherOptions nesnesi parametre olarak verilir. Bu nesne tarayıcı açılış aşamasında bizden Chromium tarayıcısının indirilip çalıştırılacağı bir yol bekler.

BrowserFetcher farklı Chromium versiyonlarını indirir ve yönetir. Bu nesneye ait DownloadAsync metodu ile varsayılan revizyon numarasındaki Chromium tarayıcısını indirir. 

Puppeteer.LaunchAsync() metodu ile Chromium tarayıcısının çalıştırılması sağlanır. Dönüş tipi Browser sınıfıdır.

ExecutablePath nesnesi Chromium tarayıcısının exe dosyasının yolunu, Headless= true özellikli property ise bu tarayıcının arka planda görünmez olarak çalıştırılmasını sağlar. Tarayıcının görünmesini istersek bu özellik false olarak ayarlanmalıdır. 

Browser sınıfının metotlarından NewPageAsync() ise yeni bir sayfa açılmasını sağlar. Dönüş tipi Page sınıfıdır. 
  • GetVideoSearchVideoResultUrlList: Aranacak kelime ile Google araması ve video linklerini alma işleminin gerçekleştiği metottur.

  • SearchOnGoogle: Google sitesindeki arama textbox ile arama yap butonuna ait HTML name özelliğini kullanarak arama yapma işlemini yapacaktır.

Bu metotta aşağıdaki PuppeteerSharp metotları kullanıldı.

WaitForSelectorAsync: HTML elementine ait selector, DOM'a eklenene kadar yani kullanılabilecek duruma gelene kadar sayfanın yüklenmesini bekler. Eğer metodu kullanmazsak, element gerçekten sitede var olsa bile, Chromium'da gelmemiş olabileceği için elementin olmadığı şeklinde dönüş gelebilir.  

TypeAsync: Sanki klavyede tuşa basıyormuş gibi bu metot ile aranacak kelimeyi ilgili HTML elementi için metin girişi yapılabilir.

EvaluateExpressionAsync: PuppeteerSharp kullanarak javascript kodu yazıp çalıştırabilmemizi sağlar. Click eventini kullanarak, Arama butonuna tıklama işlemini yapacaktır.

WaitForNavigationAsync: Sayfa yeni bir URL'ye gittiğinde veya yeniden yüklendiğinde kullanılır. Dolaylı olarak sayfanın gezinmesine neden olacak bir kod çalıştırıldığında kullanışlıdır. Amacımız aramanın sonuçlanmasını beklemektir.

Bu kodlardan sonra arama sonuçları gelmiş olacaktır. Arama sonuçları sayfasından sonra video sekmesine tıklama işlemini PuppeteerSharp metotları ile yapacağız.


Yukarıdaki görselde yazılan javascript kodu, video sekmesine ait linki alır. hdtb-mitem adındaki sınıfın a elementindeki href özelliğini alır. Aşağıdaki görselde F12 ye tıklayarak hedeflenen elementin id, class veya name bilgisini bulabiliriz. 

GoToAsync metodu istenen sayfaya yönlendirme yapılmasını sağlar, bu amaçla video sekmesinin linkine yönlendirme yapılır. Metodun başında WaitUntilNavigation tipinde değişken (wait) oluşturmuştuk. Bu değişken, script ve csslerin düzgün yüklenebilmesi için gereklidir.


EvaluateExpressionAsync metodu ile javascript kodu çalıştırıldıktan sonra GoToAsync metodu ile hedeflenen linke yönlendirme yapılır. GoToAsync metodu ilk parametre olarak, url alacaktır. Url parametresi kurallara uygun olarak http veya https ile başlamalıdır. 

  • VideoLinkList metodu, arama sonuçlarındaki video url listesini döndürecek bir liste döndürür. Video linklerini alabilmemiz için HTML elementleri okumaya yarayan javascript kodlarını almalıyız. Bunun için selector - seçicilerden faydalanırız.

Bu işlemi yaparken aynı zamanda diğer sayfalardaki linkleri de gezmemiz gerekecek. Son sayfaya gelene kadar pnnext idsine sahip element olup olmadığı metottaki döngüde kontrol edilir. Bu element Sonraki linkine ait id selector'dir.

EvaluateExpressionAsync metodu ile javascript kodlarını değerlendirmeye devam ediyoruz. Javascript syntax hatası yaptığımızda aşağıdaki gibi hata verecektir. Bu nedenle doğru bir şekilde yazmaya dikkat edilmelidir. 


İşlemler tamamlandıktan sonra SuccessPuppeteerDataResult sonuç nesnesi üzerinden listeyi dönüyoruz. 
  • CloseChromium metodu Page tipinde bir değer alıp eğer sayfa açıksa tarayıcıyı kapatacaktır. - CloseAsync metodu - Eğer açık olan bir sayfamız varsa kapatma işleminin de yapılması gerekir. Böyle arka planda açık tarayıcı kalmayacaktır. PuppeteerSharp metotları ile işimiz bittikten sonra bu metodu istediğimiz yere yerleştirebiliriz.

Console uygulamamızda geliştirdiğimiz metodu çağırarak test edebiliriz. Sonuca ait görüntü aşağıdaki gibidir.


                    

Uyarı: İster Google ister farklı bir sayfada HTML sayfasında seçicilerde değişiklik olursa hata verebilir ya da istenilen sonuç alınmayabilir. Muhtemel hatada, Normal bir tarayıcıda F12 ile kaynağı görüntüleyerek HTML elementinde bir değişiklik olup olmadığını tespit edebilirsiniz. 

Github hesabımda bu örneğin ve PuppeteerSharp ile yaptığım diğer örnekleri bulabilirsiniz. 

Projeye ait Github Linkleri

Ayrıca eğer Puppeteer ile çalışmak isterseniz bu kütüphaneye ait linklerden de yararlanabilirsiniz.

https://github.com/hardkoded/puppeteer-sharp
https://www.puppeteersharp.com/examples/index.html

Herkese iyi kodlamalar :)

Yorumlar