Puppeteer, Google tarafından geliştirilen ve herhangi bir kullanıcı ara yüzüne gerek olmadan (headless browser) Chrome tarayıcısını yönetebileceğimiz bir node.js kütüphanesi olarak ortaya çıkmıştır.
.Net platformunda kullanabilmek amacıyla Darío Kondratiuk tarafından geliştirilen bir Nuget paketi olarak PuppeteerSharp ortaya çıkmıştır.
Temel olarak PuppeteerSharp ile yapabilecekleriniz;
- Html olan bir sayfayı Pdf veya ekran görüntüsü olarak kaydedebilirsiniz.
- Cookie oluşturabilirsiniz ve sayfaya atayabilirsiniz.
- Bir sayfanın Html içeriğini çekebilir ya da Html içeriğine değer atayabilirsiniz.
- Bir sayfada bulunan frame linklerini alabilirsiniz.
- Javascript kodları yazarak HTML selectorlar üzerinde çalışabilirsiniz.
Kullanılan metotlar Puppeteer'a benzemektedir. Asenkron metotlar olduğu için PuppeteerSharp versiyonunda metotların sonu Async ile bitmektedir.
Kurulum aşamasında bir .NET projesine sağ tıkladıktan sonra Manage Nuget Packages'e tıklayarak Nuget Package Manager'e ulaşabiliriz. Aşağıdaki görselde bulunan PuppeteerSharp kütüphanesini kullanacağımız projeye dahil ediyoruz.
Bu paketin güncel versiyonu, 5.0.0 olmakla birlikte (.NET 5 sürümü için bu versiyon kullanıldı.) .NET Framework versiyonu ise en az 4.6.1 olmalıdır. Kullanacağınız .NET framework versiyonuna göre Dependencies kısmını kontrol edebilirsiniz.
Paketi dahil ettikten sonra kullanmaya başlayabiliriz.
İlk kod bloğunda Puppetter'ın kullanılması için bir chromium.exe dosyasının yüklenmesi gerekmektedir. (DownloadAsync metodu ile) İlk çalışmada uzun sürebilir, sonraki çalışmasında kısa sürede çalışacaktır. Path property'si ile exe dosyasının yükleneceği fiziksel yolu belirtebiliriz.
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. OpenChromiumPage metodu her yerde kullanabilmek adına benim tarafından özel olarak oluşturulmuştur.
Eğer açık olan bir sayfamız varsa kapatma işleminin de yapılması gerekir. Yine benim geliştirmiş olduğum CloseChromium metodu Page tipinde bir değer alıp eğer sayfa açıksa tarayıcıyı kapatacaktır. - CloseAsync metodu - Böyle arka planda açık tarayıcı kalmayacaktır. PuppeteerSharp metotları ile işimiz bittikten sonra bu metodu istediğimiz yere yerleştirebiliriz.
Örneğimizde, Facebook sayfasına kullanıcı adı ve şifremizle giriş yaptıktan sonra girilen sayfanın pdf'i alınır. Ayrıca oluşan cookie, sayfa başlığı ve sayfanın HTML içeriği görüntülenebilir.
İlk önce response nesnesi (PuppeteerResult) oluşturdum. Bu nesne mesaj (Message) ve işlemin başarılı (Success) olup olmadığını belirten iki adet property'e sahiptir.
Sonra bu nesneyi döndüren LoginFacebook metodu oluşturduk. Akışımız aşağıdaki gibi listelenebilir.
1-) OpenChromiumPage metodumuzla 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.
2-) WaitUntilNavigation tipinde değişken oluşturulur. Bu değişken script ve csslerin düzgün yüklenebilmesi için gereklidir.
3-) Facebook sayfasına yönlendirilir.(GoToAsync metodu)
4-) TypeAsync ve ClickAsync metotlarıyla input alanları doldurulur ve butona tıklama metodu çalıştırılır. TypeAsync metodunun parametreleri sırasıyla input alanının css selectorü ile girilecek değerdir. ClickAsync metodu tıklanacak butonun css selectörünü alır. Tanımlanan selectorler Facebook'a ait güncel selectörlerdir. WaitForNavigationAsync metodu ise sayfa yüklenene kadar bekleyecektir.
5-) GetContentAsync metodu mevcut sayfanın html kodunu görüntüler ve string tipindedir.
6-) GetCookiesAsync metodu ise sayfanın cookie bilgilerini getirir.
7-) GetTitleAsync metodu ise sayfanın başlığını döndürür ve string tipindedir.
8-) Dosya bilgileri oluşturulup ve klasör kontrolü yapıldıktan sonra PdfAsync metodu ile belirtilen dosya yoluna sayfanın pdf olarak kaydedilmesi sağlanır.
9-) İşlem bittikten sonra CloseChromium metodu ile Chromium tarayıcısı kapatılır.
Pdf oluşturma işlemi sonucunu aşağıdaki görselde görebilirsiniz. Belirttiğimiz klasörde pdf oluşmuştur.
Oluşturulan pdften bir görüntü - kendi facebook hesabıma giriş yaptığım için kişisel bilgileri paylaşmadım. :) Bazı stil ve script dosyaları güvenlik gerekçesiyle Facebooktan izin vermiyor olmalı. Amacımız, Facebook'ta login işlemi yapıp giriş başarılı ise pdf görüntüsü almaktır.
Github hesabımda bu örneğin ve PuppeteerSharp ile yaptığım diğer örnekleri bulabilirsiniz.
https://github.com/hardkoded/puppeteer-sharp
https://www.puppeteersharp.com/examples/index.html
Herkese iyi kodlamalar :)
Projeye ait Github Linkleri
- NET 5 ile geliştirlen repository: PuppeteerSharpTutorialDotNetCore
- NET Framework ile geliştirlen repository: PuppeteerSharpTutorial
https://github.com/hardkoded/puppeteer-sharp
https://www.puppeteersharp.com/examples/index.html
Herkese iyi kodlamalar :)
Yorumlar
Yorum Gönder