NodeJs

Cara Mudah Scraping Web Content dengan NodeJs

Hallo..

Beberapa waktu lalu saya lagi belajar scraping konten web. Awalnya saya mencoba dengan bahasa pemrograman PHP. Saya pernah mencoba library http://simplehtmldom.sourceforge.net/. Dilihat dari cara penggunaan memang mudah, saya mencoba scraping halaman web sederhana memang cukup mudah. Tetapi ketika scraping halaman web yang html codenya sangat banyak dan kompleks terasa sangat berat sekali.. sangat sering laptop saya ngeblank dan  harus di shutdown secara paksa karena nggak kuat extract html dom dengan library ini.

Masih di pemrograman PHP saya mencoba library http://php.net/manual/en/simplexmlelement.xpath.php . Secara performa cukup ringan jika dibandingkan dengan simple dom html (tetapi tetep kurang cepet). Akan tetapi menurut saya kurang mudah dalam penggunaan.. saya sering stag dalam mengambil konten dengan struktur2 tag yang kompleks. Terutama pada saat mendefinisikan path dari konten yang mau diambil.. Sempet bahagia ketika di firebug bisa ngambil xpath nya.. tetapi pasrah juga ketika xpath tersebut tidak bisa jalan untuk ngambil konten yang dimaksud. hahaha :((

Akhirnya.. gugling tentang dunia perskrepan banyak yang nyaranin pake NodeJs atau Python. Nyoba Python bentar.. tetapi takut mentog juga krn belum pernah belajar python programming ūüėź . Kemudian nyoba NodeJs dan ternyata ada library yang bagiku mudah banget utk di pake.. Ya namanya adalah Cheerio. Dengan libray ini kita dapat mengambil konten website layaknya kita menggunakan JQuery.. krn bisa nembak langsung dengan css selector. Krn aku lumayan sering pake JQuery jdi terasa enak banget menggunakan library ini :))

Jadi.. kali ini aku akan share scraping web sederhana menggunakan node js. Case-nya adalah seperti berikut:

  1. Saya memiliki url (single page) untk di scrap. Dalam contoh ini saya akan mengambil informasi produk dari lazada.
  2. Informasi produk tersebut saya scrap kemudian saya simpan di database MySQL yang saya buat untuk  menampung hasil skrepan.

Langkah-Langkahnya adalah:

Pertama,

Buat database dengan nama scraperdb, kemudian buat tabel products seperti berikut:

CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`original_url` text,
`sku` varchar(255) NOT NULL,
`name` varchar(255) NOT NULL,
`price` decimal(10,0) NOT NULL,
`sale_price` decimal(10,0) DEFAULT '0',
`details` text,
`description` text,
`categories` varchar(255) DEFAULT NULL,
`brand` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `sku` (`sku`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

 

Kedua, (saya asumsikan terinstall nodejs di komputer Anda , tutorial : https://www.digitalocean.com/community/tutorials/how-to-install-node-js-on-an-ubuntu-14-04-server)

Buat folder project dengan nama simple-scraper , kemudian buat file dengan nama package.json di dalam folder tersebut. Buka file package.json dan tambahkan baris kode berikut:

{
"name"         : "simple-scraper",
"version"      : "0.0.1",
"description"  : "Scrap Web Content with NodeJs",
"main"         : "main.js",
"author"       : "Sugiarto",
"dependencies" : {
"express"    : "latest",
"request"    : "latest",
"cheerio"    : "latest",
"mysql"      : "latest",
"line-reader" : "latest",
"html-to-text" : "latest"
}
}

 

Ketiga,

Buka terminal / command prompt , masuk ke folder project simple-scraper dan ketikan perintah berikut kemudian tekan enter:

 npm install

Perintah di atas akan menginstall library-library nodejs yang telah di definisikan pada file package.json

 

Keempat,

Saatnya koding untuk scraping konten dari url website yang kita inginkan. Dalam contoh ini saya akan mengambil konten dari produk di lazada. Buat file dengan nama lazada.js kemudian tambahkan kode program berikut di dalamnya.

var request = require('request');
var cheerio = require('cheerio');
var mysql = require('mysql');
var htmlToText = require('html-to-text');

var con = mysql.createConnection({
host        : "localhost",
user        : "root",
password    : "root",
database    : "scraperdb"
});

con.connect(function(err){
if(err){
console.log('Error connecting to Db');
return;
}
console.log('Connection established');
});

var url_site = 'http://www.lazada.co.id/lenovo-vibe-k4-note-55-16-gb-hitam-gratisvrglasses-tambahangaransi-7307062.html';

request(url_site, function(error, response, body) {
if(error) {
console.log("Error: " + error);
}
console.log("URL: " + url_site);
console.log("Status code: " + response.statusCode);

var $ = cheerio.load(body);

var product_sku = $('#pdtsku').text().trim();

var product_name = $('#prod_title').text().trim();

var price = 0;
var sale_price = 0;
var percent_off = 0;

if ($('#special_price_area').length > 0 && $('#special_price_area').hasClass('hidden') == false){
price = parseFloat($('.price_erase #price_box').text().replace(/\D/g,'')).toFixed(2);
sale_price = parseFloat($('#special_price_box').attr('content')).toFixed(2);
}else{
price = parseFloat($('#special_price_box').attr('content')).toFixed(2);
}

var description = htmlToText.fromString($('#productDetails').html());

var product_details = $('.product-description__block:nth-child(2)').html();

var categories = [];
$('.breadcrumb__list').find('a').each(function() {
categories.push($(this).text().trim());
});

var category_tree = categories.join(" > ");

var brand = $('#prod_brand .prod_header_brand_action:nth-child(1) a').text().trim();

console.log("Sku : " + product_sku);
console.log("name : " + product_name);
console.log("Price : " + price);
console.log("Sale Price : " + sale_price);
console.log("Product Details : " + product_details);
console.log("Description : " + description);
console.log("Categories : " + category_tree);
console.log("Brand : " + brand);

var query_sql = "INSERT INTO products (original_url,sku,name,price,sale_price,details,description,categories,brand) VALUES('" + url_site + "','" + product_sku + "','" + product_name + "','" + price + "','" + sale_price + "','" + product_details + "','" + description + "','" + categories + "','" + brand + "')";
con.query(query_sql);

process.exit();
});

 

Kemudian jalankan script tersebut dengan perintah :

node lazada.js

Hasilnyaa,,,!!

scrap-lazada

Jika tidak ada masalah, maka informasi produk dari url yang telah di definisikan di atas akan tersimpan secara otomatis ke tabel products di database MySQL Anda. Mudah bukan? selamat mencoba :))

Source code ada di https://github.com/gieart87/simple-scraper