Mengenal dan Belajar Web Scraping dengan C#

In Programming 364 views

Apa Itu Web Scraping?

Secara singkat web scraping adalah kegiatan penggalian data secara spesifik dari sebuah situs di internet yang umumnya memiliki tipe HTML atau XHTML. Biasanya teknik scraping diimplementasikan pada sebuah program atau bot agar bisa membuat proses yang seharusnya dilakukan secara manual menjadi otomatis.

Ketika kita menjumpai sebuah situs yang membatasi kuota API (Application Programming Interface) atau bahkan tidak menyediakan sama sekali, maka web scraping akan sangat dibutuhkan sebagai langkah pengambilan data.

 

Manfaat Web Scraping

Pasar semakin haus dengan data, dan kita semua pasti mengerti tentang kekuatan sebuah data. Jika Anda seorang jurnalis atau bahkan pegiat e-commerce tentu Anda membutuhkan banyak data yang berorientasi pada wawasan agar sampai pada keputusan yang kemudian bisa ditindaklanjuti. Maka salah satu jalan untuk mengekstrak data dalam jumlah besar adalah web scraping.

Mengingat teknik ini merupakan penggalian informasi secara semi-terstruktur, maka kita bisa lebih spesifik menentukan data seperti apa yang ingin diambil; alamat email, gender, nomor telepon, tempat tinggal, dan lain sebagainya tergantung kebutuhan.

 

Contoh Implementasi Nyata

Kita mengenal mesin pencari seperti Google, Bing, AOL. Mereka mempunyai komponen yang bertugas untuk merayapi situs-situs secara berkala dan masif

Data yang terambil kemudian dipadukan dengan algoritma masing-masing untuk menentukan peringkat sebuah situs pada halaman pencarian.

 

Membuat Web Scraper dengan C#

Sebut saja kita memiliki tugas membuat web scraper yang bisa mengambil persamaan kata dari web kamuslengkap.com. Kita membuat program yang memungkinkan user untuk memasukan sebuah kata ke aplikasi, kemudian aplikasi akan mencari sinonim dari kata tersebut. Maka yang perlu kita lakukan adalah:

  1. Menentukan request URL dan mengambil seluruh html dari kamuslengkap.com.
  2. Melakukan HTML Parsing untuk menguraikan Document Object Model (DOM).
  3. Mengambil data secara spesifik, dalam hal ini adalah sinonim yang ditampilkan.
  4. Menampilkan sinonim untuk user.

Hanya untuk menyederhanakan tugas, kita memerlukan library untuk melakukan DOM parsing.

Meskipun banyak .NET library yang berkompeten, namun dalam hal ini saya lebih memilih AngleSharp karena mampu menghasilkan representasi HTML5 DOM dengan sangat baik.

 

Membuat Project dan Install Library

Buka Visual Studio kemudian tekan Control+Shift+N untuk membuat project baru.

Kita namai project, misalnya “CariSinonim” dan untuk target .NET Framework saya memilih .NET Framework 4.5 karena sudah mendukung asynchronous operation.

Membuat project baru menggunakan Visual Studio

 

Setelah project berhasil dibuat, klik kanan pada node References → Manage Nuget Packages. Pada tab Browse, cari AngleSharp kemudian klik tombol Install. Tunggu sampai proses instalasi selesai.

Menginstall AngleSharp melalui Nuget Package Manager

 

Menentukan Request URL dan Query Selector

Karena kita ingin mencari sinonim dari kata yang ditentukan user, dalam konteks ini format request URL adalah sebagai berikut (nanti kita akan mengganti {kata} dengan kata yang ditentukan oleh user).

https://kamuslengkap.com/kamus/sinonim/arti-kata/{kata}

Alasan lain kenapa saya memilih AngleSharp adalah karena tersedianya dukungan standard DOM parsing yang mampu bekerja untuk tree traversal sehingga kita bisa mendapatkan data hanya dengan menentukan query selector.

Untuk mencari query selector, buka salah satu URL kamuslengkap.com yang memiliki data sinonim melalui browser (saya menggunakan Firefox). Sebagai contoh, https://kamuslengkap.com/kamus/sinonim/arti-kata/pemasok

Fokuskan kursor pada salah satu sinonim yang muncul, klik kanan → Inspect Element → Copy → CSS Selector. Sampai disini kita sudah bisa mendapatkan query selector untuk sinonim yang kita harapkan.

Mencari CSS selector untuk elemen sinonim

 

By the way, Anda bisa belajar mengenai query selector lebih detail disini. Oke, dari DOM tree yang terlihat, query selector yang memiliki data sinonim adalah: .table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2)

 

Membuat Object WebClient

Disini kita akan membuat custom WebClient class yang bisa decompress Gzip response secara otomatis (saya beri nama WebClientEx) agar web scraper kita mendapatkan response yang tidak cacat pada website modern.

Meskipun HttpWebRequest class mendukung Gzip dan deflate, namun WebClient tidak mengekspos properti tersebut secara langsung. Maka kita harus menimpa method GetWebRequest.

WebClient class terdapat pada namespace System.Net, jadi jangan lupa untuk menuliskan using directive – using System.Net.

using System;
using System.Net;

namespace CariSinonim
{
    public class WebClientEx : WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            if (!(base.GetWebRequest(address) is HttpWebRequest request))
                return base.GetWebRequest(address);

            request.AutomaticDecompression = 
                DecompressionMethods.Deflate | DecompressionMethods.GZip;

            return request;
        }
    }
}

Kembali ke class Program.cs, selanjutnya kita buat method yang mengembalikan object WebClientEx baru. Didalam method ini kita juga akan mengimplementasikan request header pada object WebClientEx.

private static WebClient CreateClient()
{
    var client = new WebClientEx();
    client.Headers.Add("Accept", 
    "text/html,application/xhtml+xml,application/xml,application/json");
    client.Headers.Add("Accept-Encoding", "gzip, deflate");
    client.Headers.Add("User-Agent", 
    "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0");

    return client;
}

Sebenarnya Anda bisa menggunakan komponen lain seperti HttpClient yang tersedia sejak .NET Framework 4.5. Namun banyak artikel yang mengklaim bahwa HttpClient seharusnya menjadi reusable component. Alasan ini yang menyebabkan kenapa HttpClient kurang cocok untuk web scraping.

Alasan lain, pada tahapan yang lebih lanjut, mugkin kita memerlukan proxy. Sedangkan untuk mengimplementasikan proxy pada HttpClient, Anda harus membuat object HttpClientHandler yang di initialize melalui konstruktor.

Artinya setiap ingin mengganti proxy, Anda harus membuat object HttpClient baru. Topik ini akan kami bahas lebih lanjut pada artikel belajar web scraping selanjutnya 🙂

 

Memulai Web Scraping

Sebelumnya, deklarasikan variable konstan yang berisi query selector dan base Request URL (yang sudah kita dapatkan sebelumnya).

private const string Selector = ".table > tbody:nth-child(1) > tr:nth-child(2) > td:nth-child(2)";
private const string BaseURL = "https://kamuslengkap.com/kamus/sinonim/arti-kata/";

Agar lebih mudah saya akan membuat method yang mempunyai parameter kata agar nanti bisa dipanggil langsung pada main method.

Method ini bertugas untuk mendapatkan response berupa HTML source, kemudian parse source tersebut, dan terakhir mengembalikan sinonim.

private static string GetSynonyms(string kata)
{
    // Memanggil method CreateClient untuk membuat object WebClientEx baru.
    var client = CreateClient();

    // Mendapatkan response berupa HTML string
    var response = client.DownloadString(BaseURL + kata);

    // Parse response menggunakan HtmlParser (AngleSharp)
    var parser = new AngleSharp.Parser.Html.HtmlParser();
    var parsed = parser.Parse(response);

    // Select element menggunakan selector dan ambil text content
    var sinonim = parsed.QuerySelector(Selector)?.TextContent;

    return sinonim ?? "Maaf, sinonim tidak ditemukan";
}

Terakhir, pada body Main method..

// Mendapatkan kata yang dimasukan user
Console.Write("Tentukan kata: ");
var kata = Console.ReadLine();

// Memanggil GetSynonyms method
var sinonim = GetSynonyms(kata);

// Menampilkan hasil sinonim
Console.WriteLine("\nHasil:\n" + sinonim);
Console.Read();

Jika berhasil di compile, maka hasilnya seperti dibawah ini.

Demo web scraper dengan c#

 

Untuk belajar, Anda bisa mendownload contoh project disini.

 

Kesimpulan

Terlepas dari kontroversi legal atau ilegal, web scraping memiliki potensi besar untuk mempercepat pekerjaan kita dalam mengumpulkan informasi dari sebuah situs.

Didalam web berisi repositori data yang luas dan tidak akan pernah berakhir, itu memungkinan kita untuk menyimpan data besar secara spesifik kedalam database atau bahkan pada aplikasi bisnis.

Tags: #csharp #web scraping

No related post!

Leave a reply "Mengenal dan Belajar Web Scraping dengan C#"


Top