Download Data Prodeskel

Dalam tulisan ini, contoh kasus mendownload data dari situs PRODESKEL, yaitu Sistem Informasi Desa dan Kelurahan milik Direktorat Jenderal Bina Pemerintah Desa, Kementerian Dalam Negeri.

Prodeskel menyajikan data Potensi dan Kependudukan dari Desa dan Kelurahan yang merupakan wilayah administrasi pemerintahan terkecil di seluruh Indonesia yang berjumlah 84.276 yang terdiri dari 75.753 desa, 8.486 kelurahan dan 37 pemukiman transmigrasi.

Prerequest:

  • bash version 5.2

  • jq-1.7

Tampilan awal Prodeskel

informasi dalam Prodeskel

  • Administratif : Profil Lembaga, Pokja Prodeskel, Desa/Kelurahan, Pendidikan Aparat, APBDesa, dan Batas Wilayah.

  • Prasarana Wilayah : Kantor Desa/Kelurahan, Sumber Energi, Pendidikan, Air Bersih, Sampah, Kesehatan, Transportasi dan Saluran Irigasi.

  • Prasarana Lembaga : BUMDES, BPD, LKD/LKK, LKM/LPM, PKK, dan Karang Taruna.

  • Kependudukan : Kesejahteraan, Penduduk dan KK, Mata Pencaharian, Tingkat Pendidikan, dan Tenaga Kerja.

  • Tataguna Lahan : Jenis Lahan dan Kepemilikan Hutan.

  • Produksi : Tanaman Pangan, Buah-buahan, Apotik Hidup, Perkebunan, Hasil Tangkapan, Budidaya Air Laut dan Payau, Budidaya Air Tawar, Peternakan, Hasil Hutan, dan Bahan Galian.

  • Kelembagaan : Lembaga Pemerintahan, Lembaga Kemasyarakatan, Lembaga Ekonomi, dan Lembaga Keamanan.

  • Perumahan : Berdasarkan Dinding, Berdasarkan Atap dan Berdasarkan Lantai.

  • Kesehatan : Tenaga Medis, Sanitasi, dan Sumber Air Bersih.

  • PolSosBudPar : Partisipasi Politik, Adat Istiadat, dan Pariwisata.

Data Prodeskel:

../_images/prodeskel-data.png

Contoh Tabel yang ditampilkan prodeskel:

Tabel Potensi Tanaman Pangan
Tabel Potensi Buah-buahan

Download data Prodeskel

Untuk men-download data/informasi dari Prodeskel, dalam case ini menggunakan script BASH dan Curl yang cukup umum digunakan.

Curl saat mengakses tabel pangan:

Curl memiliki banyak parameter yang terdiri dari Header, Data-Raw dan Link nya sendiri, dengan format seperti ini:

curl -o [nama file] -s - X POST -H [headers] -d [data-raw] link
curl -o $file0 -s -X POST \
        -H "Cookie: PHPSESSID=$PHPSESSID" \
        -d "nmgp_opcao=ajax_navigate&script_case_init=1&script_case_session=$PHPSESSID&opc=rec&parm=$y" \
        https://prodeskel.binapemdes.kemendagri.go.id/ghslpangan_detil/

Data yang dapat di-download per-tabel secara default berjumlah 15 baris,
jadi untuk mengambil keseluruhan data dilakukan dengan iterasi sejumlah
total data (terlihat di tabel firefox tadi) dan membaginya dengan 15.

Parameter dari curl:
- $PHPSESSID adalah session id yang diambil dari Firefox saat melihat tabel
- $y menunjukan awal nomor dari 15 baris yang akan di-download

Script sederhana Bash seperti ini:

prodeskel-ghslpangan.sh

#!/bin/bash

PHPSESSID=4o6jdogqvfhsqnhkn07bn15d72

for (( x=0; x<9906; x++ ))
do
        y=$(( x*15+1 ))
        z=$(printf "%04d" "$x")
        file="pangan/pangan$z.txt"
        curl -o $file -s -X POST \
                -H "Cookie: PHPSESSID=$PHPSESSID" \
                -d "nmgp_opcao=ajax_navigate&script_case_init=1&script_case_session=$PHPSESSID&opc=rec&parm=$y" \
                https://prodeskel.binapemdes.kemendagri.go.id/ghslpangan_detil/
        sleep 2 # menunggu selama 2 detik
done

Penjelasan:

  • Scrip ini melakukan iterasi 9906 kali, untuk mengambil data sejumlah 148.602 baris

  • Session-ID diambil dari Firefox saat mengakses situs Prodeskel

  • hasil download diletakkan pada file pangan0000.txt, pangan0001.txt ..dst dan disimpan di folder pangan

  • untuk mendownload data lainnya, dapat mengganti ghslpangan_detil dengan menu pada gambar diatas

Untuk mendownload data per-file

prodeskel-ghslpangan-single.sh

#!/bin/bash

PHPSESSID=4o6jdogqvfhsqnhkn07bn15d72

y=$(( $1*15+1 ))
z=$(printf "%04d" "$1")
file="pangan$z.txt"
echo $file
curl -o $file -s -X POST \
        -H "Cookie: PHPSESSID=$PHPSESSID" \
        -d "nmgp_opcao=ajax_navigate&script_case_init=1&script_case_session=$PHPSESSID&opc=rec&parm=$y" \
        https://prodeskel.binapemdes.kemendagri.go.id/ghslpangan_detil/

Penjelasan:

  • contoh penggunaan: prodeskel-ghslpangan-single.sh 123

  • 123 akan menjadi argumen yg disebut $1 pada script

Cek hasil download

Hasil download data prodeskel sangat mungkin terjadi gagal download seperti:

  • ukuran file tidak merepresentasikan adanya data

  • file dengan nomor tertentu tidak ter-download

  • lakukan berulang, sampai tidak ada file yg perlu diproses lagi.

Untuk cek ukuran file dan hapus/delete

find pangan -type f -size -5k -delete

Untuk cek file yang terlewat download-ghslpangan-cek.sh

#!/bin/bash

find pangan -type f -size -5k -delete

PHPSESSID=4o6jdogqvfhsqnhkn07bn15d72

files=($(ls pangan))
filetot=${#files[@]}
echo $filetot

for (( x=0; x<$((filetot-1)); x++ ))
do
        num1=$((10#${files[$x]//[^0-9]/}))
        num2=$((10#${files[$x+1]//[^0-9]/}))
        diff=$((num2 - num1))
        if [ $diff -gt 1 ]; then
                for (( y=1; y<$diff; y++ )); do
                        bash download-ghslpangan-single.sh $((num1+y))
                        sleep 2
                done
        fi
done

Pengolahan Data untuk Database

Melanjutkan proses hasil dari download data Prodeskel, akan dilakukan sbb:

  1. membersihkan data json dan table dengan jq

  2. menggabungkan tabel menjadi single file dengan fungsi tr dan sed

  3. membaca tabel menjadi array dengan fungsi pup

Persiapan

instalasi jq

$ sudo apt install jq

instalasi pup

Linux/Ubuntu
$ sudo wget https://github.com/ericchiang/pup/releases/download/v0.4.0/pup_v0.4.0_linux_amd64.zip
$ sudo unzip pup_v0.4.0_linux_amd64.zip -d /usr/local/bin

MacOS
$ brew install pup

Generate CSV Files

prodeskel-gabungkan.sh [nama-folder]

#!/bin/bash

files=($(ls $1))
filetot=${#files[@]}

for file in "${files[@]}"
do
        json_string=$(cat "$1/$file")

        html=$(echo $json_string | jq '.setValue[] | select(.field == "sc_grid_body") | .value')
        html=$(echo -e "$html" | tr -d '\"' | tr -d '\r' | tr -d '\n') #hapus ", \r dan \n"
        html=$(echo -e "$html" | tr -d '()') #hapus tanda (,)
        html=$(echo "$html" | sed -E 's/<\/?span[^>]*>//g') #hapus <span ...>text</span>
        html=$(echo "$html" | sed -E 's/<\/?a[^>]*>//g' | sed -E 's/<IMG[^>]*>//g') #hapus <a ...>...</a>
        html=$(echo "$html" | sed -E 's/<TD[^>]*>/<TD>/g')
        html=$(echo "$html" | sed -E 's/<TR[^>]*>/<TR>/g')
        html=$(echo "$html" | sed -E 's/<TABLE[^>]*>/<TABLE>/g')
        echo $html >> "$1.html"
        echo $file
done

cat "$1.html" | pup 'table tr td text{}' > "$1.csv"

Happy Coding !!!

Peringatan

Pakailah dengan bijak!