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
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:¶
Contoh Tabel yang ditampilkan prodeskel:¶
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 123123 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:
membersihkan data json dan table dengan
jqmenggabungkan tabel menjadi single file dengan fungsi
trdansedmembaca 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!