Anda di halaman 1dari 12

LAPORAN PROYEK

MATA KULIAH
KECERDASAN WEB

PROYEK PEMBANGUNAN SEARCH ENGINE BERBASIS PHP

Disusun Oleh:
Ayomi Satria Pratama - 11191013

INSTITUT TEKNOLOGI KALIMANTAN


2022
BAB 1. PENDAHULUAN

1.1. Latar Belakang

Teknologi informasi dan komunkasi saat ini berkembang pesat sehingga membuat
perkembangan informasi juga berkembang dengan pesat. Hal ini menyebabkan sistem temu kembali
informasi (information retrieval = IR) mengalami kesulitan. Information retrieval (IR) itu sendiri
merupakan sebuah metode untuk mencari informasi yang berkaitan dengan representasi,
penyimpanan, pengaturan, dan akses ke item informasi seperti dokumen, halaman web, katalog
online, struktur dan catatan semi-terstruktur, objek multimedia. Representasi dan pengorganisasian
item-item informasi harus sedemikian rupa sehingga memberi para pengguna akses mudah ke
informasi yang mereka inginkan[1].
Search engine atau mesin pencarian merupakan salah satu aplikasi dari sistem temu kembali
dalam menemukan dokumen ataupun mengeksekusi algoritma peringkat dalam menampilkan
dokumen. Pengguna dapat mencari informasi atau halaman web yang dibutuhkan dengan
menggunakan aplikasi search engine. Search engine web bekerja dengan cara menyimpan data
halaman web yang diambil langsung dari WWW[2]. Halaman – halaman ini diambil dengan
menggunakan web crawler, web crawler itu sendiri merupakan suatu cara pengumpulan informasi
dari semua halaman website yang terhubung dengan pada setiap link website[3]. Isi setiap halaman
lalu dianalisis untuk menentukan cara indeks-nya (contohnya, kata-kata diambil dari judul,
subjudul, atau field khusus yang disebut meta tag). Data tentang halaman web disimpan dalam
sebuah indeks basis data untuk digunakan dalam pencarian selanjutnya. Sebagian besar aplikasi
search engine itu menyimpan seluruh atau sebagian halaman sumber (atau dapat juga disebut
dengan cache) maupun informasi tentang halaman web itu sendiri[2].
Pada proyek ini penulis akan melakukan pembangunan search engine sederhana dengan
menggunakan bahasa pemrograman PHP. Sedangkan untuk data – data yang diperlukan untuk
pengimplemetasian search engine, penulis mengambil data dari website itk.ac.id dengan
menggunakan metode web scrapling, web scrapling itu sendiri merupakan suatu proses
pengambilan data di halaman website[4].

1.2. Rumusan Masalah

Dari latar belakang, maka rumusan masalah dalam pembuatan proyek ini sebagai berikut:
1. Bagaimana cara menerapkan web scrapling pada website itk.ac.id?
2. Bagaimana cara pembuatan dan mengimplementasikan program search engine dengan
menggunakan data hasil dari web scrapling?

1.3. Tujuan

Pembuatan proyek pembangunan search engine berbasis PHP ini dibentuk dengan tujuan
sebagai berikut:
1. Melakukan penerapan apa yang sudah di pelajari selama perkuliahan Kecerdasan Web ini
dengan melakukan pembangunan search engine berbasis PHP.
2. Untuk mengetahui cara kerja web scrapling dan search engine itu seperti apa.
BAB 2. PERSIAPAN

Ada beberapa hal yang perlu dibutuhkan sebelum melakukan pengerjaan proyek pem-
bangunan search engine ini, yaitu:
1. Menginstal aplikasi Visual Studio Code dan XAMPP.asd
2. Dibutuhkannya skill dasar PHP, SQL, dan HTML
3. Memahami konsep dasar web scrapling.

BAB 3. IMPLEMENTASI
3.1. Source Code connect.php

<?php

$conn = new mysqli("localhost", "root", "", "fetchingdata");


if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}

Penjelasan:
Code diatas dibuat untuk connect ke database MySQL kita. Pada variable $conn itu dibuat
untuk mengconnect ke database kita (“localhost”, “root”, “{Password sql}, “{nama database}”).
Selanjutnya terdapat kondisi jika $conn gagal terkoneksi maka akan menjalankan die(), yaitu inbuilt
function dari php untuk mengakhir running dari file php.

3.2. Source Code spider.php

No Source Code
1 <form action="spider.php" method="GET">
2 <input type="text" name="url" placeholder="Masukkan URL">
3 <button type="submit">Tambah</button>
4 </form>
5
6 <?php
7
8 if (isset($_GET['url'])) {
9 $query = $_GET['url'];
10 include 'connect.php';
11
12 $url = $query;
13 $html = file_get_contents($url);
14
15 preg_match_all('@<p>(.+)</p>@', $html, $matches);
16 preg_match_all('@<li>(.+)</li>@', $html, $matchesLists);
17 preg_match_all('/<a[^>]+href=([\'"])(?<href>.+?)\1[^>]*>/i', $html, $matchesLink);
18 $listItems = $matches[1];
19 $listLinks = $matchesLink['href'];
20
21 foreach ($matchesLists[1] as $matchesList) {
22 array_push($listItems, $matchesList);
23 }
24
25 foreach ($listItems as $item) {
26 $data = strip_tags($item);
27 $words = explode(" ", $data);
28 foreach ($words as $word) {
29 $sql = "SELECT * FROM katakata WHERE url='$url' AND kata='$word'";
30 $result = $conn->query($sql);
31 if ($result->num_rows > 0) {
32 while ($row = $result->fetch_assoc()) {
33 $jum = $row['jumlah'] + 1;
34 $sql2 = "UPDATE katakata SET jumlah='$jum' WHERE url='$url' AND
kata='$word';";
35 $result2 = $conn->query($sql2);
36 if ($result2) {
37 echo 'Berhasil update <b>' . $word . '</b><br>';
38 } else {
39 echo "Error: " . $sql2 . "<br>" . $conn->error;
40 }
41 }
42 } else {
43 $sql3 = "INSERT INTO katakata (url, kata, jumlah, title) VALUES ('$url',
'$word', 1, '$data')";
44 if ($conn->query($sql3) === TRUE) {
45 echo 'Berhasil tambah <b>' . $word . '</b><br>';
46 } else {
47 echo "Error: " . $sql3 . "<br>" . $conn->error;
48 }
49 }
50 }
51 }
52
53 echo '<br><hr><br>';
54
55 foreach ($listLinks as $link) {
56 $data = strip_tags($link);
57 $sql = "SELECT * FROM akandikunjungi WHERE url='$data'";
58 $result = $conn->query($sql);
59 if (!$result->num_rows > 0) {
60 $sql2 = "INSERT INTO akandikunjungi (url) VALUES ('$data')";
61 if ($conn->query($sql2) === TRUE) {
62 echo 'Berhasil tambah <b>' . $data . '</b><br>';
63 } else {
64 echo "Error: " . $sql2 . "<br>" . $conn->error;
65 }
66 }
67 }
68
69 $sql = "SELECT * FROM pernahdikunjungi WHERE url='$url'";
70
71 $result = $conn->query($sql);
72 $date = date('Y-m-d h:i:s');
73 if (!$result->num_rows > 0) {
74 $sql2 = "INSERT INTO pernahdikunjungi (url, kaliterakhir) VALUES ('$url', '$date')";
75 if ($conn->query($sql2) === TRUE) {
76 echo 'Berhasil tambah pernahdikunjungi';
77 } else {
78 echo "Error: " . $sql2 . "<br>" . $conn->error;
79 }
80 } else {
81 $sql2 = "UPDATE pernahdikunjungi SET kaliterakhir='$date' WHERE url='$url'";
82 $result2 = $conn->query($sql2);
83 if ($result2) {
84 echo 'Berhasil update pernahdikunjungi';
85 } else {
86 echo "Error: " . $sql2 . "<br>" . $conn->error;
87 }
88 }
89 }

Penjelasan:

No Penjelasan
1-4 Dalam barisan ini terdapat form yang berfungsi untuk memasukkan link url yang akan
digunakan untuk scrapling data dari link tersebut.
8 Dalam baris ini terdapat kondisi untuk mengecek apakah ($_GET['url'] sudah diatur, dan
akan meng-return false jika null.
9 Dalam baris ini terdapat variable $query untuk mendapatkan url dari input sebelumnya,
10 Dalam baris ini terdapat include 'connect.php'; yang bertujuan untuk memasukkan isi
dari file connect.php.
12 Dalam baris ini terdapat variable $url=$query.
13 Dalam baris ini terdapat variable $html untuk membaca semua isi dari $url.
15-17 Dalam barisan ini terdapat fungsi preg_match_all(pattern, input(“disini $html”), matches
(variable yang akan digunakan untuk dijadikan sebagai parameter hasil dari
preg_match_all) ) untuk mencari pattern yang sama, dan disini pattern yang dicari yaitu
[[<p>, $html, $matches], [<li>, $html, $matchesLists], [<a href=”/”>, $html,
$matchesLink]].
18 Dalam baris ini terdapat variable $listItems = $matchesLists[1].
19 Dalam baris ini terdapat variable $listLinks = $matchesLink[‘href’].
21-22 Dalam barisan ini berisi pengulangan tiap dari $matchesLists[1] as $marchList untuk
memasukkan isi dari $matchList kedalam akhir array dari $listItems.
25 Dalam baris ini berisi pengulangan untuk tiap dari $listItems as $item.
26 Dalam baris ini terdapat variable $data yang berisi strip_tags($item), yang bertujuan
untuk menghilang tags html.
27 Dalam baris ini terdapat variable $words yang berisi explode (" ", $data) untuk
memecah string menjadi array, atau memecah kalimat menjadi kata karena kondisi “ “.
28 Dalam baris ini terdapat pengulangan untuk tiap dari $words as $word.
29-30 Dalam barisan ini terdapat variable $sql untuk mengakses table katakata WHERE
url='$url' AND kata='$word', dan variable $result untuk menghubungkan $sql ke
database.
31 Dalam baris ini terdapat kondisi jika num_rows nya lebih dari 0.
32-41 Dalam barisan ini terdapat pengulangan untuk menambah jumlah dari kata yang sama
dan jika berhasil maka akan mengupdate data jumlah di database dan menampilkan
output dari echo 'Berhasil update <b>' . $word . '</b><br>'. echo "Error: " . $sql2 .
"<br>" . $conn->error;

42-51 Dalam barisan ini terdapat kondisi lain dari kondisi sebelumnya bertujuan untuk jika
kondisi diatas tidak terpenuhi maka kondisi ini akan jalan. Dan jika kondisi ini jalan
maka jumlah secara default menjadi 1.
53 Dalam baris ini terdapat fungsi echo '<br><hr><br>', <br> untuk membuat satu baris
kosong dan <hr> untuk membuat satu garis sepanjang satu baris.
55-67 Dalam barisan ini terdapat pengulangan untuk tiap dari $linkLinks as $link, pertama-
tama tags <a> akan dihapus dulu oleh variable $data, lalu memanggil data url dari tabel
akandikunjungi dengan variable $sql setelah itu variable $result akan menghubungkan
$sql ke database. Lalu terdapat kondisi jika num_rows > 0 maka variable $sql2($data
akan dimasukkan kedalam url di tabel akandikunjungi) akan jalan. Dan terakhir jika
semua yang diatas jalan maka akan menampilkan output dari echo 'Berhasil tambah <b>'
. $data . '</b><br>', jika tidak berhasil maka akan menampilkan output dari echo "Error:
" . $sql2 . "<br>" . $conn->error;.
69-71 Dalam barisan ini terdapat variable $sql untuk memanggil data url dari tabel
pernahdikunjungi, dan variable $result untuk menghubungkan $sql ke database.
72 Dalam baris ini terdapat variable $date untuk mengatur otomatis data tanggal.
73-79 Dalam barisan ini terdapat kondisi jika num_rows > 0 maka data $url dan $date akan
dimasukkan kedalam tabel pernahdikunjungi di database. Dan jika $sql2 berhasil
terhubung ke database maka akan menampilkan output dari echo 'Berhasil tambah
pernahdikunjungi', dan jika tidak berhasil maka akan menampilkan output dari echo
"Error: " . $sql2 . "<br>" . $conn->error;
80-89 Dalam barisan ini berisi kondisi lain jika kondisi sebelumnya tidak terpenuhi, dan jika
kondisi ini terpenuhi maka $sql2 akan mengupdate data kaliterakhir lalu $sql2 akan
dihubungkan dengan database melalui variable $result2. Lalu jika $result2 TRUE maka
akan menampilkan output echo Berhasil update pernahdikunjungi', dan jika $result2
FALSE maka akan menampilkan output dari echo "Error: " . $sql2 . "<br>" . $conn-
>error;

3.3. Source Code index.php

No Source Code
1 <?php include 'connect.php';
2 if (isset($_GET["keyword"])) {
3 $query = $_GET["keyword"];
4 } else {
5 $query = '';
6 }
7
8 ?>
9
10 <!DOCTYPE html>
11 <html>
12
13 <head>
14 <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3"
crossorigin="anonymous">
15 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.min.js" integrity="sha384-
QJHtvGhmr9XOIpI6YVutG+2QOK9T+ZnN4kzFN1RtK3zEFEIsxhlmWl5/YESvpZ13"
crossorigin="anonymous"></script>
16 </head>
17
18 <body>
19 <div class="row" style="margin-top: 50px; ">
20 <div class="col-md-1">
21 </div>
22 <div class="col-md-8">
23 <form action="" method="get">
24 <div class="row">
25 <div class="col-md-3">
26 <div class="row">
27 <div class="col-md-3">
28 <img
src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png"
width="120px" style="margin-top: 7px;">
29 </div>
30 </div>
31 </div>
32 <div class=" col-md-7" style="margin-top: 5px;">
33 <input class="form-control" type="text" id="keyword" name="keyword"
placeholder="Masukkan keyword" value="<?php echo $query; ?>">
34 </div>
35 <div class="col-md-1" style="margin-top: 5px;">
36 <button type="submit" class="btn btn-primary form-control" href="/">Cari</button>
37 </div>
38 </div>
39 </form>
40 </div>
41 </div>
42 <div class="container" style="padding-left: 50px; padding-right:50px;">
43 <br>
44 <hr>
45 <br>
46 <?php if (isset($_GET["keyword"])) { ?>
47 <label for="result">Result for keyword: <?php echo $_GET["keyword"]; ?></label><br><br>
48 <?php if ($conn->connect_error) {
49 die("Connection failed: " . $conn->connect_error);
50 }
51 $keywords = $_GET["keyword"];
52 $keywordSplits = explode(' ', $keywords);
53 $keyword = "('" . $keywords . "')";
54 $keyword = str_replace(" ", "', '", $keyword);
55 $sql = "SELECT * FROM katakata WHERE kata IN $keyword ORDER BY jumlah DESC;";
56 $result = $conn->query($sql);
57
58 if ($result->num_rows > 0) {
59 while ($row = $result->fetch_assoc()) {
60 $total = count($row);
61 if (strlen($row['title']) > 100) {
62 $title = substr($row['title'], 0, 100) . '...';
63 } else {
64 $title = $row['title'];
65 }
66 ?>
67
68 <div class="row">
69 <div class="col-md-8">
70 <?php
71 $description = $row['title'];
72 foreach ($keywordSplits as $keywordSplit) {
73 $description = str_ireplace($keywordSplit, '<b style=color:black>' . $keywordSplit .
'</b>', $description);
74 }
75
76 echo "<a style='color:#404040' href='" . $row['url'] . "'>" . $row['url'] . "</a><br>";
77 echo "<a style='font-size:22px;' href='" . $row['url'] . "'>" . $title . "</a>";
78 echo "<p style='color:#404040'>" . $description . " - <b>" . $row['jumlah'] . " word
exist.</b></p><br>";
79 ?>
80 </div>
81 </div>
82 <?php
83 }
84 }
85 }
86 ?>
87 </div>
88 </body>
89 </html>

Penjelasan:
No Penjelasan
1-6 Dalam barisan ini berisi script php untuk memasukkan data connect.php dan terdapat
kondisi jika $_GET[‘keyword‘] sudah diatur maka $query = $_GET[‘keyword‘], dan
jika belum di set maka $query = ‘’ atau kosong.
10-11 Berisi tag !DOCTYPE dan html.
13-16 Merupakan bagian dari head yang berisi tag link untuk css dan javascript dari Bootstrap.
18-41 Pada bagian ini berisi body bagian gambar dan searchbar pada tampilan, dan juga
didalam sini terdapat form dengan method=”get” untuk searchbar dapat menginput
“keyword”.
42 Dalam baris ini terdapat tag div dengan class container untuk hasil pencarian keyword.
43-45 Dalam barisan ini terdapat tag <br><hr>, <br> untuk menambahkan satu baris kosong
dan <hr> untuk membuat satu garis sepanjang satu baris.
46 Baris ini berisi pembuka script php dengan kondisi variable $_GET[“keyword”] sudah di
set.
47 Dalam baris ini terdapat tag label untuk menampilkan Result for keyword: (keyword
yang diinput).
48-50 Bagian ini merupakan kodnisi untuk mengecek apakah $conn gagal terhubung ke
database maka akan menjalankan function die dengan output "Connection failed: " .
$conn->connect_error.
51 Baris ini terdapat variable $keyword untuk menampung keyword.
52 Baris ini terdapat variable $keywordSplits yang akan jalan jika keywordnya lebih dari 1
kata dan akan digunakan untuk menghighlight desc halaman web.
53-54 Bagian ini bertujuan agar dapat memasukkan input keyword lebih dari 1 kata.
55-56 Bagian ini untuk memanggil data kata IN $keyword dari tabel katakata dan diurutkan
berdasarkan banyak jumlah. Lalu terdapat variable $result untuk menghubungkan $sql
ke database.
58-65 Bagian ini terdapat kondisi jika num_rows > 0, maka akan melakukan pengulangan
while selama $result masih melakukan fetch_assoc(), mengambil data row dari database.
Didalam pengulangan terdapat var. $total untuk menghitung total $row lalu terdapat
kondisi lagi untuk batas tampilan title/description dari halaman web. Kondisinya yaitu
jika strlen($row['title']) > 100) maka $title akan di substr dengan range 0,100, “…”, dan
jika title kurang dari 100 maka $title tidak akan di substr atau dibatasi.
66 Baris ini merupakan penutup dari script php
68-82 Bagian ini berfungsi untuk menampilkan hasil dari pencarian keyword, dan juga hasil
input keyword akan di highlight didalam description halaman web (baris 72-74). Hasil
yang ditampilkan yaitu: link halaman web, description singkat halaman web, dan jumlah
kata yang sama dengan keyword didalam halaman web.
87 Baris ini merupakan penutup tag </div> dari <div class=”container”>
88-89 Merupakan penutup tag dari tag <body> dan <html>

BAB 4. HASIL DAN PEMBAHASAN


Screenshoot scrapling data web berhasil ditambahkan kedalam database

Screenshoot pencarian dengan satu keyword “teknologi”

Screenshoot pencarian dengan dua keyword “institut teknologi”, dan disini ada 2 halaman web
karena mengambil data kata WHERE [ “institut”, “teknologi”] jadi akan muncul 2 halaman web
Screenshoot pencarian dengan tiga keyword “institut teknologi kalimantan”, dan disini ada 2
halaman web karena mengambil data WHERE kata [“institut”, “teknologi”, “kalimantan”] jadi akan
muncul 2 halaman web

BAB 5. PENUTUP

5.1. Kesimpulan
Setelah penyususan laporan Proyek Pembangunan Search Engine Berbasis PHP, penulis
dapat menyimpulkan bahwa:
1. Penulis telah menerapkan metode web scrapling pada website itk.ac.id?
2. Penulis telah menyelesaikan pembuatan dan mengimplementasikan program search engine
dengan menggunakan data hasil dari web scrapling.

5.2. Saran
Berikut beberapa saran dari penulis, sebagai berikut:
1. Sebelum memulai pengerjaan proyek ini, alangkah baiknya mempelajari dasar PHP terlebih
dahulu, terutama PHP MySQL Database.
DAFTAR PUSTAKA

[1] “Information Retrieval | Computer Science.” https://onlinelearning.binus.ac.id/computer-


science/post/information-retrieval (accessed Apr. 08, 2022).
[2] “Mesin pencari web - Wikipedia bahasa Indonesia, ensiklopedia bebas.”
https://id.wikipedia.org/wiki/Mesin_pencari_web#Cara_kerja_mesin_pencari (accessed Apr.
08, 2022).
[3] Mila, “Bagaimana Cara Kerja Search Engine / Mesin Pencari? - Akudigital.”
https://www.akudigital.com/bisnis-tips/bagaimana-cara-kerja-search-engine/ (accessed Apr.
08, 2022).
[4] A. Nayoan, “Apa itu Web Scraping? Pengertian, Teknik, dan Manfaatnya,”
NIAGAHOSTERblog, 2020. https://www.niagahoster.co.id/blog/web-scraping/ (accessed
Apr. 08, 2022).

Anda mungkin juga menyukai