Tuesday, April 19, 2011

Teknik Dasar Web Scraping Menggunakan JAVA

Pada artikel koneksi-url-dan-web-browsing-dengan-java dijelaskan mengenai cara untuk melakukan koneksi URL dengan protokol HTTP ke web server untuk mendapatkan data berupa teks HTML. Data yang diambil tersebut merupakan teks HTML satu halaman yang didapat dari URL yang di input. Lalu bagaimana jika kita hanya ingin mengambil data tertentu yang lebih spesifik? misalnya judul headline dan kesimpulannya pada suatu situs berita atau teks tertentu. Cara yang paling mudah untuk melakukannya adalah dengan menggunakan Regular Expresion.



Pembahasan lebih jauh mengenain Regular Expresion dapa dibaca pada artikel berikut pencarian-string-menggunakan-regular-expresion  . Singkatnya pada artikel ini kita menggunakan Regular Expresion untuk mengambil data teks yang kita inginkan pada teks HTML yang didapat dari URL.

Sebagai bahan pembelajaran, kita akan mencoba untuk mengambil judul artikel pertama yang tampil pada blog saya ini^^.


Pertama kita buat satu class untuk menangani koneksi dan pengambilan teks HTML dari URL. Berikut adalah contoh kode classnya :

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

class URLConnector {
 
 public static String getHTTPResource (String link) {
  StringBuffer result = new StringBuffer();
   
  try {
   
   System.out.println("Melakukan koneksi ke " + link + "...");
   URL url = new URL(link);
   
   URLConnection con = url.openConnection();
   
   con.addRequestProperty("User-Agent", "Mozilla/3.6");
   
   
   BufferedInputStream in = new BufferedInputStream(con.getInputStream());
   
   System.out.println("Koneksi berhasil.");
   System.out.println("Membaca data...");
   
   int buff;
   // membaca data dari web server per byte
   while ((buff = in.read()) != -1) {
    result.append((char)buff);
   }
   
   System.out.println("Selesai.");
       
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  
  return result.toString();
 }
 
}

Setelah itu, buat satu class lagi yang bertugas untuk melakukan pencarian teks judul dan kesimpulan. Berikut adalah contoh kode classnya :

import java.util.regex.Matcher;
import java.util.regex.Pattern;

class Pencari {
 
 public static String cariJudul (String htmlSource) {
  String regexPembuka = "

[\\s]"; String regexJudul = ".*"; String regexPenutup = "[\\s]

"; String hasil = Pencari.cari(regexPembuka + regexJudul + regexPenutup, htmlSource); return hapus(regexPenutup, hapus(regexPembuka, hasil)); } public static String cari (String regex, String source) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(source); if (matcher.find()) { return matcher.group(); } else { return null; } } public static String hapus (String regex, String source) { Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(source); return matcher.replaceAll(""); } }

Selanjutnya tinggal membuat satu class lagi yang berfungsi sebagai implementator kedua class diatas, misalnya disini kita buat class Main :

class Main {
 
 public static void main (String[] args) {
  String htmlSource = URLConnector.getHTTPResource("http://ikhsanaulia.blogspot.com/");
  String judul = Pencari.cariJudul(htmlSource);
  
  System.out.println("Judul : " + judul);
 }
}

Berikut adalah tampilan console saat class Main dieksekusi :


Nilai variabel judul pada main method yang ada di class Main diisi dari hasil pencarian pada class Pencari yang kebetulan pada saat artikel ini ditulis judul artikel pertama yang muncul di halaman depan blog adalah "Pencarian String Menggunakan Regular Expresion dan JAVA"

Kurang lebih seperti itulah dasar-dasar web scraping yang selanjutnya metode ini dapat dikembangkan lagi seperti program pembaca artikel atau juga bisa saja dikembangkan menjadi program untuk mencuri konten dari berbagai situs.

Selamat mencoba :)

2 comments:

  1. mantab gan, tp bisa di berikan action di javanya gak bila d webnya itu ada button

    ReplyDelete