YoHang

Bergeraklah, karena diam itu mematikan!

Mengambil (Grab) Data dari Situs Lain Menggunakan PHP, cURL, dan HTML DOM Manipulation

Belakangan ini saya mendapatkan proyek untuk membuat sebuah website untuk perusahaan tour dan travel. Sempat ada keraguan dalam diri saya, karena ada permintaan dari klien agar dalam wesbite mereka disediakan fitur fungsi online ticketing. Fungsi itu nantinya akan mempermudah user untuk mengecek, misal jadwal penerbangan, seat avaibility, reservasi, dsb. Bukan hal yang mudah tentu saja, mengingat jika ingin seperti itu, tentu saja dibutuhkan basis data online yang tersambung dengan perusahaan penerbangan langsung. Tentu saja perusahaan penerbangan tidak sembarangan dalam menyediakan data mereka. Tidak ada API (Application Programming Interface) yang bisa digunakan untuk mengakses data ke sana. Tapi dalam situs-situs resmi perusahaan penerbangan ada fitur-fitur untuk mengecek jadwal penerbangan juga. Nah di sanalah nampaknya kita bisa mendapatkan data-data.

Nah sekarang permasalahannya adalah bagaimana data tersebut bisa saya ambil dan ditampilkan di website saya. Nah sambil mencoba programming sana-sini, ternyata tadi malam saya menemukan kasus yang bisa diuji coba juga. Tanggal 17 April 2010 kemarin adalah momen pengumuman hasil seleksi ujian tulis UM UGM 2010. Mulai pagi dini hari situs pengumuman tersebut bisa diakses untuk mengecek kelulusan. Hasil seleksi tidak ditampilkan semua, namun hanya person per person saja, yaitu dengan cara memasukkan nomor peserta, barulah dia bisa mengecek hasilnya.

Jika peserta dinyatakan lulus:

Jika tidak:

Saat itu saya ingin mengecek kelulusan adik-adik kelas SMA saya. Akan sangat melelahkan jika saya harus mengecek satu persatu, itupun kalau jarak nomor peserta mereka berdekatan. Nah saya ingin mencoba mengambil data hasil seleksi tersebut dan menampilkannya di website saya, dengan format yang saya inginkan tentu saja.

Nah setelah trial n error selama 1 jam di dini hari itu, dengan bantuan googling sana-sini dan mempelajari kembali cURL PHP, dan sebuah PHP class library untuk mempermudah melakukan manipulasi HTML DOM, saya menulis baris kode ini:

include('simple_html_dom.php');
set_time_limit(0);
$start = $_REQUEST['start'];
$end = $_REQUEST['end'];

if($_REQUEST['start'] != '') {
		echo "<table border='1'>";
		echo "<tr><td>Nomor Peserta</td><td>Nama</td><td>Hasil</td></tr>";
	for($n=$start; $n<=$end; $n++) {
		$url = 'http://um1.ugm.ac.id/index.php?pModule=pengumuman_lulus&pSub=pengumuman_lulus&pAct=view&jlr=utul';
		$data = 'kata_kunci='.$n.'&lihat_lokasi_ujian=Cari';

		$ch = curl_init();
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
		curl_setopt($ch, CURLOPT_URL, $url);
		curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
		$Rec_Data = curl_exec($ch);

		$html = str_get_html($Rec_Data);

		echo "<tr>";
		foreach($html->find('table') as $e) {
				echo "<td>" . $e->find('td', 2)->plaintext . "</td>";
				$lulus = $e->find('td', 9)->plaintext;
				$pos = strpos($lulus, "Maaf,");
				if($pos === false) {
					echo "<td>" . ucwords(strtolower($e->find('td', 11)->plaintext)) . "</td>";
					echo "<td>";
					echo ucwords(strtolower($e->find('td', 18)->plaintext)) . " - " . ucwords(strtolower($e->find('td', 15)->plaintext));
					echo "</td>";
				}
				else {
					echo "<td>" . ucwords(strtolower($e->find('td', 8)->plaintext)) . "</td>";
					echo "<td>Coba Lagi :) </td>";
				}
		}
		echo "</tr>";
	}
		echo "</table>";
}

Dan hasilnya adalah seperti ini:

Demo: Link Demo Script (tapi saya batasi 50 baris per request)

Walau mungkin algoritma pemrogramannya agak serem bin ekstrim (karena bisa bikin down server karena banyaknya request), yang penting bisa memenuhi apa yang saya cari lah :D Setidaknya dalam waktu 1 jam saya bisa mengumpulkan dan menyimpan 3000 baris data hasil seleksi (dari total mungkin 20-30 ribu peserta UM UGM) :D Lalu jika ingin mencari sebuah nama, saya tinggal “Search” saja, dan dalam waktu 3 detik langsung ketemu. Walau sebenarnya ini proyek kurang kerjaan – karena toh paginya bisa dilihat juga di koran – tapi yang penting kan belajarnya :D

Dengan metode yang sama, saya yakin pasti bisa melakukan hal yang sama terhadap situs-situs lain, termasuk proyek situs reservasi online tour dan travel di atas tadi. Ada kawan-kawan yang berpengalaman dalam bidang ini? Share ya :-) )

  • rizcool

    wah, mas yohang ngeri e, ajari mas… :D

  • http://www.adit.co.cc adit

    sangar lek,.. kalo mo blajar php tu enaknya dari mana yog? langsung dari kasus apa step by step tutorial dari buku?

  • http://yohang.net Yoga Hanggara

    Wah pagi-pagi sudah ada yang mampir dan comment (woot) (drinking)

    @dek rizcool’BS
    Malah diunekke ngeri (panic)
    Di Kedokteran g diajari po dek? (haha)
    Ya ya, rajin2 wae mampir ke sini dek, siapa tahu bisa saling berbagi juga. Saya juga sedang belajar kok (drinking)

    @aditPonari
    Masing-masing ketoke punya cara sendiri2, Pon. Nek aku sih biasane ada kasus opo (pengen gawe opo), terus lagi sinau lebih lanjut sambil pas gawe kuwi. Yo misalnya kasus di atas, aku lagi reti dan sinau fitur PHP sing jenenge HTML DOM Manipulation (aku lagi reti pas iki soale, hehehe) Yo wis, karo Googling, cobo-cobo. (drinking)

  • setetesembun

    (bigeyes) keren banget mas ..

  • thoriq

    (woot)

    namaku ketauan dong?
    wah

  • http://www.facebook.com/ahmad.rafie?ref=profile raf03

    Oalah.. iki to tersangka sing marai server dadi super lambat.. ^^

    Btw, dari sisi efektivitas metode begini kurang bagus. Lagian firewall di sisi server bisa dengan mudah melakukan blocking jika dianggap membahayakan availability service mereka. Jadi mungkin kurang feasible untuk diterapkan pada skala enterprise.

    Solusinya ya pake web service. Tapi yaa harus ada komunikasi dulu sama pihak penyedia data agar mereka menyediakan fasilitas web service sehingga kita sebagai klien tinggal bikin aplikasi penghubung yang ditujukan kepada end user..

  • rizcool

    hahaha…
    (LOL)
    disini sya diajari bkn nghack kompie, tpi nghack org (woot) ;-)

    bisa Python g mas?? punya referensi bwt pemula??

  • http://canggih.web.id canggih

    oalah…dikira pake web service, ternyata cURL….bagus juga yog… (drinking) (worship)

  • http://anggitherdian.web.id/ anggit

    tapikan tapikan… mantep gan… (dance)

  • http://kifni.com Kifni

    adalah saya mumet membayangkan kodenya…

    (dance) (dance)

  • andhika lady

    apik apik B-)

  • fapud.tuing

    le ngandani gek tengah wengi .. pdhl saya dh ngecekin dr hbs isya’ ..(bigeyes)tp nuwun lho mas .. B) (cozy) (drinking)

  • http://anggitherdian.web.id/ anggit

    selain http://www.w3schools.com/ website apa yang ngebahas php, html dkk. Soale w3schools ra iso dibukak???

  • http://www.ilmuwebsite.com Loka Dwiartara

    itu dipakai untuk aplikasi saya juga mas . TA saya juga pakai itu … (dance) (dance) :D

  • http://tovarossi.blogspot.com tovarossi

    info yang menarik sobat, thanks udah share infonya. moga sukses selalu n tetap semangat

  • Anonymous

    Tentang apakah TAnya mas? :D

  • http://akhyar.web.id Akhyar

    Muantap tenan… Speechless sih, tapi udah kebayang dikit mau saya pake buat apa trik ini :D

  • http://akhyar.web.id Akhyar

    jih, lupa masukin email.. gravatar (keren) saya gak nongol

  • Anonymous

    Tapi itu codingnya ngawur blas, sedikit tidak ilmiah dan berbahaya. Hehehe. Soalnya saya juga masih awam terutama di cURL dan HTML DOM. Ada ide/trik apa nih yang menarik lagi? :D

  • Anonymous

    Weh tapi kok dua-duanya nongol avatar-nya semua (woot) Wah Spam ki (LOL)

    • http://akhyar.web.id Akhyar

      koneksi lemot kayaknya :P

  • Herman Aqua1
  • Guest

    Mas.
    Memang perusahaan penerbangan tidak ada yang menyediakan web service ya?

    Kalau ‘Flight Search Engine’ yang banyak di web pakai cara apa ya mas?
    Mereka bisa dapatkan detail penerbangan domestik indonesia.

  • Sumarbagiono

    Mas tulung diajari aku: aku punya komputer untuk mencatat kecepatan &arah angin. Aku pengen nampilin datanya ke webiste secara realtime katakanlah tiap 10 menit. Piye carane? Matur nuwun

  • Pingback: Data Cuaca & Gempa Bumi (API-XML Web Services BMKG Indonesia)

  • http://ferindra.web.ugm.ac.id/ ferindra

    dibuat bash script nya bisa nggak ini?kan ada curl juga di commandline ..

    *btw ketoke aku ngerti nama2 yang disensor diatas :)

  • fiky

    bagus sekali ini sharenya.tapi saya mau coba masukkan di drupal saya koq tidak bisa ya.saya menggunakan cms drupal..mohon bantuannya..terima kasih sekali