Dart Programlama Dili ve Web Scraper

Flutter’a başlayan yolculuğumda elbette Dart programlama dili de öğrenmem gerekiyordu ve her yeni teknolojiye giriş yapan geliştirici/mühendis gibi Dart programlama diline mobil uygulamada ihtiyacım olacak kadar aşina oldum. Fakat gerçek hayat uygulamalarında daha fazlası gerekiyordu.

Örneğin uygulamanız için bir servis yazacaksınız. Dart, henüz bu konuda hazır olmasa da şimdiden Aqueduct gibi çözümleri bilmekte fayda var. Web desteği geldiğinde Dart, Flutter ile birlikte ciddi seviyede kullanıcı edinecektir. O gün gelene kadar kendimizi Dart programlama diline biraz daha aşina hale getirmek kimseye zarar vermez!

Son günlerde artan Covid19 vakalarından ötürü kendimce bir izleyici uygulama yapmaya karar verdim. Bu izleyici uygulama, kullanıcı talep ettiğinde dünya ile ilgili verileri almalı ve uygun grafiklerle yansıtmalıydı. Bunun en ideal çözüm yöntemi bir Rest Api yazarak, uygulamanızı bu api ile iletişim kurmasını sağlamanızdır lakin Dart ile yaşadığım bazı problemlerden ötürü bunu başaramadım. Ben de veriyi alma işlemini client tarafında, Flutter tarafında yazmaya karar verdim.

Bir web scraper yazıp, web sitesinden verileri çekip daha sonra uygun bir şekilde bunu göstermem gerekiyordu. Tabi tüm kodu buraya şimdilik eklemeyeceğim fakat her satırda ne yaptığımı anlatmaya çalışacağım. Bu iş için iki tane pakete ihtiyacımız var: http paketi ve html paketi. Bu iki paketi pubspec.yaml’a ekledikten sonra ‘pub get’ yazarak projemizi güncelleyelim.

Öncelikle veri çekeceğimiz web adresini belirlememiz gerekiyor.

final http.Response response = await http.get('https://www.worldometers.info/coronavirus/');

Covid19 verileri için bu web sitesiyle uğraşacağız.

var document = parse(response.body);
List<Element> information =
document.getElementsByClassName('total_row_world');

Dönen yanıtın içeriğini bir değişken içerisine kaydediyoruz ve daha sonra bu döküman içerisinde bir class adı, id adı, tag adı ile arama yapabiliyoruz. Bu kısım önemli çünkü sayfada hangi elementi arayacağınızı bilmek, istediğiniz veriye ulaşmanızı sağlayacak. Yukarıda linkte verdiğim web sitesine gidip, sayfa kaynağını görüntülediğinizde ‘total_row_world’ ismindeki sınıfın dünyadaki Covid19 verilerini tuttuğunu ve bölge bölge Covid19 vakalarını tuttuğunu göreceksiniz.

      var worldData;
      for (var info in information) {
        if(info.text.contains('World')){
          worldData = info;
          print(info.text);
        }
      }

Son olarak ise bölge bölge verilen bu verilere ‘info.text’ yazarak ulaşabilirsiniz. Bu text, HTML içerisindeki sınıfların text’idir. Örneğin;

<span id='spanID'>Burada bir text yer alıyor</span>

Bu HTML elementinde spanID’nin text’ini yazdırmak istediğinizde ‘Burada bir text yer alıyor’ yazacak. Bu durum size rahatlıkla bir sınıfın, bir id’nin, bir tag’ın verisini çekmenize olanak sağlayacaktır. Veriyi çektikten sonra bazı düzensiz kısımları silmek, düzenlemek için split, substring, replaceAll gibi fonksiyonlardan yararlanmayı unutmayın. 🙂

World
2,162,341
+90,274
145,471
+6,996
547,069
1,469,801
56,602
277
18.7


All

Yazdığımız kod yukarıdaki veriyi ekrana basıyor. Satırların tanımlarının ne olduğu hiç değişmeyeceği için bu verileri indislerine göre statik değerlere atama yapma konusunda bir beis görmüyorum. 🙂

Basit bir web scraper bu şekilde yazılıyor. Bu paketleri ve uygulamayı, veriyi çektiğiniz siteye göre daha karmaşıklaştırarak çok kullanışlı bir API oluşturabilir, dinamik veri gerektiren uygulamalarınıza servis olarak kullanabilirsiniz.

Daha ayrıntılı ve basit bir örneği Github hesabıma ekleyeceğim vaktim olduğunda. O zamana dek blogumu takipte kalın! 🙂