Selasa, 09 Oktober 2012

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.
01function db_get_url()
02{
03    $sql = "SELECT id, url FROM tbl_url WHERE status='0' ORDER BY id LIMIT 1";
04    $rs = mysql_query($sql);
05    $url = '';
06    if ($data = mysql_fetch_array($rs))
07    {
08        $url = $data['url'];
09
10        $sql = "UPDATE tbl_url SET status='1' WHERE id='". $data['id']. "' ";
11        $rs = mysql_query($sql);
12    }
13    if ($url == '') $url = 'http://planet.terasi.net';
14
15    return $url;
16}
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).
01function getURL($url, $delay=0) {
02    $result = "";
03    $url    = trim($url);
04    $delay  = intval($delay);
05    if ($url != "") {
06        $ch     = curl_init();
07        curl_setopt($ch, CURLOPT_URL, $url);
08        curl_setopt($ch, CURLOPT_HEADER, 0);
09        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
10        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
11        curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
12        if ($delay != 0) {
13            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
14            curl_setopt($ch, CURLOPT_TIMEOUT, $delay);
15        }
16        else {
17            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
18            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
19        }
20        $result = curl_exec($ch);
21        curl_close($ch);
22    }
23
24    return($result);
25}
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.
01function parseHTML($html)
02{
03    if (preg_match_all("/<a href=\"(.*?)\"/i", $html, $match)) {
04        foreach ($match[1] as $row) {
05            $domain = getDomain($row);
06            if ($domain != '')
07            {
08                db_insert_url($domain);
09            }
10        }
11    }
12}
Berikut ini adalah source code lengkapnya.
001<?php
002
003$db = mysql_connect('localhost', 'phpkita', 'phpkita');
004mysql_select_db('db_phpkita', $db);
005
006//loop terus aja
007while (true)
008{
009    $url = db_get_url();
010    $html = getURL($url);
011    db_update_html($url, $html);
012    parseHTML($html);
013}
014
015mysql_close($db);
016exit;
017
018/*
019 * fungsi-fungsi
020 */
021function db_get_url()
022{
023    $sql = "SELECT id, url FROM tbl_url WHERE status='0' ORDER BY id LIMIT 1";
024    $rs = mysql_query($sql);
025    $url = '';
026    if ($data = mysql_fetch_array($rs))
027    {
028        $url = $data['url'];
029
030        $sql = "UPDATE tbl_url SET status='1' WHERE id='". $data['id']. "' ";
031        $rs = mysql_query($sql);
032    }
033    if ($url == '') $url = 'http://planet.terasi.net';
034
035    return $url;
036}
037
038function getURL($url, $delay=0) {
039    $result = "";
040    $url    = trim($url);
041    $delay  = intval($delay);
042    if ($url != "") {
043        $ch     = curl_init();
044        curl_setopt($ch, CURLOPT_URL, $url);
045        curl_setopt($ch, CURLOPT_HEADER, 0);
046        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
047        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
048        curl_setopt($ch, CURLOPT_MAXREDIRS, 5);
049        if ($delay != 0) {
050            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
051            curl_setopt($ch, CURLOPT_TIMEOUT, $delay);
052        }
053        else {
054            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);
055            curl_setopt($ch, CURLOPT_TIMEOUT, 60);
056        }
057        $result = curl_exec($ch);
058        curl_close($ch);
059    }
060
061    return($result);
062}
063
064function parseHTML($html)
065{
066    if (preg_match_all("/<a href=\"(.*?)\"/i", $html, $match)) {
067        foreach ($match[1] as $row) {
068            $domain = getDomain($row);
069            if ($domain != '')
070            {
071                db_insert_url($domain);
072            }
073        }
074    }
075}
076
077function db_insert_url($url)
078{
079    $url = mysql_real_escape_string($url);
080    $sql = "INSERT INTO tbl_url (url, html, status) VALUES ('$url', '', '0')";
081    $rs = mysql_query($sql);
082}
083
084function db_update_html($url, $html)
085{
086    $url = mysql_real_escape_string($url);
087    $html = mysql_real_escape_string($html);
088    $sql = "UPDATE tbl_url SET html='$html' WHERE url='$url' ";
089    $rs = mysql_query($sql);
090}
091
092function getDomain($url)
093{
094    $result = '';
095    if (preg_match("/^(http:\/\/[\d|\w|-|_|.]+)/i", $url, $match)) {
096        $result = $match[1];
097    }
098    return $result;
099}
100?>
O, jangan lupa untuk membuat table nya juga.
1CREATE TABLE `tbl_url` (
2  `id` int(8) NOT NULL AUTO_INCREMENT,
3  `url` varchar(128) NOT NULL,
4  `html` text NOT NULL,
5  `status` int(1) NOT NULL DEFAULT '0',
6  PRIMARY KEY (`id`),
7  UNIQUE KEY `url` (`url`)
8) 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.

sumber

0 komentar:

Posting Komentar