Langsung ke konten utama

Scraping Data Emas Antam dan Google Finance

Web Scraping menjadi solusi alternatif ketika kita memerlukan data dari suatu website yang tidak menyediakan API.

BAHAN BAKU

Untuk mengimplementasikan eksperimen ini perlu dipersiapkan beberapa hal:

  1. Aplikasi scraping website dengan Simplescraper yang dapat disimak cara instalasi dan penggunaannya di artikel ini.
  2. Bot Telegram berikut API Token, anda dapat menyimak cara membuatnya dan mendapatkan API Token pada artikel ini.
  3. Satu file Apps Script, anda bisa menyimak cara membuatnya dan deployment Web Apps di artikel ini.
  4. Script eksperimen ini yang dapat unduh atau salin dari repository.
  5. ID User anda sebagai admin bot yang akan digunakan untuk menampung keterangan error bila terjadi kendala, gunakan @simrsinfobot untuk mengetahui ID User anda.

TARGET WEBSITE

Pada eksperimen ini kita akan mencoba mengambil data dari tampilan dua website:

APLIKASI SCRAPER

Terdapat aturan yang membatasi kemampuan Apps Script untuk melakukan scraping sehingga diperlukan aplikasi ketiga yang khusus menangani scraping website. Kedua website tersebut akan di-scraping dengan bantuan aplikasi Simplescraper.

Simplescraper memberikan layanan freemium yang berarti beberapa fitur membutuhkan akun premium seperti scheduler dan webhook. Oleh karena itu dalam eksperimen ini hanya menguji coba URL API namun tetap disediakan script untuk menangani webhook bilamana anda siap dengan fitur premiumnya.

video courtesy of Simplescraper

JSON HASIL SCRAPING

Hasil scraping oleh Simplescraper berbentuk JSON yang dapat diakses melalui URL API:

https://simplescraper.io/api/...

Untuk scraping website harga emas Antam hanya berfokus pada satu blok informasi tentang fluktuasi harga emas Antam. Sedangkan pada Google Finance akan dicoba beberapa elemen terpisah.

DATA HARGA EMAS ANTAM DALAM JSON


{
  "name": "ANTAM HARGA HARIAN",
  "url": "https://www.logammulia.com/id/harga-emas-hari-ini",
  "date_last_ran": "Sun Nov 07 2021 14:03:11 GMT+0000 (Coordinated Universal Time)",
  "date_last_ran_timestamp": 1636293791788,
  "data": [
    {
      "antamHargaHarian": "Harga Terakhir                    Rp946.000,00                Perubahan            Rp0.00                Perubahan Terakhir        07 Nov 2021 08:30:00",
      "index": 1,
      "timestamp": 1636293791399,
      "uid": "kBytXnTBtfnKa7yia5EE",
      "url": "https://www.logammulia.com/id/harga-emas-hari-ini",
      "url_uid": 1
    }
  ]
}

Dari struktur JSON hasil scraping di atas dapatlah kita ketahui letak data yang dibutuhkan berada di properti data yang berbentuk array sehingga notasi penulisannya data[0].antamHargaHarian

Nilai dari properti antamHargaHarian terdiri dari gabungan string, sehingga kita harus memisahkannya dan langsung diformat sebagai object:


let antamFetch = JSON.parse( UrlFetchApp.fetch( urlScraperHarga ) );
let antamJSON = antamFetch.data[0].antamHargaHarian;
let antamJSONSplit = antamJSON.replace(/ \s+/g, "#").trim().split( "#" );

for ( let i = 0; i < antamJSONSplit.length; i++ ) {
  if ( i % 2 === 1 ) {
    antamData[ antamJSONSplit[ i-1 ] ] = antamJSONSplit[ i ].replace( /rp/i, 'Rp ');
  }
}

antamData["Perubahan Terakhir"] = new Date( antamData["Perubahan Terakhir"] );
antamData["url"] = urlHarga;

DATA BURSA ANTAM DALAM JSON


{
  "name": "ANTAM BURSA HARIAN",
  "url": "https://www.google.com/finance/quote/ANTM:IDX",
  "date_last_ran": "Sun Nov 07 2021 22:17:23 GMT+0000 (Coordinated Universal Time)",
  "date_last_ran_timestamp": 1636323443202,
  "data": [
    {
      "closeCurrent": "Rp 2,360.00",
      "closePrevious": "Rp2,380.00",
      "code": "ANTM • IDX",
      "company": "Aneka Tambang Tbk PT",
      "date": "Nov 5, 3:20:03 PM GMT+7 · IDR · IDX · Disclaimer",
      "date_link": "https://www.google.com/intl/en-US_US/googlefinance/disclaimer/",
      "index": 1,
      "percent": "0.84%",
      "point": "-20.00 Today",
      "timestamp": 1636323442813,
      "uid": "Ph54IauxCvl2SRauh7uj",
      "url": "https://www.google.com/finance/quote/ANTM:IDX",
      "url_uid": 1
    }
  ]
}

Tidak berbeda dengan sebelumnya, posisi data yang dibutuhkan masih berada di dalam properti data, sehingga untuk mendapatkannya gunakan notasi data[0].closeCurrent seperti tampak berikut:


//URL API Simplescraper
const urlScraperBursa = "https://simplescraper.io/api/iYHBz8RdpnSnERt6ktip?apikey=U4jsHhkuAagO2qR5R5zhzUM1nvFzpCat&limit=100";

let antamFetch = UrlFetchApp.fetch( urlScraperBursa );
let antamParse = JSON.parse( antamFetch );
let antamJSON = antamParse.data[0];

antamData["code"] = antamJSON.code + "\n";
antamData["company"] = antamJSON.company + "\n";
antamData["closeCurrent"] = "Penutupan: " + "Rp " + antamJSON.closeCurrent.split( "Rp" ).pop().trim() + "\n";
antamData["closePrevious"] = "Sebelumnya: " + "Rp " + antamJSON.closePrevious.split( "Rp" ).pop().trim() + "\n";
antamData["point"] = antamJSON.point !== "" ? antamJSON.point.split( " " ).shift().trim() + " (" + antamJSON.percent + ")" + "\n": "";
antamData["date"] = "Update: " + new Date( antamJSON.date.split( "·" ).shift().trim() ) + "\n";
antamData["url"] = urlBursa;

MENGOLAH DATA KIRIMAN SIMPLESCRAPER

Setelah berhasil mendapatkan data dari JSON dan ditampung dalam sebuah object antamData, selanjutnya anda bisa mengolahnya untuk kebutuhan apapun seperti menyimpannya ke Google Sheets atau mengirimkannya ke Telegram:


let pesan = "" + "INFO BURSA ANTAM" + "" + "\n" + "\n";

for ( let [key, value] of Object.entries( antamData ) ) {
   pesan += value + "\n";
}

let dataPesan = {
    method: "post",
    payload: {
      method: "sendMessage",
      parse_mode: "HTML",
      disable_web_page_preview: "false",
      chat_id: String( data.message.chat.id ),
      text: pesan
    }
};
UrlFetchApp.fetch(telegramAPIURL + "/", dataPesan); 

DEMO SCRAPER BOT TELEGRAM

DEMO BOT: @simrsscraperbot

FINAL SCRIPT

Final Script dapat diunduh di repository. Perlu diingat Final Script ini hanya mengeksekusi manual URl API Simplescraper dengan rentang update 24 jam. Untuk mendapatkan push realtime via webhook dan schedule anda perlu berlangganan premium.

Hasil respon akan membutuhkan waktu seiring diaktifkannya parameter run_now di URL API Simplescraper SiLiKiDi
Dapatkan skrip semua materi di repository

Dukung donasi agar tutorial ini tetap operasional:
Trakteer Saya SiLiKiDi

Komentar

Postingan populer dari blog ini

Mengirim File Google Drive ke Telegram

Pada eksperimen kali ini anda akan diajak untuk mencoba mengirimkan file yang ada di Google Drive ke chat Telegram menggunakan perantaraan Apps Script.