Web Scrapping: Mengambil Kata-Kata KNTL

Belajar scrapping data dari website berbasis proyek dengan python 3. Kita coba mengambil kata-kata KNTL untuk kebutuhan game quiz sederhana.

Do Exploit
9 min readNov 25, 2020
Background by Pixabay & Icon by FlatIcon

Pada blog kali ini saya akan membahas step-by-step melakukan scrapping data dari situs website. Nantinya data tersebut akan digunakan untuk game sederhana, bernama KNTL Quiz (lihat demo video diatas). Game ini terinspirasi dari seseorang di grup whatsapp peninggalan webinar Devover, lihat demo game awalnya disini.

Tujuan game quiz ini dibuat memang hanya untuk membawa pikiran kamu traveling ke dunia lain 🤣, tapi seru bukan? Kita ditantang berpikiran positif.

Namun pada web tersebut, kosakata KNTL yang dimiliki masih terbatas. Sehingga dipikiran saya langsung muncul ide untuk mengembangkan game tersebut dari sisi kosakata KNTL. Dapat kita lihat, yang dibutuhkan ada 2 kata kunci yaitu kosakata dan pertanyaannya. Maka dari itu kita akan melakukan scrapping pada situs KamusBesar, agar mendapatkan deskripsi atau pertanyaan dari kosakatanya nanti.

Menyiapkan Scraper Python Web

Inilah salah satu keuntungan menggunakan python, module-module yang dimiliki sangat luas. Tiga diantaranya yang dibutuhkan saat ini ialah:

  • requests, untuk melakukan permintaan HTTP lalu mengambil respon HTML yang diberikannya.
  • bs4, untuk mengolah respon HTML dari module requests sebelumnya, sehingga dapat disortir data mentah yang tadinya tidak spesifik, menjadi lebih spesifik sesuai dengan kebutuhan yang kita mau.
  • sqlite3, untuk menyimpan data yang telah disortir kedalam database menggunakan SQLite. Kenapa gunain SQLite bang? Database ini berukuran kecil , berdiri sendiri dalam sebuah file, bukan database client-server, mempunyai beberapa fitur perintah MySQL sehingga memudahkan kita saat bermigrasi. Bisa juga menggunakan file csv, bebas tergantung kalian saja.

Jika belum menginstall depedensi yang diperlukan, silahkan install menggunakan perintah pip3:

$ pip3 install requests BeautifulSoup4 pysqlite3

Sebelum kita melakukan import module, buatlah file Scrape Info.py atau sebagainya. Barulah lakukan import module-module diatas:

import sqlite3
import requests
from bs4 import BeautifulSoup

Menyiapkan Database SQLite

Seperti yang dijelaskan sebelumnya, kita membutuhkan database sqlite untuk menyimpan kata-kata dan pertanyaan terkait KNTL. Bagi yang belum menginstall package sqlite3 silahkan diinstall terlebih dahulu dengan perintah:

$ apt-get install sqlite3 -y

Lalu kita buat databasenya, tidak seperti yang SQL yang lain biasanya dibuat dalam Console SQL langsung. Disini cukup membuat nama_file.db maka secara otomatis nama file tersebut menjadi databasenya. Buatlah dengan perintah berikut:

$ touch KNTL\ Word.db

Nah sekaranglah waktunya kita masuk kedalam Console SQLite untuk membuat table, gunakan perintah:

$ sqlite3 KNTL\ Word.db

Perintah pada SQLite ini hampir mirip dengan perintah-perintah umum MySQL, sekarang kita coba membuat table dan kolom untuk menyimpan kata-kata terkait KNTL:

CREATE TABLE KNTLword ( 
word_id INTEGER PRIMARY KEY,
word TEXT NOT NULL,
word_desc TEXT NOT NULL
);

Keterangan:

  • KNTLword, itu merupakan nama tabel yang menyimpan kosakata dan pertanyaan terkait KNTL nanti.
  • word_id, menyimpan nomor id dari setiap kolom, jadi tipe data yang dibuat ialah INTEGER, lalu memiliki aturan PRIMARY KEY.
  • word, menyimpan kosakata KNTL, aturan pertama ialah tipe datanya TEXT dan aturan keduanya NOT NULL. Artinya isi kolomnya tidak dapat sama dengan kolom-kolom sebelumnya.
  • word_desc, menyimpan deskripsi atau pertanyaan dari kosakata di kolom word, aturannya masih sama seperti kolom word sebelumnya.

Contoh isinya kira-kira akan menjadi seperti ini:

1|AMATOL|bahan peledak campuran antara trinitrotoluena dan amonium nitrat
2|BANJOL|sesudah itu
3|BANTAL|alas kepala, alas duduk, sandaran punggung
...
Dan Seterusnya.

Menyiapkan WordList Bahasa Indonesia

Sebelum menyiapkan wordlist, mari kita kenali target situs website yang akan di scrape. Bisa kalian lihat format url untuk melakukan pencarian kata adalah:

https://www.kamusbesar.com/<kata-katanya>
Contoh:
https://www.kamusbesar.com/bentol
https://www.kamusbesar.com/centil

Namun darimana kita bisa mendapatkan kosakata berbahasa indonesia yang begitu luas? Saat itu saya langsung kepikiran wordlist berbahasa Indonesia oleh Pak Jim Geovedi, tapi sedikit saya modifikasi isi wordlistnya karena terdapat beberapa kata tidak senonoh, kenapa saya hapus? Karena game quiz ini tujuannya untuk berpikiran positif, tidak sampai diluar konteks itu. Bisa lihat wordlist yang sudah diperbarui kesini.

Download keenam wordlistnya dan siapkan struktur direktorinya sehingga menjadi seperti ini:

📁 KNTL Quiz
📁 indonesian-wordlist
🗄️ 00-indonesian-wordlist.lst
🗄️ 01-kbbi3-2001-sort-alpha.lst
🗄️ 02-crawls-2005-sort-alpha.lst
🗄️ 03-indodict2008-sort-alpha.lst
🗄️ 04-myspell2006-sort-alpha.lst
🗄️ 05-ivanlanin2011-sort-alpha.lst
🗄️ Scrape Info.py
🗃️ KNTL Word.db

Setelah itu kita buat variabel list yang menyimpan nama-nama setiap file wordlist.

wordList = ['00-indonesian-wordlist.lst', 
'02-crawls-2005-sort-alpha.lst',
'04-myspell2006-sort-alpha.lst',
'01-kbbi3-2001-sort-alpha.lst',
'03-indodict2008-sort-alpha.lst',
'05-ivanlanin2011-sort-alpha.lst']
success, passed, failed = 0, 0, 0

Membuat Fungsi Untuk Cek Kriteria Kata

Coba kalian bayangkan dalam wordlist tersebut tidak hanya ada kata-kata terkait KNTL, ada banyak sekali yang diluar tujuan kita, bisa kalian lihat sendiri menggunakan text editor.

def cekKNTL(word):
keyword = 'KENTEL'
keyword = keyword.replace('E', 'O')
match = 0
if len(word) == 6:
for i in range(6):
if keyword[i] == word[i]:
match += 1
if match > 2:
return True
else:
return False
else:
return False

Pertama kita membuat fungsi cekKNTL() dengan parameter word. Parameter word hampir mirip seperti variabel, dia menyimpan kata-kata yang ingin di cek. Kita buat misalnya kata-kata yang ingin di cek adalah ‘BORGOL’. Maka pemanggilan fungsinya akan menjadi seperti ini:

word = 'BORGOL'
print(cekKNTL(word))

Hasilnya adalah True, kenapa? Mari kita ulas sambil melihat kode fungsi cekKNTL(). Pertama kita membutuhkan kata asli dari KNTL, untuk dijadikan referensi dari kode-kode setelahnya. Jadi pertama dibuatlah variabel keyword yang isinya ‘KENTEL’, namun kata itu bukanlah kata asli dari KNTL, maka saya ubah di variabel keyword di baris kedua menjadi kata aslinya. Ngapain pake variabel keyword di baris kedua bang, bukannya bisa langsung 1 baris aja? Bisa sih, cuman ga sopan jadinya 😅.

Lalu kita membuat if else untuk memastikan kata-kata pada parameter word itu panjangnya 6 huruf. Jika tidak, akan langsung menghasilkan nilai False.

Lalu jika panjangnya 6 huruf, maka setelahnya ada proses for loop yang melakukan pencocokan character-by-character antara variabel keyword dan parameter word. Setiap kecocokan karakter diantara keduanya, variabel match akan bertambah 1.

Ketika nilai match sudah lebih dari 2, fungsi akan menghasilkan nilai True. Bisa kita coba bayangkan, berapa banyak karakter yang cocok antara BORGOL dan K*NT*L? Ada 3, yaitu O di index ke-1 dan ke-4 lalu L di index ke-5. Maka kriteria yang diperlukan sudah cukup.

Membuat Proses Untuk Mendapatkan Kata-Kata KNTL

Disinilah inti dari keseluruhan proses perjalanan program.

Membuka dan membaca isi wordList

Mari kita bahas dari baris ke 28–32, disitu kita membuat perulangan for loop dengan referensi variabel wordList. Tetapi, kita tidak hanya membutuhkan nama filenya, karena filenya tidak berada didalam direktori yang sama, filenya terdapat pada folder indonesian-wordlist. Sehingga kita harus mengolahnya lagi pada variabel file di baris selanjutnya, jadi contoh hasilnya seperti ini:

indonesian-wordlist/00-indonesian-wordlist.lst

Setelah itu kita membuka filenya menggunakan fungsi open(), dan objeknya disimpan ke variabel openFile. Lalu variabel readFile hadir untuk membaca isi filenya dan menjadikannya list setiap katanya dengan menggunakan fungsi split(“\n”). Berikut contoh isi dari variabel readFile:

[‘amatol’, ‘banjol’, ‘bantal’, ‘banyol’, dan seterusnya…]

Tidak lupa juga terdapat variabel conndb, itu berguna untuk membuat koneksi ke database, sehingga program python 3 bisa melakukan operasi SQL pada database KNTLword.db menggunakan koneksi yang telah dibuat.

for file in wordList:
file = f'indonesian-wordlist/{file}'
conndb = sqlite3.connect("KNTLword.db")
openFile = open(file, encoding="ISO-8859-1")
readFile = openFile.read().split("\n")

Membuat perulangan dari setiap kata dalam wordList

Lalu dibuat lagi perulangan dengan referensi dari variabel list readFile sebelumnya. Tetapi kita masih tidak bisa memastikan, kata-kata dalam list readFile tersebut sudah bersih atau belum, mungkin ada spasi berlebihan dan kata-katanya bukan huruf besar. Maka kita olah lagi pada variabel word di baris selanjutnya, dengan fungsi strip() dan upper(). Mungkin kalian masih pusing apa kegunaannya, saya beri contoh:

Misalnya ‘borgol<space><space>’, itu menjadi ‘BORGOL’ tanpa spasi.

Setelah proses sebelumnya selesai, maka ada try except di proses selanjutnya, tapi kita bahas hal itu nanti di bagian akhir. Langsung ke kondisi if dimana akan memastikan panjangnya string dari variabel word ada 6 dan sesuai dengan kriteria dari fungsi cekKNTL() yang kita buat sebelumnya. Jika tidak, akan langsung dilewati proses setelah kondisi if. Namun jika sesuai kriteria, akan melanjutkan proses setelah kondisi if tersebut.

for word in readFile:
word = word.strip().upper()
try:
if len(word) == 6 and cekKNTL(word):
...

Melakukan permintaan HTTP & mengolah respon HTML

Disinilah kita akan melakukan permintaan HTTP dan mengelola respon HTML yang diberikan menjadi informasi yang diperlukan. Pertama variabel page melakukan permintaan HTTP ke situs KamusBesar diikuti dengan kata KNTL. Seperti inilah contoh full urlnya:

https://www.kamusbesar.com/BORGOL

Respon HTML yang diberikan benar-benar seperti source kode dari situs websitenya (berantakan). Maka kita memerlukan BeautifulSoup untuk merapihkannya.

Setelah variabel soup menyimpan respon HTML yang bisa diolah, sekarang kita lihat elemen yang mengandung deskripsi dari kata KNTL yang sedang di cek saat ini, bisa menggunakan Inspect Element. Terlihat di gambar berada pada elemen <span> didalam atribut class=”word_description”, mudah bukan?

Kita sudah tau elemen dan atribut yang menyimpan deskripsinya, maka kita tinggal membuat variabel page_body untuk menyimpan deskripsinya. Sintaxnya seperti berikut:

soup.findAll(elemen, {atribut:id})

Namun hasilnya belum spesifik deskripsi saja, jika kalian lihat hasil page_body itu berisi:

[<span class=”word_description”>belenggu tangan terbuat dr besi, berbentuk bulat, dapat ditutup dan dibuka dng memakai k
unci;</span>]

page = requests.get(f'https://www.kamusbesar.com/{word}')
soup = BeautifulSoup(page.content, 'html.parser')
page_body = soup.findAll('span', {'class': 'word_description'})

Mengolah respon HTML menjadi lebih spesifik

Sehingga kita harus mengolahnya lagi dengan potongan kode dibawah ini. Namun apakah kalian melihat kondisi if untuk page_body? Ada kalanya walau kata-katanya memenuhi kriteria, tetapi kata-kata tersebut tidak ada dalam kamus KBBI. Maka dibuatlah kondisi if untuk memastikan terdapat isi dari variabel page_body.

Lanjutt! Kita olah isi dari variabel page_body dengan variabel baru yaitu info, kita beralih ke variabel info pertama. Disitu kita melakukan konversi dari list menjadi string sepenuhnya, setelah itu kita split() dan hanya mengambil value dari index ke-0 sehingga menjadi:

‘[<span class=”word_description”>belenggu tangan terbuat dr besi, berbentuk bulat, dapat ditutup dan dibuka dng memakai kunci;’

Masih belum selesai kita harus mengolahnya lagi di variabel info baris selanjutnya, pertama kita akan mencari letak index yang valuenya ‘>’, setelah dapat ditambah 1. Lalu hasilnya saat itu menjadi:

belenggu tangan terbuat dr besi, berbentuk bulat, dapat ditutup dan dibuka dng memakai kunci;’

Masih ada pengolahan selanjutnya yang terjadi apabila terdapat lebih dari 1 makna, beruntungnya kata BORGOL hanya memiliki 1 makna. Jika ada lebih dari 1 makna itu pasti dipisahkan dengan ‘;‘ contoh kata CENTIL:

suka bergaya; genit;

Jika terdapat lebih dari 1 makna, maka akan diambil makna pertamanya saja. Contoh diatas yaitu menjadi:

suka bergaya

Hasil pengolahan di variabel info akan di masukkan kedalam database KNTLword.db dalam tabel KNTLword. Dengan masih menggunakan koneksi conndb sebelumnya, kita gunakan fungsi execute untuk menjalankan query INSERT. Syntax query tersebut adalah:

INSERT INTO tableName (columnName1, columnName2, seterusnya…) VALUES (valueColumn1, valueColumn2, seterusnya…)

Jadi kita ambil contoh kita dari sebelumnya yang sedang di cek yaitu kata BORGOL. Maka querynya menjadi:

INSERT INTO KNTLword (word, word_desc) VALUES (‘BORGOL', 'belenggu tangan terbuat dr besi, berbentuk bulat, dapat ditutup dan dibuka dng memakai kunci')

Jangan lupa menggunakan fungsi commit() setiap selesai melakukan penulisan data kedalam database sqlite.

Jika selesai melakukan proses sebelumnya, variabel success akan ditambah 1 dan menampilkan output. Contoh output:

BORGOL: Success

if page_body:
info = str(page_body).split('</span>')[0]
info = info[info.index('>')+1::].replace('-', ';').split(';')[0]
conndb.execute(f"INSERT INTO KNTLword (word, word_desc) VALUES ('{word}', '{info}')")
conndb.commit()
success +=1
print(f'{word}: Success')

Menangani error

Seperti yang saya beritahu sebelumnya, ada kalanya kata-katanya sesuai kriteria tetapi tidak terdapat dalam kamus KBBI. Maka variabel passed ditambah 1.

Lalu ada kalanya juga kata-kata yang di masukkan sudah berada didalam database. Contoh sebelumnya kata-kata BORGOL sudah sukses dimasukkan, tapi kita tidak tau kan mungkin saja di file wordlist lain memiliki kata-kata BORGOL juga sehingga ketika itu dimasukkan ke dalam database, akan menampilkan error sqlite3.IntegrityError. Maka dari itu diperlukan try except untuk mengatasi error tersebut.

Ketika terjadi error tersebut, variabel failed akan bertambah 1 dan menampilkan output. Contoh output:

BORGOL: Failed

        else:
passed += 1
else:
pass
except sqlite3.IntegrityError:
failed += 1
print(f'{word}: Failed')

Menampilkan Hasil Scrapping

print(f'Success = {success} Word')
print(f'Failed = {failed} Word')
print(f'Passed = {passed} Word')

Full Source Code Scrapping KNTL

Game KNTL Quiz Repository: https://github.com/michael-act/HyperSkill/

Full Demo Video Scrapping KNTL

Pesan

Belajar web scrapping diharuskan punya dasar yang kuat terkait Python 3. Begitupun belajar bidang lainnya, harus memiliki dasar. Jadi saya sarankan sebelum kalian masuk ke materi belajar ini, fokuslah terlebih dahulu pada kelas-kelas belajar python dasar.

Terimakasih dan sampai jumpa di blog-blog selanjutnya✋.

Instagram: Do Exploit
Facebook: Do Exploit

--

--

Do Exploit

I share stories about what I've learned in the past and now. Let's connect to Instagram! @do.exploit