Kali ini saya akan membagikan sebuah code script nodejs yang berfungsi untuk melakukan scrapping link sitemap melalui permintaan request Rest Api menggunakan node js. Sebagai contoh. coba kamu kunjungi link Rest Api berikut :


https://api-sitemap.maskoding.com//?url=https://www.maskoding.com/sitemap.xml


Jika kamu kunjungi link di atas, maka akan menghasilkan output data json seperti jumlah url, daftar list seluruh url dari target link sitemap dan lain-lain. Data output ini dapat kamu gunakan untuk keperluan project kamu.

Cara Membuat Rest Api Untuk Melakukan Scrapping Sitemap Menggunakan NodeJs


Link url yang saya tulis warna putih di atas adalah link Rest Api yang saya desain menggunakan nodejs dan saya jalankan di  sisi server. Link Rest Api ini hanya menerima url sitemap (link warna merah). Jika kamu masukkan link selain link sitemap, maka kmu akan menerima response "Link Sitemap Error".

Script ini sebenarnya adalah script yang sebelumnya telah saya share pada artikel Cara Scrapping Sitemap Menggunakan Node Js dan Menyimpannya Dalam Bentuk File. Akan tetapi, pada artikel ini, saya sedikit merombak script ini agar dapat kita akses dalam bentuk url Rest Api. Berikut ini penampakannya :

/*
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...
*/

var http = require('http');
var unirest = require('unirest');
var random_useragent = require('random-useragent');
var fs = require('fs');
const isUrl = require("is-valid-http-url");
//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;
};
http.createServer(function (req, res) {
    if (req.url.split("/?url=")[1] == undefined == false && isUrl(req.url.split("/?url=")[1]) == true && req.url.split("/?url=")[1].indexOf(".xml") >= 0 && req.method === "GET") {
        //-------------------------------------------------------------------------------------------------------
        //---- Setting target sitemap
        var Link_Sitemap = req.url.split("/?url=")[1].match(/.*?(.xml)/g)[0];
        var Remove_Duplicate_Link = "no";
        //---------------------------
        var DataRegex = new Array();
        var dataNewSitemap = new Array();
        var startLinkSitemap = 0;
        var newDataUrlSitemap = "";
        // start ---------
        unirest('GET', Link_Sitemap)
            .headers({
                'user-agent': random_useragent.getRandom()
            })
            .end(function (resku) {
                // Mengekstrak Link Sitemap
                let getRegex = resku.raw_body.match(/<loc>.*?(<\/loc>)/g);
                if (getRegex == null) {
                    res.end('Link Sitemap Error')
                } else {
                    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) {
                        for (var i = 0; i < DataRegex.length; i++) {
                            newDataUrlSitemap += DataRegex[i] + ",";
                        };
                        dataNewSitemap = [];
                        saveFile();
                    } else {
                        nextExtracSubSitemap();
                    };
                };
            });

        function nextExtracSubSitemap() {
            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);
                        if (getRegex1 == null == false) {
                            for (var i = 0; i < getRegex1.length; i++) {
                                newDataUrlSitemap += getRegex1[i].replace(/(<loc>|<\/loc>)/g, "").replace(/(<\!\[CDATA\[|\]\]\>)/g, "") + ",";

                            };
                        };
                        startLinkSitemap += 1;
                        nextExtracSubSitemap()
                    } else if (startLinkSitemap == dataNewSitemap.length - 1) {
                        let getRegex2 = res.raw_body.match(/<loc>.*?(<\/loc>)/g);
                        if (getRegex2 == null == false) {
                            for (var i = 0; i < getRegex2.length; i++) {
                                newDataUrlSitemap += getRegex2[i].replace(/(<loc>|<\/loc>)/g, "").replace(/(<\!\[CDATA\[|\]\]\>)/g, "") + ",";

                            };
                        };
                        saveFile();
                    }
                });
        }

        function saveFile() {
            if (Remove_Duplicate_Link == "yes") {
                var DbFile = Array.from(new Set(cleanArray(newDataUrlSitemap.split(",")))).toString().split(",").join("\n");
            } else {
                var DbFile = cleanArray(newDataUrlSitemap.split(",")).join("\n");
            };
            res.end(JSON.stringify({
                dataSitemap: dataNewSitemap.join("\n"),
                lengthUrl: DbFile.split("\n").length,
                dataUrl: DbFile
            }));
            DataRegex = [];
            dataNewSitemap = [];
            startLinkSitemap = 0;
            newDataUrlSitemap = "";
        };
        //-------------------------------------------------------------------------------------------------------
    } else {
        res.end('Link Sitemap Error');
    };
}).listen(process.env.PORT || 1202);


Panduan Pemasangan

1. Silahkan buat sebuah file bernama "server.js".

2. Isi file "server.js" yang telah kamu buat dengan code script di atas.

3. Instal ke tiga package di berikut ini.

npm install unirest

npm install random-useragent

npm install is-valid-http-url

4. Lalu eksekusi dengan code berikut :

node server.js

5. Silahkan buka browser kamu lalu jalankan url berkut :

http://localhost:1202/?url=https://www.maskoding.com/sitemap.xml

6. Silahkan ganti teks yang berwarna merah dengan url sitemap yang ingin kamu scrapt.

Jika kamu ingin ber-experiment menggunakan nodejs di sisi server secara online, silahkan buat project ujicoba di situs GLITCH.COM.

Jika ada kendala dalam pemakaian, silahan tanyakan di kolom komentar di bawah.

Post a Comment

Lebih baru Lebih lama

Baca Artikel Lainnya