Pada modul ini kita akan membuat scrapper sederhana, mengambil informasi nama, profile picture, dan statistik seperti follower dan following dari instagram.
Perlu diketahui, ada kemungkinan code tidak berjalan saat Anda gunakan karena ada perubahan web oleh instagram.
Tools online yang berguna untuk tutorial ini adalah: (Anda bisa menggunakan yang lain)
- Regular Expression Editor : https://regexr.com/
- JSON Validator: https://jsonlint.com/
Persiapan
Sebelum memulai coding, ada baiknya kita cari cara terbaik untuk mendapatkan data dari instagram. Silakan menggunakan user profile siapa saja, pada contoh disini digunakan Profile Sandra Dewi dengan alamat https://www.instagram.com/sandradewi88/
Pendekatan pertama, dengan menggunakan developer tools (click kanan pada halaman web, pilih menu developer tools). Dapat disimpulkan, pendekatan ini sulit untuk mendapatkan data yang kita inginkan. Karena isi halaman di render menggunakan react.js, kita dapat lihat element html menggunakan random class. (lihat gambar dibawah).

Pendekatan kedua, dengan melihat page source (click kanan, pilih view page source). Disini kita melihat isi halaman sebelum di-render. Yang akan dicari adalah data json yang digunakan untuk me-render halaman profile instagram. (Lihat gambar dibawah).
Pada saat tutorial ini dibuat adalah isi JSON object di tag script ke 4. Dengan nama object window._sharedData.

Setelah JSON diperoleh, kita perlu pastikan object ini valid. Dapat gunakan online json validator. Pada tutorial digunakan jsonlint.com. Copy isi JSON, dan paste, lalu tekan tobol validate JSON. JIka valid, maka akan tertulis Valid JSON.
Step ini dapat dilewati jika Anda sudah yakin bahwa ini adalah object JSON yang valid.

Coding
Setelah kita dapatkan data JSON diatas, pahami dulu isi datanya. Kita akan cari data Profile Picture, dan data statistik Follower. Data ini ada dalam hirarki object : entry_data – ProfilePage – graphql – user
const req1 = require ('request-promise');
const cheerio = require ('cheerio');
(async () => {
const USRNM = 'sandradewi88';
const HOMEURL = `https://instagram.com/${USRNM}`;
let resp1 = await req1(HOMEURL);
let $ = cheerio.load(resp1);
let script = $('script[type="text/javascript"]').eq(3).html();
let script_re = /window._sharedData = (.+);/g.exec(script);
let {entry_data: {ProfilePage : {[0] : {graphql : {user}}}}} = JSON.parse(script_re[1]);
let insta_data ={
followers : user.edge_followed_by.count,
following : user.edge_follow.count,
fullName : user.full_name,
profile_pict : user.profile_pic_url_hd
}
console.log(insta_data);
})()
Pembahasan Code
Load library yang digunakan, yaitu request-promise dan cheerio.
const req1 = require ('request-promise');
const cheerio = require ('cheerio');
Untuk kemudahan, kita gunakan const untuk menyimpan data user dan alamat dari home url instagram.
const USRNM = 'sandradewi88';
const HOMEURL = `https://instagram.com/${USRNM}`;
Lakukan request dengan alamat HOMEURL. Hasil response kita parse menggunakan cheerio.
let resp1 = await req1(HOMEURL); let $ = cheerio.load(resp1);
Ambil script tag yang berisi object JSON. Seperti sudah dibahas diatas, script tag yang akan kita ambil adalah yang ke-empat (index ke-3 di javascript).
let script = $('script[type="text/javascript"]').eq(3).html();
Ambil isi data JSON dengan menggunakan regex. Ini adalah salah satu cara, Anda dapat lakukan dengan cara lain. Dan untuk penulisan regex juga bisa berbeda, yang penting tujuannya adalah mengambil data JSON.
let script_re = /window._sharedData = (.+);/g.exec(script);
Selanjutnya, agar kita bisa akses data profile name, profile picture dan lainnya dengan mudah, kita dapat lakukan destructuring object. Silakan lihat dokumentasi ES6 destructuring object.
let {entry_data: {ProfilePage : {[0] : {graphql : {user}}}}} = JSON.parse(script_re[1]);
Setelah destructuring, kita dapat akses data dari object user
let insta_data ={
followers : user.edge_followed_by.count,
following : user.edge_follow.count,
fullName : user.full_name,
profile_pict : user.profile_pic_url_hd
}
console.log(insta_data);
{ followers: 16660078,
following: 458,
fullName: 'Sandra Dewi',
profile_pict:
'https://instagram.fcgk6-1.fna.fbcdn.net/v/t51.2885-19/s320x320/15538908_681869018640519_7583036615337967616_a.jpg?_nc_ht=instagram.fcgk6-1.fna.fbcdn.net&_nc_ohc=s7k3pPafL6YAX-viu4h&oh=752eb221e6f18e942e1bb4fec1866e02&oe=5ECD42D5' }