Teman-teman pasti tahu kalau Python itu salah satu bahasa pemrograman populer yang bisa dipakai di banyak bidang. Sebutin aja, mulai dari machine learning, data science, web development, bahkan system administration pun bisa dilibas sama si Python. Nah, Python juga seringnya jadi andalan ketika developer mau bikin sistem atau program automation seperti web scraper.
Emang Boleh Se-Automation Ini?
Kalian juga pasti tahu, automation udah jadi topik yang selalu hangat di dunia industri. Apa-apa yang ribet dan manual, pasti pengennya dibikin otomatis. Bener, nggak?
💻 Mulai Belajar Pemrograman
Belajar pemrograman di Dicoding Academy dan mulai perjalanan Anda sebagai developer profesional.
Daftar Sekarang“Ngapain cape-cape ngerjain tugas beginian kalau bisa dikerjain sama mesin”, kata orang yang udah lelah dengan tugas yang repetitif.
Nah, itulah fungsinya automation. Intinya, automation adalah proses otomatisasi yang bisa menyelesaikan tugas-tugas repetitif dengan efisien. Kita nggak perlu lagi melakukan suatu hal secara manual.
Dalam dunia IT, automation punya peran yang amat penting buat ningkatin produktivitas dan efisiensi. Dari sekian banyak bentuk automation, salah satu yang banyak digandrungi dan diadopsi saat ini–terutama sebagai ladang pembelajaran buat pemula–adalah web scraping.
Pada tahu nggak nih web scraping itu apa? Yuk, kita kulitin.
Masih Manual? Yang Bener Aje, Rugi Dong!
Itu mungkin kata-kata yang bakal keluar kalau kita masih menolak automation.
Seperti yang tadi sudah dibahas, salah satu bentuk implementasi automation adalah web scraping. Web scraping adalah teknik pengambilan data dari sebuah website secara otomatis.
Teknik ini tuh berguna banget untuk banyak hal, mulai dari pengumpulan informasi, analisis pasar, penelitian akademis, monitoring berita dan media sosial, bahkan sampai penegakan hukum. Keren, ya?
Nggak sampai di situ, web scraping juga sering digunakan oleh para data scientist untuk menganalisis sentimen media sosial, prediksi pergerakan saham, pemantauan persaingan bisnis, dan banyak lagi.
Iya, dong. Jangan remehin kekuatan web scraping makanya.
Coba nih, mari kita berandai-andai. Anggap aja kamu seorang pengusaha yang ingin memantau harga produk pesaing di beberapa situs e-commerce untuk menentukan strategi penetapan harga. Gimana caranya?
Ketimbang kamu mengunjungi tiap website dan mengecek harga produk satu per satu, kamu bisa loh menggunakan teknik web scraping untuk secara otomatis ngumpulin data harga produk dari banyak situs e-commerce sekaligus. Setelah itu, datanya bisa dipakai untuk analisis tren harga dan identifikasi peluang untuk nentuin harga produk kamu deh. Simpel.
Nah, kita bisa bikin script untuk web scraping dengan mudah menggunakan bahasa pemrograman Python. Kerennya, kita sekalian akan melakukan bedah kode biar makin paham gimana proses penerapan Python untuk web scraping.
Udah siap? Mari kita berangkat.
Implementasi Web Scraper
Kali ini kita akan belajar membuat sebuah program automation sederhana menggunakan bahasa pemrograman python untuk web scraping. Kita akan coba mengumpulkan berbagai informasi terkait kelas-kelas yang ada di Dicoding, seperti nama kelas, jam belajar, rating, level, deskripsi, jumlah modul, dan total siswa terdaftar.
Mari kita mulai dari import module.
Import Module
Ada banyak python module yang tersedia untuk web scraping, di antaranya adalah Selenium dan BS4.
1 2 3 4 5 6 |
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.firefox.options import Options from bs4 import BeautifulSoup |
Pada baris kode di atas, kita mengimpor sejumlah kebutuhan supaya proses web scraping bisa jadi lebih lancar, antara lain:
- webdriver: antarmuka untuk mengotomatisasi browser web.
- By: untuk menentukan metode pencarian elemen dalam halaman web, seperti dengan ID, class, dan-lain-lain.
- expected_conditions: berisi kumpulan kondisi yang digunakan bersama dengan WebDriverWait untuk menunggu hingga kondisi tertentu terpenuhi sebelum melanjutkan eksekusi script.
- WebDriverWait: untuk menunggu hingga kondisi tertentu terpenuhi (misalnya, elemen muncul) sebelum melanjutkan eksekusi script.
- Options: untuk mengatur opsi saat menjalankan browser Firefox, seperti menjalankannya dalam headless mode (berjalan terprogram tanpa UI).
- BeautifulSoup: untuk menguraikan dan mengekstrak data dari dokumen HTML atau XML.
Dengan menggunakan kombinasi Selenium dan BS4 (BeautifulSoup), kita bisa mengotomatisasi interaksi dengan web browser (menggunakan Selenium) dan mengekstrak informasi yang diperlukan dari halaman web (menggunakan BeautifulSoup).
Konfigurasi WebDriver
Selanjutnya adalah kita perlu mengonfigurasi WebDriver untuk menyesuaikan dengan kebutuhan. Secara singkat, WebDriver itu adalah antarmuka untuk mengotomatisasi browser web.
Kodenya seperti ini.
1 2 3 4 5 6 7 |
# Function to scrape data from Dicoding def scraper(url): try: # Configure WebDriver to use headless Firefox options = Options() options.add_argument('-headless') driver = webdriver.Firefox(options=options) |
Baris kode di atas merupakan awal dari sebuah fungsi yang dirancang untuk melakukan web scraping dari situs web yang diinginkan.
Pertama, kita punya fungsi bernama scraper untuk memadukan semua proses web scraping. Fungsi ini menerima satu parameter yaitu url, yang merupakan URL dari halaman web yang akan di-scrape.
Terus, untuk konfigurasi WebDriver, kita menentukan opsi agar Selenium menggunakan browser Firefox dengan mode headless yang berarti browser tidak akan muncul saat proses scraping dilakukan.Kalau teman-teman simak, kita pakai blok try agar ketika suatu operasi terjadi kesalahan, kita dapat menangani error tersebut dengan baik.
Akses Website
Proses selanjutnya adalah mengakses website yang akan di-scrape. Ini contoh kodenya.
1 2 3 4 5 6 7 8 9 10 |
# Get the URL given driver.get(url) # Selenium will wait for a maximum of 5 seconds for an element matching the given criteria to be found. # If no element is found in that time, Selenium will raise an error. try: wait = WebDriverWait(driver, timeout=5) wait.until(EC.presence_of_element_located((By.ID, 'course-list'))) except: raise LookupError("There is no element specified") |
Pertama, kita suruh si WebDriver (sesi browser) untuk membuka URL yang telah diberikan.
Terus, lagi-lagi kita pakai blok try untuk menangani skenario di mana Selenium bakal nunggu maksimum 5 detik sampai dia menemukan elemen dengan ID ‘course-list’. Kalau elemen yang kita cari ketemu dalam batas waktu yang ditentukan (5 detik dalam kasus ini), eksekusi script akan dilanjutkan. Kalau nggak, Selenium bakal ngasih error.
Dengan ini, kode kita sudah menetapkan pengaturan awal dalam proses scraping dan menunggu hingga halaman web dimuat sepenuhnya sebelum melanjutkan eksekusi.
Parse HTML
Sekarang kita fokus pada penggunaan BeautifulSoup untuk menganalisis HTML dari halaman web yang tadi sudah dimuat oleh Selenium.
1 2 3 4 5 6 |
# BeautifulSoup will parse the URL content = driver.page_source soup = BeautifulSoup(content, 'html.parser') # Prepare the variable for JSON data courses = [] |
Pertama, kita mengambil source code HTML dari halaman web yang tadi sudah diakses oleh si WebDriver (Selenium).
Lanjut, source code HTML tadi diserahkan ke BeautifulSoup untuk diuraikan pakai HTML parser bawaan dari BeautifulSoup.
Nantinya, kita akan berinteraksi dengan variabel soup yang merupakan representasi struktur dokumen HTML untuk mengakses dan memanipulasi elemen-elemen yang diinginkan.
Selanjutnya, kita mendeklarasikan variabel courses sebagai list kosong. Variabel bakal kita pakai untuk mengumpulkan nilai-nilai yang akan diekstrak dari halaman web.
Ekstrak Informasi
Sekarang kita coba fokus ke penggunaan BeautifulSoup untuk mengekstrak informasi spesifik dari elemen HTML yang telah diuraikan sebelumnya.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
# BeautifulSoup will find the CSS class that contain product container for course in soup.find_all('div', class_='col-md-6 mb-3'): # Get the text from the specified element and assign them to the variables course_name = course.find('h5', class_='course-card__name').text course_hour = course.find_all('span', {'class':'mr-2'})[0].text course_summary = course.select('div.course-card__summary p')[0].text course_total_module = course.find_all('div', class_= 'course-card__info-item')[0].find_all('span')[0].contents[0] course_level = course.find('span', attrs={'class': None}).text # Not all courses in the list has rating, so we should manage it. # If it has rating, get the text. If none, set it to empty string. try: course_rating = course.find_all('span', {'class':'mr-2'})[1].text except IndexError: # Handle the case when no span elements with the specified class are found course_rating = '' # Not all courses in the list has total students, so we should manage it. # If it has total students, get the text. If none, set it to empty string. try: course_total_students = course.find_all('span', {'class':'mr-3'})[1].get_text() except: course_total_students = '' |
Kode di atas diawali dengan menggunakan BeautifulSoup untuk menemukan semua elemen div yang punya CSS class ‘col-md-6 mb-3’.
Dari elemen-elemen yang sudah ditemukan, kita mencari beberapa informasi berikut.
- course_name -> Informasi ini kita dapatkan lewat cari elemen h5 dengan class ‘course-card__name’ dan ambil teksnya.
- course_hour -> Kita mencari semua elemen span dengan atribut class yang sesuai dan mengambil teksnya.
- course_summary -> Menggunakan metode select() untuk memilih elemen div dengan class ‘course-card__summary’, kemudian memilih elemen p di dalamnya, dan mengambil teksnya.
- course_total_module -> Kode ini mencari semua elemen div dengan class ‘course-card__info-item’, kemudian mengambil teks dari elemen span pertama di dalamnya.
- course_level -> Kode ini mencari elemen span yang tidak memiliki atribut class dan mengambil teksnya. Ini adalah tingkat kursus.
- try – except blok pertama -> Blok try ini mencoba untuk menemukan elemen yang memiliki kelas CSS ‘mr-2’ yang menunjukkan rating kursus. Jika elemen ditemukan, teksnya akan diambil. Jika tidak ditemukan, akan menghasilkan IndexError, yang ditangkap oleh blok except dan rating kursus diatur menjadi string kosong.
- try – except blok kedua -> Blok try ini mirip dengan yang pertama, tetapi mencari elemen yang memiliki kelas CSS ‘mr-3’ yang menunjukkan jumlah total siswa dalam kursus. Jika elemen ditemukan, teksnya akan diambil. Jika tidak ditemukan, akan menghasilkan pengecualian, dan jumlah total siswa diatur menjadi string kosong.
Kamu bisa lihat bahwa kode di atas menggunakan berbagai variasi untuk menemukan elemen. Hal ini sengaja untuk menunjukkan ke teman-teman bahwa cara mencari elemen tidak hanya satu metode, melainkan banyak.
Penambahan Data
Baris kode berikutnya akan bertanggung jawab untuk memasukkan data yang telah diekstrak dari setiap kelas ke dalam variabel courses.
1 2 3 4 5 6 7 8 9 10 11 12 |
# Append the scraped data into courses variable for JSON data courses.append( { 'Course Name': course_name, 'Learning Hour': course_hour, 'Rating': course_rating, 'Level': course_level, 'Summary': course_summary, 'Total Modules': course_total_module, 'Total Students': course_total_students } ) |
Kamu bisa cermati kode di atas, kita pakai metode courses.append() buat nambahin data yang sudah didapatkan sebelumnya ke dalam list courses.
Setelah itu, di dalamnya kita menggunakan struktur data dalam bentuk dictionary yang berisi informasi yang telah diekstrak dari suatu kelas, mulai dari nama kelas, jam belajar, rating, level, deskripsi, jumlah modul, hingga total siswa terdaftar.
Setiap informasi kelas disimpan dengan format key:value, di mana key mewakili jenis informasi dan value sebagai representasi nilai dari informasi tersebut.
Dengan kayak gini, tiap kali kita nemuin kelas lain di halaman itu, informasi terkait kelas tersebut bakal ditambahkan ke dalam list courses.
Nah, pas proses scraping selesai, list courses akan berisi semua data yang sudah diekstrak dan siap buat diproses lebih lanjut. Misalnya, ingin disimpan dalam format JSON atau digunakan untuk analisis data.
Penutupan Sesi
Setelah berhasil mengambil berbagai informasi, kita perlu menutup sesi WebDriver yang telah digunakan untuk scraping dan mengembalikan hasil scraping pada variabel courses.
1 2 3 4 |
# Close the WebDriver driver.quit() return courses |
Sintaks driver.quit() adalah perintah yang dipakai untuk menutup sesi WebDriver yang telah dibuka sebelumnya. Metode quit() ini digunakan untuk mengakhiri semua proses yang terkait dengan sesi WebDriver, termasuk menutup browser window dan menghapus semua proses yang terkait.
Setelahnya, kita mengembalikan variabel courses yang berisi data hasil scraping. Dengan kita tutup sesi WebDriver dan mengembalikan hasil scraping, si fungsi scraper() sudah menyelesaikan tugasnya. Fungsi ini nantinya dapat dipanggil dari bagian lain dalam kode Python untuk melakukan scraping dari situs web Dicoding; dan hasilnya dapat digunakan sesuai kebutuhan.
Penanganan Error
Kita sudah bahas semua blok try, tentu tidak lengkap kalau tidak ada bagian except untuk menangani error atau kesalahan yang terjadi selama proses scraping.
1 2 3 4 5 6 |
except Exception as e: # Print the error message print('An error occurred: ', e) # Close the WebDriver driver.quit() |
Baris kode di atas akan menangkap semua jenis error atau kesalahan yang bisa saja terjadi selama proses scraping yang dilakukan pada blok try dan menyimpannya dalam variabel e.
Kemudian, program ini akan mencetak pesan kesalahan untuk menerangkan apa yang sebenarnya terjadi. Ini akan membantu kita dalam pemecahan masalah dan memahami sumber masalah saat proses scraping mengalami kesalahan.
Terakhir, setelah mencetak pesan error, sesi WebDriver bakalan ditutup. Ini penting buat mastiin kalau semua sumber daya yang terkait dengan sesi WebDriver, seperti browser dan proses terkait dihentikan dengan benar.Jadi, kendati terjadi kesalahan selama proses scraping, program akan berhenti dengan elegan.
Pemanggilan Fungsi Scraper
Setelah sebelumnya kita fokus ke fungsi scraper() untuk menuliskan teknik dalam melakukan web scraping, sekarang kita bedah gimana sih cara menggunakan si fungsi scraper() tadi.
1 2 3 4 5 6 7 8 9 10 11 12 |
# import the modules to support the scraping process import json if __name__ == '__main__': # Define the URL url = 'https://www.dicoding.com/academies/list' data = scraper(url) # Save data to JSON file with open('dicoding_data.json', 'w') as json_file: json.dump(data, json_file, indent=4) |
Singkat saja, pada baris kode ini kita mengimpor module yang dibutuhkan, seperti json untuk memproses data dalam format JSON.
Lalu, kita mendeklarasikan variabel bernama url yang berisi URL dari halaman web yang akan di-scrape, dalam hal ini adalah halaman daftar kelas di Dicoding.
Variabel url digunakan sebagai argumen saat memanggil fungsi scraper(). Hasil dari proses scraping kemudian disimpan dalam variabel data.
Terakhir, program ini akan menyimpan data hasil scraping ke berkas bernama dicoding_data.json. File ini digunakan untuk menyimpan data hasil scraping dalam format JSON.
Hasil
Waktunya menguji coba! Bila kita menjalankan script ini tersebut, ia akan menghasilkan berkas dicoding_data.json seperti berikut.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[ { "Course Name": "Belajar Analisis Data dengan Python", "Learning Hour": "30 Jam", "Rating": "4,83", "Level": "Pemula", "Summary": "Pelajari berbagai konsep dasar analisis data beserta tahapannya, dilengkapi pembahasan studi kasus menggunakan bahasa pemrograman Python. ", "Total Modules": "61 Modul", "Total Students": "26.692 Siswa Terdaftar" }, { "Course Name": "Belajar Tools Front-End Web Intermediate", "Learning Hour": "65 Jam", "Rating": "4,79", "Level": "Mahir", "Summary": "Pelajari tools berstandar industri dengan Sass, Bootstrap, Lit, Axios, dan Firebase dalam membangun aplikasi web yang efisien dan powerful.", "Total Modules": "131 Modul", "Total Students": "1.283 Siswa Terdaftar" }, ... ] |
Selesai!
Penutup
Akhirnya usai juga tutorial membuat automation sederhana menggunakan bahasa pemrograman python. Kita sudah berhasil mengumpulkan informasi kelas Dicoding menggunakan teknik web scraping.
Program automation seperti ini sangat berguna dalam berbagai kasus penggunaan di industri IT, termasuk untuk mengumpulkan data dari internet secara otomatis untuk analisis lebih lanjut.
Sekarang kita jadi tahu nih bahwa Python tuh nggak cuma bisa membuat aplikasi atau layanan yang canggih, tetapi juga bisa membantu kita dalam meningkatkan efisiensi dan produktivitas pekerjaan sehari-hari.
Selanjutnya, coba teman-teman bikin automation sederhana versi kalian sendiri. Semangat!