Php

Php ile Başka Siteden Veri Çekme: Covid-19 Verileri Tablosu

Web sitelerinde bazı durumlarda başka sitelerden veri çekerek sitenin kendi istediği formatta yayınlama ihtiyacı olabilir. Php tabanlı web sitelerinde bu işlemi yapmak oldukça kolaydır. Fakat burada şu hususlara vurgu yapmak gerekmektedir:

  • Yazacağınız veri çekme kodunu veriyi alacağınız sitenin html yapısına uygun olarak düzenlemeniz gerekiyor.
  • Veri çekeceğiniz web sitesinin yapısı sizi farklı algoritmalar geliştirmeye zorlayabilir.
  • Veri çekeceğiniz web sitesinin yapısı Php'nin farklı özelliklerini veya fonksiyonlarını kullanmak zorunda bırakabilir.
  • Veriyi çekeceğiniz web sitesi buna izin vermiyor olabilir.
  • Çektiğiniz verinin kaynağını belirtmeniz çoğunlukla telif hakları açısından gereklidir.

Php ile başka bir siteden veri çekmenin birçok yolu vardır. Biz burada son derece basit bir yol kullanarak bu işi yapacağız. 

Çekeceğimiz veriler Covid-19'un ülke bazlı verileri olacak. Bu veriler ülke bayrağı, ülke adı, onaylanmış vaka,  1 milyon kişi başına vaka sayısı, iyileşen sayısı ve ölüm sayısını içermektedir. Verileri çekeceğimiz bağlantı da şudur:

https://news.google.com/covid19/map?hl=tr&gl=TR&ceid=TR:tr

Bu site wikipedia'dan aldığı verileri kendi formatına göre yayınlamaktadır. Biz de bu siteden ham veriyi çekecek ve istediğimiz verileri elde edeceğiz. Bunu yaparken de adeta bir cerrah hassasiyetinde yapacağız. Şimdi adım adım php kodumuzu oluşturalım.

1. Adım: Curl ile istemci oluşturup ham veriyi çekme

Curl kütüphanesi Php'de çeşitli istemci işlemleri yapmanızı sağlayan geniş bir kütüphanedir ve çeşitli fonksiyonlar barındırır. Normalde file_get_contents() gibi fonksiyonlarla da veri çekebilirsiniz. Ama curl fonksiyonlarıyla başka siteden veri çekmek daha sağlıklı. Bu yüzden aşağıdaki kod bloğuyla curl ile bir istemci oluşturararak. Hedef url içerisinde bulunan html kodlarını bütünüyle bir değişkene aktarıyoruz.  Diğer adımlarda da bazı fonksiyonları kullanarak istediğimiz verileri cımbızlayacağız.

<?php
$istemci = curl_init();
curl_setopt($istemci, CURLOPT_URL, 'https://news.google.com/covid19/map?hl=tr&gl=TR&ceid=TR:tr');
curl_setopt($istemci, CURLOPT_RETURNTRANSFER, 1);
$ham_veri = curl_exec($istemci);
echo $ham_veri;
?>

Bu kod bloğu ile  curl ile bir istemci tanımladık. Daha sonra hedef url'yi belirledik ve CURLOPT_RETURNTRANSFER özelliğin 1 olarak ayarlayarak gelen verinin değişkene aktarılabilmesini sağladık. İstemciyi çalıştırarak hedef url'deki tüm html kodunu ham_veri adındaki değişkene aktardık. Bu kodu çalıştırdığımızda ortaya çıkacak sonuç hedef URL'deki html kodlarının birebir kopyası olacaktır. Bizim bu kodlardan sadece  ihtiyacımız olanları almak için aşağıdaki adımları uygulamamız gerekiyor. 

2. Adım: preg_match_all fonksiyonuyla istediğimiz tablo satırlarını çekmek

Şimdi sıra geldi cerrahi operasyona. Elde ettiğimiz ham veriden istediğimiz tablonun satırlarını çekmek için preg_match_all fonksiyonunu kullanacağız. Bunun için html tablosunun desenini belirlememiz gerekiyor. Bunun için hedef url'deki kodları incelemeli ve dokuyu belirlemeliyiz.


Yukarıdaki resimdeki gibi kaynak kod incelendiğinde alınmak istenen satır dokusunun

<tr class="sgXHf YvL7re>...</tr>

şeklinde olduğu görülür. Buna göre preg_match_all() fonksiyonunda alınacak bu doku aşağıdaki şekilde belirtilerek $ham_veri değişkenindeki satırlar bütün olarak $satirlar değişkenine aktarılır.

<?php
  $istemci = curl_init();
  curl_setopt($istemci, CURLOPT_URL, 'https://news.google.com/covid19/map?hl=tr&gl=TR&ceid=TR:tr');
  curl_setopt($istemci, CURLOPT_RETURNTRANSFER, 1);
  $ham_veri = curl_exec($istemci);
  preg_match_all('#<tr class="sgXwHf  YvL7re">(.*?)</tr>#si'', $ham_veri, $satirlar);
  echo $satirlar;
?>

Preg_match_all() fonksiyonunda dokuyu#...#si arasına alarak dokunun başlangıç başladığını ve bittiğini belirtiyoruz. (.*?) ile de araya gelen her şeyi ifade ediyoruz.

Bu kodu çalıştırırsanız ekranda sadece array yazdığını göreceksiniz. Çünkü preg_match_all() fonksiyonu $satirlar değişkenini 2 boyutlu diziye dönüştürerek verileri aktarır. Bu tür değişkenleri de echo ile yazdırdığınızda sadece array yazısını görürsünüz. Sonraki adımlarda bu değerleri dizden çekip ayrı ayrı yazdıracağız.

3. Adım: foreach döngüsüyle dizi içindeki değerleri ayrı ayrı almak

Şimdiye kadar siteden aldığımız ham veri içindeki istediğimiz satırları bir bütün halinde $satirlar dizi değişkenine aktardık. Ama işimiz bitmedi. Dizi içindeki verileri ayrı ayrı alıp istediğimiz biçimde işleme tabi tutmak için $satirlar dizi değişkenini foreach döngüsü içine sokacağız. Böylelikle dizi içerisindeki her bir veriyi istediğimiz gibi işleyebiliriz. 

Bu işlem için diğer döngü çeşitlerini de kullanabilirsiniz. Ama foreach döngüsü bu türden dizi işlemleri için biçilmiş kaftan. İşimizi oldukça pratik yapmamızı sağlıyor. Şimdi aşağıdaki kod bloğu üzerinden olayı gerçekleştirelim.

<?php
  $istemci = curl_init();
  curl_setopt($istemci, CURLOPT_URL, 'https://news.google.com/covid19/map?hl=tr&gl=TR&ceid=TR:tr');
  curl_setopt($istemci, CURLOPT_RETURNTRANSFER, 1);
  $ham_veri = curl_exec($istemci);

  preg_match_all('#<tr class="sgXwHf  YvL7re">(.*?)</tr>#si', $ham_veri, $satirlar);
  foreach ($satirlar[0] as $satir) {

     preg_match('#<th class="l3HOY" scope="row" role="rowheader">(.*?)</th>#si', $satir, $baslik);
     preg_match_all('#<td class="l3HOY">(.*?)</td>#si', $satir, $veriler);
      echo strip_tags($baslik[0],'<img>')."-";
      echo $veriler[0][0]."-".$veriler[0][1]."-".$veriler[0][2]."-".$veriler[0][3]."<br>";
  }

  curl_close($istemci);
?>

Dikkat edileceği üzere 2 boyutlu $satirlar dizisindeki verileri çekmek üzere foreach döngüsü yukarıdaki şekilde kullanılmıştır.

Döngü içerisindeki preg_match() fonksiyonu satır başındaki ülke bayrağı ve adını çekmek için kullanılmıştır.

Preg_match fonksiyonu sadece ilk eşleşmeyi alır. Aldığımız her satırda sadece 1 bayrak ve ülke adı hücresi olduğu için preg_match_all() yerine preg_match() fonksiyonunun kullanılması yeterlidir. preg_match ile ayıklanan satır başı verisi strip_tags() fonksiyonuyla işleme tabi tutulmuş ve html etiketlerinden arındırılmıştır. Yanlız ülke bayrağını görebilmek için strip_tags() içerisinde <img> etiketinin dahil edilmesine yukarıdaki gibi izin verilmiştir.

Bir satırdaki diğer veriler, onaylanmış vaka, 1 milyon kişi başına vaka sayısı, iyileşen, ölüm sayıları bir satırdaki sayısal verilerdir. O yüzden onları çekmek için foreach döngüsü içinde yine preg_match_all() fonksiyonu kullanılmıştır. Bu veriler  $veriler değişkeninde iki boyutlu olarak aktarılmış ve her veri yukarıdaki gibi echo ile yazdırılmıştır. Buradaki verileri dahada sadeleştirerek istediğiniz forma sokmak için strip_tags() fohksiyonunu kullanabilirsiniz.

Yukarıdaki kod bloğunu çalıştırdığınızda Covid verilerini aşağıdaki gibi sade biçimde elde etmiş olduk:

Bu çekilen sayfaya ulaşmak için TIKLAYIN.

UYARI: Eğer hedef URL  yapısı değişirse php kodunuzu güncellemeniz gerekir.

308 views
YORUMLAR
kamil:
Kodlar siteye göre değişiyor mu?
hagar:
sadece html alıntısı yapacağınız kısmı değiştirin