• Programming

    Data Harvest: POM.GO.ID

    Awalnya sederhana aja, abis baca “Kolom” di detik.com langsung inget, di Indonesia ada BPOM (Badan Pengawas Obat dan Makanan) dan dari websitenya kita bisa tau apakah sebuah produk obat dan makanan benar-benar aman untuk dikonsumsi. Entri pertama dari penelusuran Google dengan keyword “bpom” langsung tepat, dan disana ada sub-result menuju web yang saya mau: Cek Produk BPOM.

    Saya langsung cari nama produk berdasarkan kata kunci air kemasan yang ada di meja saya: Pristine. Hasilnya ada 9 data dan semuanya gak ada sangkut pautnya sama air mineral keluaran grup sinarmas. Saya coba ulang dengan nomor registrasinya: MD 265210006138, baru deh nongol datanya. Ternyata “Pristine” itu merk, sedangkan nama produknya sendiri adalah “Air Minum pH Tinggi”.

    Abis baca keterangan sekilas, langsung aja reflek: klik-kanan – View Source. Keliatan deh raw html-nya, ternyata halaman pencarian dibuat dengan table standar, data diload oleh script php (tidak pakai ajax) dan paging sederhana. Semua parameter ada di address bar browser, dan diantara parameter yang ada, si programmer nyisipin session php. Mungkin niatnya supaya datanya gak bisa di lihat tanpa melalui browser, tapi downside-nya orang gak bisa ngasih tautan referensi ke entri tertentu. Oh iya, satu lagi, baris data hasil pencarian bisa di klik untuk menampilkan detail entrinya, dan ini diload dengan ajax.

    Data detail muncul setelah row di-klik.

    Karena liat langsung raw html agak susah, jadi Ctrl+Shift+I untuk ngeluarin DevTools dari browser. Jaman dulu yg begini susah banget, satu2nya tools yang lumayan mumpuni addon dari Firefox yang namanya Firebug, tapi berhubung browser2 modern udah meng-embed fungsi ini jadi Firebug di-mati-in deh.

    Inspeksi raw html tabel hasil pencarian

    Dari inspeksi elemen, bisa dilihat dalam tiap <tr> produk ada custom attribute bernama urldetil yang digunakan untuk me-load data detail dari produk dengan ajax call.

    Request AJAX untuk mengambil data detail.
    Response berupa halaman html yang siap ditampilkan.

    Nah, sebenernya data detail ini yang harusnya di harvest, dan data dari table hasil search dibutuhkan untuk mendapatkan ID dari itemnya. Jadi ini langkah-langkah untuk harvest datanya:

    • Buka https://cekbpom.pom.go.id dan simpan cookie, ambil session_id php.
    • Request ke url untuk search https://cekbpom.pom.go.id/index.php/home/produk/ {PHP_SESSION_ID}/all/row/{ROW_PER_PAGE}/page/{PAGE_NUMBER}/order/4/DESC/search/{KATEGORI}/{KATA-KUNCI-PENCARIAN}
    • Parse response html-nya, ambil tiap urldetil dan request lagi ke
      https://cekbpom.pom.go.id/index.php/home/detil/{PHP_SESSION_ID}/produk/{URLDETIL}
    • Parse lagi response-nya untuk mendapatkan data detail.

    Cara paling gampang dan cepat yang terpikir oleh saya adalah dengan menggunakan PHP. Script yang saya gunakan bukan untuk dibuka oleh browser, tapi script php dipanggil lewat terminal php -f namafile.php [parameter]. Setelah beberapa kali mencoba, saya dapat draft kasarnya, beberapa parameter masih di hardcode dan hasil berupa json disimpan ke dalam satu file (klik READ MORE untuk source-code php-nya).

  • Komik,  Programming

    Metamorfosis

    Kutipan dari web KBBI:

    Tapi yang mau saya bahas di enrty blog ini bukan masalah biologi atau geologi. Ini tentang perubahan dari program koleksi komik (manga) saya. Yang sekarang bentuknya begini:

    Selain itu ada tambahan lagi juga, sekarang udah bikin versi mobile nya. Tapi versi mobile ini gak berdiri sendiri, tetep akses ke Web Reader lewat http.

    Versi mobile dibuat pake Cordova.

    Udah ah.

  • Memori,  Omong Kosong,  Programming,  Teknologi

    Ternyata…

    Alkisah, pada jaman dahulu kala, saya pernah kepikiran untuk bikin reporting server, dimana semua report yg direquest akan masuk ke daftar antrian dan akan di eksekusi sesuai prioritas. Di servernya akan ada daftar request dan statusnya. Data yang dihasilkan untuk setiap request report akan disimpan. Tiap report yg dicetak akan ada “signature” atau kode tertentu yang mengarah ke id request report. Itu sekitar tahun 2012.

    Tahun ini baru saya tau kalau ternyata udah ada yang bikin kaya gitu.

  • Komputer,  Programming

    [Copy] Need for Speed

    Dicopy dari blog saya yg di blog.sedjat1.dx.am

    Sesudah bikin blog, langkah selanjutnya adalah mendaftarkan blog ini untuk di index di search engine. Maka saya langsung meluncur ke dmoz.org. Tapi ternyata dmoz.org udah ditutup, yg ada tinggal mirrornya aja dan saya gak dapetin cara untuk nambahin blog saya dalam salah satu direktorinya.

    Akhirnya saya nyari direktori internet lain yg bisa nampung blog saya ini. Akhirnya saya dapet daftar dari “Free Web Directories” yg ternyata gak free2 amat. Saya penasaran memangnya apa sih yg bikin web direktori itu gak free, datanya sebesar apa yg dibutuhkan untuk data web direktori itu?

    Saya berburu data. Dengan bersenjatakan google, akhirnya saya dapet mangsa juga: Dataverse. Dapet data dmoz.org per 12 Juni 2016. Ada 3 file yg bisa didownload, dan yang saya proses duluan yg tab delimited csv.

    Sekilas lihat datanya, saya langsung bikin table di MySQL, 3 table, standar aja (id primary key autonumber) 1 table struktur folder, 1 table daftar domain, 1 table mapping domain dan folder. Table “directory” isinya ID, NamaFolder, Parent_ID. Table “domain” isinya ID, NamaDomain. Table “domain_map” isinya ID, Domain_ID, Folder_ID.

    Tab delimited file cuma ada 2 field, domain dan array of path yg nantinya akan dimapping ke table “directory”. Program dibuat menggunakan PHP (bukan yg dibuka pake browser, tapi yg di jalanin lewat command prompt). Awalnya program berjalan lancar, tanpa hambatan, cepat. Tapi lama2 makin kelihatan lambat. Karena dlm scriptnya saya selalu memeriksa keberadaan data sebelum di insert, maka akhirnya saya buat index yang sesuai untuk semua table.

    Program kelihatan lebih cepat jalannya, tapi itu gak bertahan lama, gejala melambat langsung terlihat. Akhirnya program saya ubah lagi, terutama dibagian akses database. Yg sebelumnya pake fungsi, akhirnya saya buat PDO prepared statement untuk tiap query, jadi pas looping data cukup memanggil method execute dengan parameter yang sesuai. Ada kemajuan kecepatan walaupun tidak signifikan.

    Saya sadar sebenarnya index mempercepat perintah select, tapi memperlambat perintah insert. Dan semakin datanya banyak tambah beban juga. Akhirnya saya memutuskan untuk memakai cache data berupa array. Data table saya load ke dalam array, jadi pengecekan data existing dan lookup id saya lakukan pada array tidak mengakses database sama sekali, akses database hanya dilakukan pada saat insert data. Ini membuat database tidak memerlukan index (selain primary key).

    Saat scriptnya dijalankan, error: out of memory. Saya lupa ngeset maksimum memorynya. Running kedua kali… Wussss… langsung terlihat perbedaannya. Memang startupnya lama karena memuat semua data ke array, tapi sesudah itu data dengan amat sangat lancar dibaca dan distore ke database.

    Jadi seperti yang pernah saya tulis di entry blog sebelumnya: Selalu cari jalan tercepat, jangan puas hanya dengan hasil yang benar.

    Update:

    Diujung (row ke 2.3jt dari 2.4jt), memory yang dibutuhin udah ngelewatin batesan yg saya tentuin (1.6GB). Karena keterbatasan sisa RAM yg saya punya (2GB), akhirnya saya pake metode hybrid, yg di load ke array adalah data yang paling banyak di select, yaitu data directory, sisanya tetap akses ke database (dengan index). Hasilnya walaupun gak secepet yg full array, masih lebih cepat dari pada full db.

    MySql Table Information

    Console View and Source Text

    Speed is everything, but I can’t bite off more than I can chew.