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:
- Aplikasi scraping website dengan Simplescraper yang dapat disimak cara instalasi dan penggunaannya di artikel ini.
- Bot Telegram berikut API Token, anda dapat menyimak cara membuatnya dan mendapatkan API Token pada artikel ini.
- Satu file Apps Script, anda bisa menyimak cara membuatnya dan deployment Web Apps di artikel ini.
- Script eksperimen ini yang dapat unduh atau salin dari repository.
- 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:
- Harga Emas Antam: https://www.logammulia.com/id/harga-emas-hari-ini
- Bursa Antam di Google Finance: https://www.google.com/finance/quote/ANTM:IDX
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 SimplescraperJSON 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:
SiLiKiDi
Komentar
Posting Komentar