Cara Scrapping Sitemap Menggunakan Node Js dan Menyimpannya Dalam Bentuk File

Kali ini saya akan membagikan sebuah project untuk melakukan Scrapping Sitemap dari url Menggunakan Node Js dan Menyimpannya Dalam Bentuk File. Disini saya menggunakan 3 modul Package yaitu :

  1. Package "unirest" yang berfungsi untuk mengambil DOM Html dari link url sitemap target.
  2. Package "random-useragent" yang berfungsi agar request permintaan http menjadi unik.
  3. Package "fs" yang berfungsi untuk membuat file dan mengisi file tersebut dengan data url yang telah di scrapping.
Disini saya memiliki sebuah file bernama 'server.js'. File 'server.js' ini nantinya yang akan kita jalankan di Node Js. Di dalam file 'server.js' ini berisi code sebagai berikut :


/*
Design By : Abdi Syahputra Harahap
Website : www.maskoding.com
whatsappp : 0838 1174 6714

Pesan : Jika kamu butuh script node js lainnya, silahkan hubungi saya. Enjoy codinger....hehe...
*/


//---- Setting target sitemap
Link_Sitemap = 'https://www.tribunnews.com/sitemap.xml';
Remove_Duplicate_Link = "no";
//---------------------------

var unirest = require('unirest');
var random_useragent = require('random-useragent');
var fs = require('fs');
var DataRegex = new Array();
var dataNewSitemap = new Array();
var startLinkSitemap = 0;
var newDataUrlSitemap = "";

//Fungsi Extract Hostname From String
function extractHostname(t) {
    return (t.indexOf("//") > -1 ? t.split("/")[2] : t.split("/")[0]).split(":")[0].split("?")[0]
};

//Fungsi Menghapus String Array Kosong
// Referensi : https://www.maskoding.com/2020/08/menghapus-string-array-kosong.html
function cleanArray(actual) {
    var newArray = new Array();
    for (var i = 0; i < actual.length; i++) {
        if (actual[i]) {
            newArray.push(actual[i]);
        }
    }
    return newArray;
};

// start ---------
unirest('GET', Link_Sitemap)
    .headers({
        'user-agent': random_useragent.getRandom()
    })
    .end(function (res) {
        // Mengekstrak Link Sitemap
        let getRegex = res.raw_body.match(/<loc>.*?(<\/loc>)/g);
        for (var i = 0; i < getRegex.length; i++) {
            DataRegex[i] = getRegex[i].replace(/(<loc>|<\/loc>)/g, "").replace(/(<\!\[CDATA\[|\]\]\>)/g, "");
            if (getRegex[i].indexOf(".xml") >= 0) {
                dataNewSitemap[i] = DataRegex[i];
            };
        };
        //Mendeteksi Apakah masih ada link sitemap
        if (dataNewSitemap.length == 0) {
            console.log("Tidak Ditemukan Link Sitemap di dalam url " + Link_Sitemap);
            setTimeout(function () {
                console.log("Mengekstrak Link di dalam url " + Link_Sitemap + " >>");
            }, 1000);
            setTimeout(function () {
                console.log(DataRegex.join("\n"));
                for (var i = 0; i < DataRegex.length; i++) {
                    newDataUrlSitemap += DataRegex[i] + ",";

                };
                saveFile();
            }, 4000);
        } else {
            console.log("Ditemukan " + dataNewSitemap.length + " Link Sitemap");
            setTimeout(function () {
                console.log("Mengekstrak Sub-Link Sitemap....")
            }, 1000);
            setTimeout(function () {
                nextExtracSubSitemap();
            }, 2000);
        };

    });

function nextExtracSubSitemap() {
    console.log("Mengekstrak link sitemap > " + dataNewSitemap[startLinkSitemap] + " ( " + Number(startLinkSitemap + 1) + "/" + dataNewSitemap.length + " )");
    unirest('GET', dataNewSitemap[startLinkSitemap])
        .headers({
            'user-agent': random_useragent.getRandom()
        })
        .end(function (res) {
            // Mengekstrak Sub-Link Sitemap
            if (startLinkSitemap < dataNewSitemap.length - 1) {
                let getRegex1 = res.raw_body.match(/<loc>.*?(<\/loc>)/g);
                for (var i = 0; i < getRegex1.length; i++) {
                    newDataUrlSitemap += getRegex1[i].replace(/(<loc>|<\/loc>)/g, "").replace(/(<\!\[CDATA\[|\]\]\>)/g, "") + ",";

                };
                console.log("Succes Mengekstrak " + cleanArray(newDataUrlSitemap.split(",")).length + " Link");
                startLinkSitemap += 1;
                nextExtracSubSitemap()
            } else if (startLinkSitemap == dataNewSitemap.length - 1) {
                console.log("Menampilkan Hasil Extract Url Sitemap..");
                setTimeout(function () {
                    if (Remove_Duplicate_Link == "yes") {
                        console.log(Array.from(new Set(newDataUrlSitemap.split(","))).toString().split(",").join("\n"));
                    } else {
                        console.log(cleanArray(newDataUrlSitemap.split(",")).join("\n"));
                    }
                    setTimeout(function () {
                        saveFile();
                    }, 1000);
                }, 2000);
            }
        });
}

function saveFile() {
    console.log("Membuat File Dengan Nama : " + extractHostname(Link_Sitemap) + ".txt");
    if (Remove_Duplicate_Link == "yes") {
        var DbFile = Array.from(new Set(cleanArray(newDataUrlSitemap.split(",")))).toString().split(",").join("\n");
        console.log("Membersihkan Link Duplicate / Link yang sama >_");
    } else {
        var DbFile = cleanArray(newDataUrlSitemap.split(",")).join("\n");
    };
    setTimeout(function () {
        console.log("Menyimpan File >_")
        var stream = fs.createWriteStream("OUTPUT/" + extractHostname(Link_Sitemap) + ".txt");
        stream.once('open', function (fd) {
            stream.write(DbFile);
            setTimeout(function () {
                console.log("suscces..");
            }, 1000);
            stream.end();
        });
    }, 1000);
};


Saya telah melakukan ujicoba terhadap script ini, dimana saya telah melakukan scrapping terhadap web tribunews dengan link sitemap (https://www.tribunnews.com/sitemap.xml). Berikut ini penampakannya :


Script ini akan melakukan scrapping secara otomatis. Jika ternyata di dalam url sitemap induk masih terdapat url sitemap anak (Sub Link Sitemap), maka sub-link sitemap ini juga akan di scrapt.. Ketika semua link sitemap telah selesai di scrapping, maka data seluruh url akan disimpan kedalam sebuah file. Nama file yang disimpan akan secara otomatis dibuat berdasarkan nama hostname dari url yang kita scrapping.

Misalnya , jika kita melakukan scrapping terhadap url  https://www.tribunnews.com/sitemap.xml, maka nama file akan menjadi www.tribunnews.com.txt (Penambahan ".txt" secara otomatis).





Untuk melihat isi filenya sebaiknya gunakan aplikasi "Sublime Text" agar list urlnya tidak menyatu. Jangan buka di "notepad" karena isinya akan seperti berikut :


Jika kamu buka dengan "Sublime Text" maka akan terlihat seperti berikut :




Panduan Pemakaian

1. Buat file bernama "server.js" di dalam sebuah folder.
2. Lalu isi file "server.js" ini dengan code script di atas.
3. Buat juga folder bernama "OUTPUT". Folder ini digunakan sebagai tempat file hasil scrapping.
4. Selanjutnya install 2 jenis package berikut :

- Package 'unirest'.


npm install unirest


- Package 'random-useragent'.

npm install random-useragent


5. Lalu cari kode berikut ini di dalam file "server.js" :

Link_Sitemap = 'https://www.tribunnews.com/sitemap.xml';
Remove_Duplicate_Link = "no";

Ket :
  • Silahkan ganti "Link_Sitemap" dengan dengan link url sitemap yang ingin kamu scrap isinya.
  • "Remove_Duplicate_Link" berfungsi untuk menghapus link yang sama. Maksudnya jika terdapat link duplicate di dalam file hasil scrapping, maka url duplicate tersebut akan dihapus dan menyisakan 1 link url asli. Jika kamu setting "no" maka link duplicate tidak akan dihapus. Jika kamu setting "yes" maka link duplicate akan di hapus.

6. Selanjutnya silahkan eksekusi file "server.js" yang tadi kamu buat dengan code berikut :

node server.js


7. Tunggu sampai proses scrapping selesai.
8. Jika sudah selesai. Silahkan buka folder "OUTPUT" dan lihat isi filenya menggunakan aplikasi "Sublime Text" agar isinya tertata rapi.
9. Selesai.


Jika kamu memiliki kendala saat menggunakannya, silahkan berkomentar di bawah.