Opendata - Мемлекеттік ашық мәліметтер порталынан мәліметтер алып үйренеміз

Алақай, енді статистика агенттігінің сайтынан мәліметтер ұрлаудың қажеті жоқ. Бірақ, ол әдіс те қызық :)


Алдымен, Opendata дегеніміз не?

Машина оқи алатын форматтағы жүйеленген ашық мәліметтерді көрсем болды, сразым оны жүктеп алып, жақсылап тұрып өңдеп, анализ жасап, статистика шығарғым кеп тұратын әдетім бар муахахаха. Open data дегеніміз де сол, мәліметтер ашық, машина оқи алатындай түрде таратылуы керек деген идеядан шыққан. Басқа мәліметтер өз алдына, ал мемлекеттің құпия емес, ашық мәліметтері машина оқи алатын форматта таралуы міндетті деп есептеймін. Сәйкесінше data журналистика деген бағыт та жақсы дамыр еді.

Opendata Қазақстанда

Қазақстанға бұл концепция идеясы ерте де емес, кеш те емес, әйтеуір келді-ау. Өзім келуін 3 жылдай күттім. Ия, дамыған елдер 2000-шы жылдары бастап кеткен болатын, ал бізге он жылдан астам уақыт кешігіп келді.
Ресми түрде Қазақстанда «Мемлекеттік ашық мәліметтер порталы» былтыр, яғни 2013 жылы ашылған болатын. Ашылған кезде ішінде бар жоғы оншақты мәліметтер ғана бар еді. Сайт әлі толықтырылуда дегесін, біраз шыдап, күтуге тура келді. Көп күттірмей, міне, бір жыл дегенде, осы жаздан бастап ішіне мәліметтер толтыра бастады :) Сайтта 789 мәлімет бар депті. Не мен дұрыс іздемедім, не сайтта 789 мәлімет бар деп өтірік жазылған. Іздеп іздеп, 404 мәлімет тауып алдым. Салыстыру үшін, АҚШ-тың Data.gov порталында 157887 мәлімет бар.

Енді?

Енді, не айтқым келді. Сонымен бізде «Мемлекеттік ашық мәліметтер порталы» бар. Керемет демеймін, мәліметтері көп демеймін, бірақ бар. Барына қанағат. Енді осы порталмен жұмыс жасап үйренеміз. Порталдан мәліметтер алуға арналған арнайы API-і бар. Нақтырақ айтқанда API-дің екі нұсқасы бар, бірі ескі, екіншісі жаңа API v2. Біз осы екінші нұсқасымен жұмыс жасайтын боламыз.

API v2.

Клиент пен data.gov.kz сервері арасында мәліметтер алмасу HTTP протоколы арқылы жүзеге асырылады. Мәліметтер арасынан іздеу elasticsearch технологиясы арқыты жүргізіледі. Сұраныс кезінде параметрлер HTTP протоколымен GET әдісі (метод) арқылы келесі форматта жіберіледі:

data.gov.kz/api/v2/dataset?source={Query in Json Object}
Бұл сұраныс dataset мәліметтері арасынан іздейді, сондай-ақ source параметрі іздеу және фильтрлеу үшін қолданады.

data.gov.kz/api/v2/mapping/dataset
Бұл сұраныс dataset мәліметіндегі ұяшықтарды сипаттайды.

dataset орнына қойылатын мәліметтер жиынтығын мына сілтемеден жүктеп алсаңыз болады.

Сервер жауапты JSON форматында қайтарады. Жауап мәліметтер жиынтығын не қате кеткені туралы мәтінді қайтарады.

Тәжірибе

Теорияны болдық, енді тәжірибеге көшейік. Түсінікті болу үшін, мен data.gov.kz сайтынан Javascript (JQuery) арқылы бір мәліметті алып, шығаратын боламын. Ең қарапайым мысалда көрсетейін.

Барлық мәліметтерді ақтарып отырып, ішінен осы қызық-ау деген бір статистиканы таңдап алдым. Сонымен, менің таңдаған мәліметім altyn_belgi яғни "ҰБТ нәтижесі бойынша, жалпы орта білімі туралы аттестат алған түлектердің ішіндегі «Алтын белгі» иегерлерінің үлесі". Ол туралы мәліметті, мынадай сұраныс арқылы ала аламыз:

data.gov.kz/api/v2/altyn_belgi

Бізге мынадай жауап қайтарады:
[
   {
      "region":"Алматы / Алматинская",
      "id":"4",
      "percent":"0.6",
      "of_them_ended_up_with_a_certificate_altyn_belgi":"100",
      "graduates_who_have_received_a_certificate_of_general_secondary_education":"15926"
   },
   {
      "region":"Қостанай / Костанайская",
      "id":"9",
      "percent":"0.9",
      "of_them_ended_up_with_a_certificate_altyn_belgi":"42",
      "graduates_who_have_received_a_certificate_of_general_secondary_education":"4922"
   },
   {
      "region":"Маңғыстау / Мангистауская",
      "id":"11",
      "percent":"0.7",
      "of_them_ended_up_with_a_certificate_altyn_belgi":"29",
      "graduates_who_have_received_a_certificate_of_general_secondary_education":"4186"
   },
....


Бізге тек бастапқы 10 нәтижені ғана қайтарыпты, хмм қызық. Негізі XLM-інде он жеті жауап бар тұғын. Бәлкім үнсіз келісім бойынша тек 10 жауапты ғана қайтаратын шығар. Қайғырудың еш себебі жоқ, біз қайтаратын жауаптар санын қосымша source параметрі арқылы басқара аламыз. Сұранысымызды аздап өңдейік:
data.gov.kz/api/v2/altyn_belgi?source={
  "size": "17"
}

Бұл сұраныста біз altyn_belgi мәліметтерінен алғашқы 17 жауапты қайтар деп көрсеттік.

Осы қайтарған жауаппен жұмыс жасай беруімізге болатын еді, бірақ мысалымызды тағы да сәл күрделердірейік. Қайтарған жауапты қарасаңыз, біртүрлі ретсіз орналасқан :) id ұяшығы біріншісінде 4, екіншісінде 9, үшіншісінде 11… id бойынша реттелмеген, «id» ұяшығы бойынша реттеп алу үшін, сұранысты былай жібереміз:
data.gov.kz/api/v2/altyn_belgi?source={
  "size": "17",
  "sort": [{
    "id": {
      "order": "asc"
    }
  }]
}

Яғни, source параметріне қосымша фильтр жазамыз. Сұранысымыз былай дейді, altyn_belgi мәліметтерінің алғаншы 17 мәліметін қайтар, бірақ id ұяшығы өсу реті («order»: «asc») бойынша реттелсін («sort»). Бұл сұранысқа мынадай жауап қайтарылды:
[
   {
      "region":"ҚР /РК",
      "id":"1",
      "percent":"1",
      "of_them_ended_up_with_a_certificate_altyn_belgi":"1536",
      "graduates_who_have_received_a_certificate_of_general_secondary_education":"139457"
   },
   {
      "region":"Ақмола /Акмолинская",
      "id":"2",
      "percent":"0.9",
      "of_them_ended_up_with_a_certificate_altyn_belgi":"42",
      "graduates_who_have_received_a_certificate_of_general_secondary_education":"4605"
   },
   {
      "region":"Ақтөбе / Актюбинская",
      "id":"3",
      "percent":"1.7",
      "of_them_ended_up_with_a_certificate_altyn_belgi":"121",
      "graduates_who_have_received_a_certificate_of_general_secondary_education":"6924"
   },
...


Код жазамыз

Қайда, қалай, қандай параметрлері арқылы сұраныс жіберуді түсініп алдық, енді код жазып, осы мәліметтерді тартып алып, әдемі етіп шығарып қоюға кірісейік. Жоғарыда айтқанымдай, сервер бізге жауапты JSON форматында береді. Ал JQuery-ге басқа серверден JSON жауаптарды алуға еш қосымша рұқсаттың керегі жоқ. Біз не $.ajax арқылы не $.getJSON арқылы жауап ала аламыз. Мен екінші әдісті қолданамын, себебі жазылуы қысқа :)
var header = $('.header');
	$.getJSON('http://data.gov.kz/api/v2/altyn_belgi?source={%20%22size%22:%20%2217%22,%20%22sort%22:%20[{%20%22id%22:%20{%20%22order%22:%20%22asc%22%20}%20}]%20}', function(data){
	 $.each(data, function(key, val){
		header.append('<div class="reg'+val['id']+'"><div class="re">'+val['region'].split('/')[0]+'</div><div class="ob">'+val['graduates_who_have_received_a_certificate_of_general_secondary_education']+'</div><div class="al">'+val['of_them_ended_up_with_a_certificate_altyn_belgi']+'</div><div class="pr">'+val['percent']+'%</div></div>');
	});
});


Бұл кодта былай дедік, $.getJSON('', бірінші параметріне қай жерден жауап алатынымызды жазамыз, яғни біздің жазған запросымызды осы жерге жазамыз, екінші параметрі анонимді функция, жауап келгеннен кейін орындалады. Келген жауапты $.each циклы бойынша жүріп шығып ішінен керек мәліметтерімізді алып, сайтқа орналастырып отырамыз.

Бооолды, бары осы. Аздап CSS қосып, аздап верстка жасап жібергеннен кейін, жоғарыдағы серверден келген түсініксіз, іш пыстыратын JSON жауапты адам түсінетіндей мынадай түрге айналдырып аламыз.

http://hosting.users.kz/mysal/altyn_belgi.html



Қорытынды

Қорытындылай келе, біз бұл жазбадан не түсіндік, не үйрендік
  • Opendata дегеніміз не?
  • data.gov.kz дегеніміз не?
  • data.gov.kz API-і
  • Серверге сұраныс жіберіп үйренеміз
  • Сұранысқа қосымша фильтр мен параметр жіберіп үйренеміз
  • size параметрі
  • sort параметрі
  • JQuery арқылы сұраныс жіберіп, жауабын орналастыру

  • +8
4 пікір
kamyrov
Мақалаға рахмет), өте қызықты болды, енді маған уәде берген затынды істеп берсең… ;)
Abylai_adil
аха, осы аптаның соңына дейін жариялаймын :)
kamyrov
Айтпақшы, opendata-ға байланысты мобильдік қосымшаларды жасайтын конкурсқа қатысқан жоқсын ба?) Бір Macbook-қа бай болатын едін)
Abylai_adil
әне қатысамын, міне қатысамын деп жүргенде кешігіп қалыппын)
Тек тіркелген қолданушылар ғана пікір қалдыра алады.