Membuat Web Crawler Sederhana

Hi, kali ini saya akan mencoba menjelaskan bagaimana cara membuat web crawler sederhana. Oh ya, web crawler adalah program seperti robot yang akan menjelajahi dunia web dan kemudian mendownload halaman web tersebut.

Secara garis besar sebuah web crawler memiliki 3 bagian, yaitu:
1. Penentu url (alamat web) tujuan
2. Downloader web
3. Pemarsing (pemroses) hasil downloadan

Mari kita bahas satu persatu.

1. Penentu url(alamat web) tujuan.
Bagian ini akan mengambil 1 url dari database yang belum diproses.

function db_get_url()
{
	$sql = "SELECT id, url FROM tbl_url WHERE status='0' ORDER BY id LIMIT 1";
	$rs = mysql_query($sql);
	$url = '';
	if ($data = mysql_fetch_array($rs))
	{
		$url = $data['url'];

		$sql = "UPDATE tbl_url SET status='1' WHERE id='". $data['id']. "' ";
		$rs = mysql_query($sql);
	}
	if ($url == '') $url = 'http://planet.terasi.net';

	return $url;
}

2. Downloader Web
Fungsi getURL dibawah ini akan menerima $url berisi url tujuan dan akan mengembalikan html nya, sebenarnya kita bisa menggunakan fungsi file($url).

function getURL($url, $delay=0) {
	$result	= "";
	$url	= trim($url);
	$delay	= intval($delay);
	if ($url != "") {
	    $ch     = curl_init();
	    curl_setopt($ch, CURLOPT_URL, $url);
	    curl_setopt($ch, CURLOPT_HEADER, 0);
	    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
	    if ($delay != 0) {
	        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
	        curl_setopt($ch, CURLOPT_TIMEOUT, $delay);
	    }
	    else {
	        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
	        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
	    }
	    $result	= curl_exec($ch);
	    curl_close($ch);
	}

	return($result);
}

3. Pemarsing (pemroses) hasil downloadan
Fungsi parseHTML akan menerima string html kemudian mengekstrak semua link yang ada di string tersebut. Link tadi akan diambil domainnya saja untuk kemudian disimpan ke dalam database.

function parseHTML($html)
{
	if (preg_match_all("/<a href=\"(.*?)\"/i", $html, $match)) {
  		foreach ($match[1] as $row) {
  			$domain = getDomain($row);
			if ($domain != '')
			{
				db_insert_url($domain);
			}
	  	}
	}
}

Berikut ini adalah source code lengkapnya.

<?php

$db = mysql_connect('localhost', 'phpkita', 'phpkita');
mysql_select_db('db_phpkita', $db);

//loop terus aja
while (true)
{
	$url = db_get_url();
	$html = getURL($url);
	db_update_html($url, $html);
	parseHTML($html);
}

mysql_close($db);
exit;

/*
 * fungsi-fungsi
 */
function db_get_url()
{
	$sql = "SELECT id, url FROM tbl_url WHERE status='0' ORDER BY id LIMIT 1";
	$rs = mysql_query($sql);
	$url = '';
	if ($data = mysql_fetch_array($rs))
	{
		$url = $data['url'];

		$sql = "UPDATE tbl_url SET status='1' WHERE id='". $data['id']. "' ";
		$rs = mysql_query($sql);
	}
	if ($url == '') $url = 'http://planet.terasi.net';

	return $url;
}

function getURL($url, $delay=0) {
	$result	= "";
	$url	= trim($url);
	$delay	= intval($delay);
	if ($url != "") {
	    $ch     = curl_init();
	    curl_setopt($ch, CURLOPT_URL, $url);
	    curl_setopt($ch, CURLOPT_HEADER, 0);
	    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	    curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
	    if ($delay != 0) {
	        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
	        curl_setopt($ch, CURLOPT_TIMEOUT, $delay);
	    }
	    else {
	        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
	        curl_setopt($ch, CURLOPT_TIMEOUT, 60);
	    }
	    $result	= curl_exec($ch);
	    curl_close($ch);
	}

	return($result);
}

function parseHTML($html)
{
	if (preg_match_all("/<a href=\"(.*?)\"/i", $html, $match)) {
  		foreach ($match[1] as $row) {
  			$domain = getDomain($row);
			if ($domain != '')
			{
				db_insert_url($domain);
			}
	  	}
	}
}

function db_insert_url($url)
{
	$url = mysql_real_escape_string($url);
	$sql = "INSERT INTO tbl_url (url, html, status) VALUES ('$url', '', '0')";
	$rs = mysql_query($sql);
}

function db_update_html($url, $html)
{
	$url = mysql_real_escape_string($url);
	$html = mysql_real_escape_string($html);
	$sql = "UPDATE tbl_url SET html='$html' WHERE url='$url' ";
	$rs = mysql_query($sql);
}

function getDomain($url)
{
	$result = '';
	if (preg_match("/^(http:\/\/[\d|\w|-|_|.]+)/i", $url, $match)) {
		$result = $match[1];
	}
	return $result;
}
?>

O, jangan lupa untuk membuat table nya juga.

CREATE TABLE `tbl_url` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `url` varchar(128) NOT NULL,
  `html` text NOT NULL,
  `status` int(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `url` (`url`)
) ENGINE=MyISAM;

Demikianlah cara membuat web crawler yang sederhana. Untuk tahap selanjutnya, kamu bisa menambahkan fungsi filter untuk menentukan url mana saja yang akan disimpan dan mana yang akan diabaikan.

Salam PHP.

Categories: Web Crawler Tags: , ,

Cara cerdas membuat web crawler

Bayangkan indahnya bisa mengumpulkan semua informasi yang ada di dunia ini. Semua informasi yang ada di internet, bisa kita simpan menjadi milik kita pribadi… wow.. luar biasa bukan!

Bagaimana caranya? simple… cukup buat 1 program PHP untuk jadi web crawler jalankan, tunggu beberapa saat dan nikmati hasilnya :)

Bagaimana cara kerja web crawler?
1. Program crawler akan mendownload html dari url target
2. Program akan menyimpan html tersebut, kemudian mengekstrak semua url yang ada di html tersebut dengan menggunakan filtering yang kita kehendaki
3. Url-url tadi kemudian disimpan dalam sebuah list
4. Program akan mengambil 1 url dari list tadi yang belum didatangi, kemudian kembali ke langkah 1.

Dulu saya selalu membuat web crawler dalam bentuk PHP-CLI. Masalah yang timbul jika menggunakan solusi ini adalah:
1. Proses download html berjalan lambat, karena bandwith VPS saya sangat terbatas
2. Sewa server dan bandwitdh nya mahal euy
3. Bandwitdh server cepat sekali habis, karena download html yang sangat banyak

Bagaimana cara cerdas untuk mengakalinya?
Pergunakan web hosting biasa!
Ya.. web hosting biasa, saat ini saya lagi menjalankan crawler menggunakan web hosting nya godaddy yang bahkan diberi gratis oleh mereka.

Ok, dengan pendekatan web hosting seperti ini, program crawlernya saya bagi 2.
1. Invoker yang berjalan di vps, tetap dalam bentuk PHP-CLI
2. Downloader yang berjalan di web hosting, dan berbentuk PHP web script biasa

Program invoker tidak lagi mendownload html, mengekstrak dan menyimpannya, tapi hanya bertugas untuk menjalankan script downloader yang berada di web hosting saja.

PHP web script yang berada di web hosting akan mendownload, mengekstrak dan menyimpan hasilnya.

Ada satu lagi trick cerdas untuk membuat proses ini semakin cepat dan cepat.
PHP web script yang dipanggil oleh invoker akan memanggil PHP web script lainnya sebelum dia berakhir.

Dan dengan cara seperti ini, hanya dalam waktu 15  menit, telah tersimpan hampir 1000MB data website dalam database. Berapa cost yang harus dikeluarkan untuk mendapatkannya? hampir Rp.0, karena web hostingannya gratisan!

Apa kendalanya?
Jika web hosting provider nya tahu, sepertinya hal seperti ini akan dilarang hehe.

Salam PHP.

Categories: Web Crawler Tags: , ,

ComingFrom: aplikasi facebook untuk orang-orang mobile

Ternyata membuat aplikasi di facebook itu menyenangkan. Kenapa menyenangkan? Karena sudah ada komunitas yang begitu besarnya disana yang siap untuk memakai aplikasi kita.

Saya baru membuat aplikasi facebook bernama ComingFrom, alamatnya di http://apps.facebook.com/comingfrom/. Aplikasi ini akan menampilkan lokasi asal kamu ketika kamu bermain facebook. Cara kerjanya adalah mengambil ip address client kemudian di mapping dengan database ip2location, kemudian field city nya ditampilkan di stream/wall user.

Saya dapat database ip2location beberapa bulan yang lalu sebagai hadiah dari www.phpclasses.org untuk class JAK8583 yang pernah saya buat.

Ada yang punya ide lain untuk menggunakan database ip2location ini?

Categories: Facebook Tags: , ,

Membuat aplikasi di Facebook

Punya facebook dong? Pernah maen game di facebook dong? Buat yang nggak pernah maen game di facebook, pernah kirim-kiriman hadiah di facebook dong? atau paling nggak pernah dapat info siapa aja teman yang ultah dong? kalau semua nya masih belum pernah… jangan-jangan facebook nya beda nih… facebook yang saya maksud yang ada di http://www.facebook.com ya.

Semua game, hadiah dan yang lain-lain itu namanya Facebook Application.  Jadi aplikasi nya berjalan didalam web nya facebook. Bagaimana caranya? kemana kita harus mendaftar? susah nggak ya buatnya? bayar nggak ya?

Kabar baik buat kita semua para developer PHP, facebook aplication itu free, tanpa harus membayar apapun. Selain gratis, facebook aplication juga sangat mudah dibuat, apalagi untuk para programmer PHP… kita udah dibuatin framework sama facebooknya, jadi tinggal pakai fungsi-fungsi yang ada di framework tersebut langsung bisa jalan facebook application kita.

Ok… biar lebih kebayang, langsung aja kita coba. Berikut langkah-langkah nya:

1. Pastikan kamu bisa membuat sebuah program PHP yang bisa diakses dari internet.
Program Facebook application kita nantinya akan berada di server kita sendiri, bukan di server facebook. Kita hanya perlu memberi tahu facebook alamat web/url program kita tersebut. Jadi syarat pertama untuk membuat facebook application adalah: anda harus bisa membuat sebuah program PHP yang di publish di internet. Kita nggak perlu sewa 1 server untuk facebook application kita, cukup 1 shared hosting aja, atau pakai saja hosting gratisan. Kalau sudah punya hosting buat sebuah program sederhana php, apalagi kalau bukan hello world :)

<?php
echo "Hello World";
?>

Beri nama filenya hello.php
Jika kamu sudah bisa melihat Hello World hasil program tersebut di browser dengan menggunakan IP Publik atau domain internet artinya langkah pertama sudah benar.

2. Download Facebook Client PHP Framework
Untungnya menjadi programmer PHP adalah, kita sudah disediakan framework oleh facebook, jadi hidup kita jadi lebih mudah karenanya. Download dari link berikut ini:
http://svn.facebook.com/svnroot/platform/clients/packages/facebook-platform.tar.gz
Extract file tersebut kedalam directory yang sama dengan hello.php tadi.

3. Update hello.php menjadi facebook application
Program hello world kita di langkah 1 tadi adalah program hello world biasa, kita harus mengubahnya menjadi facebook application. Ubah hello.php tadi menjadi seperti dibawah ini:

<?php
include_once('facebook-platform/php/facebook.php');

$api_key = 'xxx';
$secret = 'yyy';

$facebook = new Facebook($api_key, $secret);
$facebook->require_frame();
$user = $facebook->require_login();
echo "Hello World";
?>

Simpan file hello.php tadi kemudian lihat hasilnya di browser anda. Jika muncul tampilan facebook dengan pesan “Invalid API key specified” artinya langkah ketiga kamu sudah benar. Invalid API key specified itu artinya aplikasi kita ditolak karena API key nya salah. Kita harus mendaftarkan aplikasi ke facebook dahulu untuk mendapatkan API key yang valid. Cara nya seperti langkah keempat dibawah ini.

4. Daftarkan aplikasi kita ke facebook
Login ke http://www.facebook.com kemudian buka link http://www.facebook.com/developers/createapp.php
Isi application name: namaanda_hello
Pilih Agree dan save change.
Nah, dibrowser akan muncul halaman baru. Disitu ada API Key dan Secret. Copy kan isi API Key dan Secret tersebut ke program hello.php kamu tadi.

Kemudian pindah ke menu Canvas.
Isi Canvas Page URL: dengan application name kamu tadi.
Isi Canvas Callback URL: dengan alamat web/url program hello.php kamu.
Save Changes.

Dan selesai. Mudah kan :)

Untuk melihat aplikasi anda, buka http://apps.facebook.com/%5Bnama aplikasi anda]
Contohnya: http://apps.facebook.com/jakhello/

Jika kita bisa buat hello world di facebook application, artinya kita bisa buat aplikasi lainnya juga di facebook.

Salam PHP

Categories: PHP Terapan Tags: ,

Array di PHP Flexibel dan Lengkap

Apa itu array? array adalah variabel yang ditumpuk-tumpuk. Katakan kita punya 3 variabel: A, B dan C. Kita bisa gabungkan 3 variabel tadi menjadi 1 array, katakanlah array Q. Jadi sekarang Q adalah sebuah array dengan 3 variabel didalamnya yaitu Q(0), Q(1), Q(2). Q(0) itu adalah jelmaan dari A, Q(1) adalah jelmaan dari B, Q(2) adalah jelmaan dari C.

Kenapa urutannya mulai dari 0-2 dan bukan 1-3? karena PHP selalu mengawali sesuatu dari 0 dan bukan 1. Jadi urutan pertama sebuah array adalah 0. Ok.

PHP memperlakukan array dengan cara yang agak ajaib, sangat flexibel, sangat lengkap. Kalau anda punya pengalaman buruk dengan kakunya array di C/C++ anda pasti terpesona dengan kemampuan array PHP. Apa saja itu?

Berikut ini beberapa kelebihan array di PHP

  1. Elemen sebuah array bisa bercampur aduk. Misalkan untuk elemen 0 isinya integer, elemen 1 isinya string, elemen 2 isinya array… di php itu bisa dilakukan. Dan bukan cuma nilai elemennya yang bisa beda-beda, tapi nama elemennya juga bisa beda-beda loh.
  2. Jumlah elemen dalam sebuah array tidak perlu didefinisikan diawal. Jadi kita bisa kapan saja menambah sebuah elemen baru atau menghapus elemen lama dalam sebuah array. Jadi array dalam PHP sudah bisa menjadi sebuah queue, atau stack atau hash table.
  3. PHP menyediakan banyak fungsi untuk memanipulasi array. Ada sorting, filtering, iteration, semua ada.

Mari perhatikan contoh-1 berikut ini:

<?php
$a[] = 'a';
$a[] = 'b';
$a['oya'] = 12345;
$a[] = 'c';
print_r($a);
?>

Oh, print_r() adalah sebuah fungsi untuk menampilkan isi sebuah array. Dalam contoh-1 diatas, kita tidak melakukan inisialisasi array seperti $a = array(). Tapi bisa langsung mengisi sebuah elemen baru pada array. $a[] = ‘a’; artinya kita menambahkan sebuah nilai ‘a’ bertipe string ke dalam array $a. PHP akan secara otomatis membuatkan sebuah index baru untuk elemen ini. Index dibuat berurutan. Jadi $a[] = ‘a’; maka hasilnya adalah $a[0] = ‘a’. Selanjutnya $a[] = ‘b’; maka hasilnya adalah  $a[1] = ‘b’. Mari kita gabungkan elemen dengan tipe dan nama yang berbeda $a['oya'] = 12345; Selanjut kita tambahkan lagi elemen baru. Hehe… campur aduk kan saja.
Kita lihat hasilnya dengan perintah print_r($a); Berikut ini adalah hasilnya:

Array
(
[0] => a
[1] => b
[oya] => 12345
[2] => c
)

Jadi array nya PHP benar-benar flexibel.

Ok, mari kita perhatikan code dari postingan saya sebelum ini:

$dt = array_count_values(explode(’ ‘,str_replace(’,',”,str_replace(’.',”,strtolower(strip_tags(implode(” “, file(’http://planet.kronologger.net’))))))));
arsort($dt);
print_r(array_slice($dt,0, 30));

Apa yang dilakukan oleh program diatas adalah:
1. Download content html dari http://planet.kronologger.net dengan menggunakan fungsi file(). Hasilnya adalah array yang isinya baris perbaris html.
2. Gabungkan semua elemen array tadi menjadi sebuah string dengan menggunakan fungsi implode().
3. Hapus semua tag html, ubah string tersebut menjadi huruf kecil, hapus karakter titik dan koma.
4. Ubah string tadi menjadi array kembali dengan menggunakan fungsi explode(), dengan setiap kata menjadi elemennya.
5. Dengan menggunakan fungsi array_count_values() kita bisa mendapatkan jumlah setiap kata dalam string tersebut!
6. Kita urutkan hasil penghitungan tadi dengan menggunakan arsort() agar yang paling banyak berada diawal. Jika ingin yang paling banyak berada di paling belakang pakai asort().
7. Karena kita cuma ingin menampilkan 30 data terbanyak saja, maka array tadi bisa kita potong dengan menggunakan fungsi array_slice().
8. Dan akhirnya kita lihat hasilnya dengan menggunakan fungsi print_r().

Nah, semoga postingan ini bisa memperlihatkan betapa flexibel dan lengkap nya array dalam PHP.

Salam PHP.

Categories: Dasar-Dasar PHP Tags:

Kata apa yang paling sering muncul di blog?

Kalau menurut anda, kata apa yang paling sering muncul di blog-blog indonesia ya? mungkin kah kata benda? atau kata kerja atau malah kata penghubung?

Hm… dengan php kita bisa mencari tahu jawabnya hanya dengan 3 baris saja.

$dt = array_count_values(explode(’ ‘,str_replace(’,',”,str_replace(’.',”,strtolower(strip_tags(implode(” “, file(’http://planet.kronologger.net’))))))));
arsort($dt);
print_r(array_slice($dt,0, 30));

Dan hasilnya adalah?

Array
(
[] => 20194
[
] => 658
[yang] => 350
[dan] => 323
[di] => 219
[saya] => 199
[kita] => 156
[itu] => 143
[untuk] => 141
[tidak] => 128
[dengan] => 113
[ini] => 104
[mereka] => 91
[tapi] => 84
[akan] => 82
[adalah] => 80
[juga] => 78
[karena] => 76
[bisa] => 74
[ada] => 72
[dalam] => 72
[dari] => 71
[pada] => 59
[pbb] => 58
[kalau] => 58
[bahwa] => 50
[mungkin] => 47
[israel] => 46
[harus] => 46
[seperti] => 46
)

Ternyata kata penghubung yang paling sering muncul :)

Salam PHP

Categories: Dasar-Dasar PHP Tags: , , ,

Program Hello World!

Mungkin semua programmer baik itu programmer profesional maupun non profesional, mengawali dunia programmer dengan menulis program “Hello World”.  Setuju? Well, setidaknya dulu waktu saya kuliah yang pertama kali dipalajari adalah itu :)

Apa itu program hello world?
Simple, kita diminta untuk menampilkan tulisan “Hello World” dilayar. Udah itu aja. Tapi sebenarnya ada banyak yang kita pelajari dari sebuah program hello world. Kita jadi tahu kalau ternyata komputer bisa berinteraksi dengan manusia melalui yang dinamakan program komputer. Kita jadi tahu kalau ternyata komputer bisa kita perintah sesuka kita. Kita jadi tahu kalau ternyata untuk bisa memberi perintah ke komputer, kita harus tau cara pengucapan dan tata bahasanya. Dan yang terpenting kita jadi merasa senang bukan maen kita melihat hello world buatan kita untuk pertama kalinya muncul di layar komputer.

Ok, now… lets start writing hello world in php.

Jalankan editor kesukaanmu, ketik 3 baris perintah dibawah ini:

<?php
echo "Hello World";
?>

Simpan dengan nama hello.php. Kemudian pada command prompt / shell window ketik:

php hello.php

Ataaaaaa…. ada hello world muncul dilayar… dan begitu lah cara kerjanya.

Ok, sekarang kita masuk ke Dunia PHP

1. Apa beda echo() dan print()?
Mana yang lebih baik digunakan echo() atau print()?
Jawabannya adalah: echo()

Kenapa?
Ternyata echo itu lebih cepat daripada print
php-echo-vs-printPerbedaannya sangat tipis sih. Tapi tetep aja ada bedanya :)

Kenapa echo bisa lebih cepat dibandingkan print?
Karena echo tidak mengembalikan hasil, sementara print akan mengembalikan hasil dengan tipe integer yang menurut PHP Manual akan selalu bernilai 1.

2. Apa itu CLI?
CLI itu singkatan dari Command Line Interface. Artinya kita tidak perlu web server untuk menjalankan program php. Yang tadi kita lakukan dengan menulis sebuah file program, terus disimpan dan dijalankan dengan menggunakan perintah: php [nama file], adalah contoh penggunaan PHP CLI.

Jadi hari gini, nggak perlu lagi web server untuk menjalankan program php. ok?

Di postingan selanjutnya, saya akan berbagi tentang PHP CLI lebih lanjut lagi. Seberapa powerful sih PHP CLI, bisa ndak dipergunakan untuk program-program yang lebih serius, bisa ndak dipakai untuk network programming, bisa ndak dipakai untuk yang lainnya? Nantikan…p

Follow

Get every new post delivered to your Inbox.