Power BI ile Web URL Kaynaklarını Kullanmak

Mirac Öztürk
8 min readApr 21, 2020

microsoft power bi connect web url

Merhaba, iyi günler.

Bugünkü yazımda; Microsoft Power BI ile rapor hazırlarken dinamik olarak web üzerinde bulunan verileri kullanmaya ve modellemeye çalışıp, buna yönelik mini bir demo ile püf noktaları ele almaya çalışacağız.

Mevcut projelerimiz içerisinde web üzerindeki canlı-dinamik veri kaynaklarına ihtiyaç duyabiliriz.

Örneğin: Çeşitli kurumlara yönelik; anlık döviz kurları,hava durumları,çeşitli borsa değerleri vb.

Belirttiğimiz verileri iki yöntem ile Power BI raporlarımızda kullanabiliriz;

1-Verileri çeşitli servisler ve yöntemler ile veri kaynaklarımızda depolayıp, Power BI üzerine aktarıp, kullanmak.(Burada veri kaynağı yük-performans dengesini gözetmeniz gerekebilir.)

2-Doğrudan Web kaynağı üzerinden verilere erişip Power BI içerisinde modelleyip, kullanmak.

Bu yazımızda ikinci yöntem ile adımları kısaca irdelemeye çalışacağız.

Dilerseniz hemen işlemlerimize başlayalım.

Öncelikle Power BI Desktop uygulamasını açıp;

microsoft power bi connect web url get data

Get Data (Veri Al) diyerek, Web seçeneğini seçip işlemlerimize başlayalım.

Karşımıza;

microsoft power bi connect web url from source

URL istemcisi çıkıyor.

Burada opsiyonel iki seçeneğimiz var.

1-Basic (Basit) = Basit bir şekilde anonim kullanıcı (istemci) olarak veri almanız için kullanılmaktadır.

*Üstteki görseldeki belirttiğim gibi.

2-Advanced (İleri) = Birden çok Web Parts (Web Parçaları-URL Kaynakları) ve birden çok opsiyonel veri istem parametresi ile gelişmiş veri almanız için kullanılmaktadır.

microsoft power bi connect web url source type

Biraz daha açacak olur isek;

  • Add Part üzerinden birden çok Web URL ekleyebilirsiniz,
  • Command Timeout in Minutes (İstemci Zaman Aşımı-Dakika) belirleyebilirsiniz,
  • HTTP-Hyper Text Transfer Protocol Request Header (Hiper Metin Transfer Protokolü Başlık İstekleri) için parametreler ekleyebilrsiniz.(Content Type — Auth vb.)

HTTP Request Header örnekleri;

microsoft power bi connect web url source http type

1-Accept (Kabül) : İçerik anlaşmasını kullanarak, sunucu tekliflerinden (Yanıtlarından) birini seçer, onu kullanır ve istemciye Content Type yanıt üst bilgisi ile seçtiği konusunda bilgilendirme yapar.

Ek tür olarak;

  • Accept-Charset (Karakter Seti Kabulü) = Belirlenen karakter kodlamalarını kullanır.
  • Accept-Encoding (Kabul Edilen Sıkıştırma) = Belirlenen sıkıştırma algoritmasını kullanır.
  • Accept-Language (Kabul Edilen Dil) = Belirlenen dili kullanır.

2-Cache-Control (Önbellek Kontrolü) = Belirlenen ön bellek kontrolünü kullanır.

3-Content Type (İçerik Türü) = Belirlenen ortam türünü kullanır.

4-If-Modified-Since (Değiştirilmiş ise) = İsteği koşullu hale getirir.Belirlenen tarihten sonra olumlu (Status-Durum 200) yanıt vermesini için kullanılır.

5-Prefer (Tercih Edilen) = Olumlu yanıt için tercih edilen istemci talebi olarak kullanılır.

6-Range (Aralık) = Belirli aralıklara sahip istem koşulları oluşturmak için kullanılır.

7-Referer (Yönlendirme) = İstemci üzerinde yönlendirme için kullanılır.

8-Opsiyonel = Ek istemci parametrelerini doğrudan siz girebilirsiniz.

Örneğin Authorization (Yetki);

microsoft power bi connect web url auth type

Biz doğrudan Basic seçeneği ile devam edeceğiz.

Kaynağımız ise; Türkiye Cumhuriyeti içerisinde gerçekleşen depremlere yönelik verileri içeren Kandilli Rasathanesi verileri olacak.

Link : http://www.koeri.boun.edu.tr/scripts/lst6.asp

Basic yöntemine veri kaynağımız olarak linkimizi ekleyip OK diyerek devam edelim.

microsoft power bi connect web url connection

İstemci üzerinden gelen yanıt ile HTML Tables üzerindeki tabloyu işaretleyip ön izlemesini alabiliriz.

Ön izleme opsiyonel olarak Table View ve Web View olarak gerçekleştirilebilir.

Table View ön izlemesi;

microsoft power bi connect web url connection header

Web View ön izlemesi;

microsoft power bi connect web url connection web view

Ek olarak Add Table Using Examples (Örnekleri Kullanarak Tablo Ekle) kullanarak web kaynağı üzerinden ayıklamak istediğiniz veriler için size yardımcı olur.

microsoft power bi connect web url connection web view navigator

Load diyerek veri modelimizi (Herhangi bir ön ayıklama işlemi yapmadan) Power BI içerisine alalım.

Querry Editor üzerinden verilerimizi ayıklamadan önce;

File (Dosya) / Options and Settings (Seçenekler ve Ayarlar) / Data Source Settings (Veri Kaynağı Ayarları) üzerinden gizlilik ayarlarını kontrol edelim.

NOT: İstemci üzeirnden herhangi bir Api-Key talebi bulunulmuyorsa Type: Anonymous olarak seçili olması gerekmektedir.Ek olarak Privacy Level (Gizlilik Seviyesi) yapıya uygun olarak düzenlenmelidir.

Privacy Level Hatırlatması;

https://miracozturk.com/power-bi-veri-ve-rapor-guvenligine-yonelik-hatirlatmalar/

microsoft power bi connect web url connection view permission

Gerekli güvenlik işlemlerini gözden geçirdikten sonra Power BI içerisine aldığımız verileri Querry Editor üzerinden düzenleyelim.

Bunun için Table üzerinden Edit Querry diyerek Querry Editore geçebiliriz.

microsoft power bi connect web url connection edit query

Verilerimizi kurgulamadan önce M kod alanı içerisindeki Table.TransferColumnType dönüşümünü Web.Page olarak değiştirip Web.Contents istemci alanına, veri barındırılan linkimizi yazalım.

microsoft power bi connect web url connection edit query type
microsoft power bi connect web url connection edit query page value

Hatırlatma: M diline ait tablo fonksiyonları için;

Link: https://docs.microsoft.com/en-us/powerquery-m/table-functions

kaynağına göz gezdirebilirsiniz.

Mevcut tablomuz üzerindeki Data sütununun alt kırınımlarına ulaşmak için Expand (Genişleterek-Açarak) ederek yapıyı açalım.

microsoft power bi connect web url connection edit query table

Kırınım işlemlerine devam edip Child 5 (Alt tabloları Child 5’e kadar expand edip) kırınımına kadar indiğimizde veri içeren alanımızı elde etmiş olacağız.

microsoft power bi connect web url connection edit query table

Text sütunu dışındaki sütunları silelim;

microsoft power bi connect web url connection edit query table

Text sütunumuzdaki verilerimizi Split Column özelliğini kullanarak satırlara ayıralım;

microsoft power bi connect web url connection edit query table
microsoft power bi connect web url connection edit query table delimiter

Burada;

  • Select or Enter Delimiter (Sınırlayıcıyı Seç veya Gir) opsiyonel seçeneğini Custom (Özel) olarak seçip, yakalayıcı tipine #(cr) yeni satır tipini girelim.
  • Split at (Bölünmeyi-Bölünme Tipini) tipini Each Occurrence of the Delimiter (Sınırlayıcının Her Oluşumu) olarak seçelim.
  • Split Into (Ayırma-Ayrılma Tipi) tipini Rows (Satırlar) olarak seçelim.
  • Quote Characther (Alıntı Karakteri) None (Olmayan-Yok) ve Split Using Special Characthers (Özel Karakterleri Kullanarak Bölmeyi) seçip OK ile sütunumuzu satırlara ayıralım.

Sonrasında satırlara ayrılmış yapımızı sıralamak adına bir Index sütunu dahil edelim.

microsoft power bi connect web url connection edit query table add index column

Add Column (Kolon Ekle) üzerinden Custom (Özel) seçeneğini seçip, Index değeri 0’dan başlayan ve 1’er 1’er artan bir sütun oluşturalım.

Not: En son dahil edilen veri en üst satırda olduğu düşünülür ise (Tarih Bazlı-Sıralı) Index değeri arttıkça eski verileri elde ederiz.

microsoft power bi connect web url connection edit query table data

Index sıralaması 0–5 olan satırları tablomuz içerisinden çıkartalım.

microsoft power bi connect web url connection edit query table data

Text isimli sütunumuz içerisindeki verileri, ayrı sütunlara parçalamak için üst kısımlarda kullandığımız Split Column özelliğimizden faydalanarak işlemlerimize devam edelim.

Text sütunu üzerinden soldan başlayarak ilk Boşluk (” “) karakterine kadar olan değerleri Tarih olarak düşünerek parçalayalım;

microsoft power bi connect web url connection edit query table delimiter

Parçaladığımız sütun ismini Tarih olarak yeniden düzenleyip, aynı işlemi Saat olarak yakalamak için başlangıç ve bitiş değerimizi Boşluk (” “) olarak verelim.

microsoft power bi connect web url connection edit query table delimiter

İlgili işlemleri aynı şekilde Enlem, Boylam, Derinlik ve Büyüklük için gerçekleştirelim.

İlgili M kod parçacığı;

let
Source = Web.Page(Web.Contents("http://www.koeri.boun.edu.tr/scripts/lst6.asp")),
Data = Source{0}[Data],
Children = Data{0}[Children],
Children1 = Children{1}[Children],
Children2 = Children1{5}[Children],
#"Removed Columns" = Table.RemoveColumns(Children2,{"Kind", "Name", "Children"}),
#"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Columns", {{"Text", Splitter.SplitTextByDelimiter("#(cr)", QuoteStyle.None), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Text"),
#"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"Text", type text}}),
#"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
#"Filtered Rows" = Table.SelectRows(#"Added Index", each ([Index] <> 0 and [Index] <> 1 and [Index] <> 2 and [Index] <> 3 and [Index] <> 4 and [Index] <> 5)),
#"Inserted Text Before Delimiter" = Table.AddColumn(#"Filtered Rows", "Text Before Delimiter", each Text.BeforeDelimiter([Text], " "), type text),
#"Changed Type1" = Table.TransformColumnTypes(#"Inserted Text Before Delimiter",{{"Text Before Delimiter", type date}}),
#"Renamed Columns" = Table.RenameColumns(#"Changed Type1",{{"Text Before Delimiter", "Tarih"}}),
#"Inserted Text Between Delimiters" = Table.AddColumn(#"Renamed Columns", "Text Between Delimiters", each Text.BetweenDelimiters([Text], " ", " "), type text),
#"Renamed Columns1" = Table.RenameColumns(#"Inserted Text Between Delimiters",{{"Text Between Delimiters", "Saat"}}),
#"Inserted Text Between Delimiters1" = Table.AddColumn(#"Renamed Columns1", "Text Between Delimiters", each Text.BetweenDelimiters([Text], " ", " ", 2, 0), type text),
#"Renamed Columns2" = Table.RenameColumns(#"Inserted Text Between Delimiters1",{{"Text Between Delimiters", "Enlem"}}),
#"Inserted Text Between Delimiters2" = Table.AddColumn(#"Renamed Columns2", "Text Between Delimiters", each Text.BetweenDelimiters([Text], " ", " ", 5, 0), type text),
#"Renamed Columns3" = Table.RenameColumns(#"Inserted Text Between Delimiters2",{{"Text Between Delimiters", "Boylam"}}),
#"Added Custom Column" = Table.AddColumn(#"Renamed Columns3", "Custom", each let splitText = Splitter.SplitTextByDelimiter(" -", QuoteStyle.None)([Text]), splitsplitText0 = List.Reverse(Splitter.SplitTextByDelimiter(" ", QuoteStyle.None)(splitText{0}?)) in Text.End(splitsplitText0{1}?, 4), type text),
#"Renamed Columns4" = Table.RenameColumns(#"Added Custom Column",{{"Custom", "Derinlik"}}),
#"Inserted Text Between Delimiters3" = Table.AddColumn(#"Renamed Columns4", "Text Between Delimiters", each Text.BetweenDelimiters([Text], "- ", " "), type text),
#"Renamed Columns5" = Table.RenameColumns(#"Inserted Text Between Delimiters3",{{"Text Between Delimiters", "Büyüklük"}}),
#"Inserted Text Range" = Table.AddColumn(#"Renamed Columns5", "Text Range", each Text.Middle([Text], 71, 26), type text),
#"Renamed Columns6" = Table.RenameColumns(#"Inserted Text Range",{{"Text Range", "Yer"}}),
#"Replaced Value" = Table.ReplaceValue(#"Renamed Columns6",".",",",Replacer.ReplaceText,{"Derinlik"}),
#"Changed Type2" = Table.TransformColumnTypes(#"Replaced Value",{{"Derinlik", type number}}),
#"Replaced Value1" = Table.ReplaceValue(#"Changed Type2",".",",",Replacer.ReplaceText,{"Büyüklük"}),
#"Changed Type3" = Table.TransformColumnTypes(#"Replaced Value1",{{"Büyüklük", type number}}),
#"Replaced Value2" = Table.ReplaceValue(#"Changed Type3",".",",",Replacer.ReplaceText,{"Enlem"}),
#"Changed Type4" = Table.TransformColumnTypes(#"Replaced Value2",{{"Enlem", type number}}),
#"Replaced Value3" = Table.ReplaceValue(#"Changed Type4",".",",",Replacer.ReplaceText,{"Boylam"}),
#"Changed Type5" = Table.TransformColumnTypes(#"Replaced Value3",{{"Boylam", type number}, {"Saat", type time}}),
#"Removed Columns1" = Table.RemoveColumns(#"Changed Type5",{"Text"}),
#"Duplicated Column" = Table.DuplicateColumn(#"Removed Columns1", "Saat", "Saat - Copy"),
#"Renamed Columns7" = Table.RenameColumns(#"Duplicated Column",{{"Saat - Copy", "Saat Format"}}),
#"Inserted Text Before Delimiter1" = Table.AddColumn(#"Renamed Columns7", "Text Before Delimiter", each Text.BeforeDelimiter(Text.From([Tarih], "tr-TR"), ".", 1), type text)
in
#"Inserted Text Before Delimiter1"

Sonuç olarak elde ettiğimiz tablonun son hali;

microsoft power bi connect web url connection edit query table field

Elde ettiğimiz verileri görselleştirme paneli içerisinden Map görseli üzerinde kullanalım;

microsoft power bi connect web url connection edit query table visualizations

Ek olarak aşina olduğumuz tablo ve Bookmark çözümlemelerini de rapor içerisinde kullanırsak;

https://miracozturk.com/power-bi-ile-web-url-kaynaklarini-kullanmak/

sonucuna ulaşırız.(Sayfa üzerindeki yayınlanmış rapor.)

Genel bağlamda Web üzerindeki veri alma işlemleri benzer adımlardan-yöntemlerden oluşmaktadır.Değişken olan kısım ise veri modellemesi içerisinde gerçekleşmektedir.

Mevcut işlemler için işinize yarayabilecek bir kaç link;

  • Nüfus Analiz Verileri;

Link: https://biruni.tuik.gov.tr/medas/?kn=95&locale=tr

  • Çeşitli ücretsiz API kaynakları;

Link-1: https://collectapi.com/tr/

Link-2: https://rapidapi.com/collection/list-of-free-apis

  • Web üzerinde veri ayıklama örnekleri;

Link-1: https://docs.microsoft.com/tr-tr/power-bi/desktop-connect-to-web-by-example

Link-2: https://docs.microsoft.com/tr-tr/power-bi/desktop-tutorial-importing-and-analyzing-data-from-a-web-page

Faydalı olması dileğiyle.

Gelecek yazılarda görüşmek üzere.

İyi günler…

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Mirac Öztürk
Mirac Öztürk

Written by Mirac Öztürk

Data Scientist + Mathematician / Coder — Gamer miracozturk.com

No responses yet

Write a response