Download Banyak Soal Sekaligus untuk Belajar di Rumah

Perubahan besar tengah terjadi, mendesak peran dan tanggungjawab baru yang harus diemban oleh orang tua. Menjadi guru adalah salah satunya.

Kode Lima Detik

from bs4 import BeautifulSoup
import requests
import shutil

for i in range(1, 11):
    url = 'https://www.greatschools.org/gk/worksheets/page/' + str(i) + '/?grade=5th-grade&category=math-2'
    
    source = requests.get(url).text
    
    soup = BeautifulSoup(source, features='lxml')
    
    contents = soup.find_all('div', class_='content-row')
    
    for content in contents:
        li = content.find('li')
        a = li.find('a')['href']
        
        wsSource = requests.get(a).text
        wsSoup = BeautifulSoup(wsSource, features='lxml')
        button = wsSoup.find('a', class_='btn-secondary')['href']
        
        # Download pdf
        mainUrl = 'https://www.greatschools.org'
        if mainUrl in button:
            url = button
        else:
            url = mainUrl + button
        print(url)
        r = requests.get(url, allow_redirects=True)

        filename = 'gs/' + button.split('/')[-1]
        open(filename, 'wb').write(r.content)

shutil.make_archive('gs_zipped', 'zip', 'gs')

Latar Belakang

John Doe terperajat ketika tiba-tiba saja sekolah anak-anaknya ditutup. “Untuk kebaikan mereka, anak-anak akan bersekolah dari rumah. Sekolah akan mengirimkan bahan belajar yang dapat dikerjakan di rumah”, begitu tutur kepala sekolah, melalui aplikasi perpesanan. Meninggalkan John tercenung sendiri, gelagapan mencerna keadaan.

Bapak tiga anak ini tidak pernah menyangsikan bahwa ia adalah penanggungjawab utama dari pendidikan anak-anaknya. Namun tidak secepat dan sebentuk ini juga keleus.

Anak tertua John sekarang kelas 5, adiknya kelas 3 dan si bungsu belum sekolah. Bergantian dengan istrinya, hari-hari John selanjutnya diisi dengan memandu dua anaknya bersekolah dari rumah, tentu sambil juggling dengan tugas-tugasnya sendiri sebagai pekerja rendahan di kantor.

Dipaksa keadaan untuk mengerjakan tugas sekolah anaknya, akhirnya John justru tergelitik untuk memberi pengayaan. “Hmm, tugas dari sekolah masih menyisakan banyak waktu. Ketimbang anak-anak nganggur, kenapa ga dikasih soal-soal untuk dikerjakan aja?” Ide John, yang merupakan bencana baru bagi kedua anaknya.

Setelah diskusi alot dengan kedua anak dan ibu mereka, diputuskan bahwa anak-anak akan mendapat pengayaan matematika dalam bentuk mengerjakan soal. Di sisi anak, mereka sepakat dengan ide itu, namun dengan syarat mereka mendapatkan upah atas “jam lembur” tersebut. Si Kakak minta dibayar dengan tambahan jam bermain game, adiknya mengajukan tambahan jatah menu makanan sesuai keinginannya.

Selesai dengan urusan tawar menawar, tugas John selanjutnya adalah mencari soal yang akan dikerjakan anak-anaknya.

Karena tidak ingin anaknya lebih lama di depan komputer atau tablet, John memutuskan untuk mencari soal dalam bentuk file yang dapat dicetak untuk kemudian dikerjakan anak-anaknya menggunakan pensil.

Sebagai milenial, apalagi pernah makan bangku kuliah komputer, John tahu internet adalah tujuannya.

Setelah beberapa kali percobaan akhirnya ditemukan kata kunci yang sesuai, yaitu “math 5th grade“. Menggunakan keyword itu, mesin pencari memberikan daftar situs yang menyediakan soal matematika dalam bentuk pdf yang dapat didownload. Beberapa situs bahkan mau repot-repot menyediakan soal beserta kunci jawaban alih-alih hanya soal.

Greatschools adalah salah satu penyedia soal-soal yang dibutuhkan John. Saat John menemukannya, situs itu menyediakan 93 soal untuk kelas 5 dan sebanyak 258 soal untuk kelas 3.

Mengetahui banyaknya soal yang disediakan membuat John gembira namun menyisakan sedikit pertanyaan, “apa iya kudu downloadin atu-atu? Bisa siwer donk my eyes.”

Penjelajahan internet tambahan mempertemukan John dengan konsep web scraping yang memungkinkannya untuk mendownload banyak hal dari internet, misalnya soal berbentuk pdf.

John merasa web scraping memerlukan dirinya memprogram sendiri kode untuk mendownload soal-soal yang dibutuhkannya. Untungnya diantara sedikit hal yang ia ingat dari perkuliahan dulu adalah pemrograman, selain kenangan buruk tentang teman tanpa kontribusi yang satu-satunya perjuangan dilakukan hanya saat menitipkan nama pada tugas kelompok.

John mencari teknologi yang dapat digunakan untuk mencapai tujuannya. Guru dadakan ini telah membaca soal Scrapy, Selenium bahkan menggunakan Excel untuk melakukan web scraping. Namun teknologi-teknologi itu sepertinya terlalu kompleks untuk kebutuhan sederhananya.

John memutuskan untuk menggunakan teknologi yang lebih bersahaja yaitu Requests dan Beautiful Soup. Google Colab dipilih sebagai sarana menjalankan kode karena John sudah punya akun Google, “lagian platform itu menawarkan koneksi internet jadi bisa dipake buat download“, pikir John.


Teknologi Digunakan

Requests

Library python ini memungkinkan pengguna untuk membuat HTTP requests. Mudahnya seperti membuka situs web melalui browser, bedanya dilakukan melalui kode.

Dalam kode yang akan ditulis John, Requests bertugas “membuka” situs Greatschools dan menyimpan file html/pdf dalam memory komputer.

Saat bekerja, Requests hanya membutuhkan link yang akan dibuka. Tugas John (programmer) untuk memberikan link tersebut, baik secara manual maupun menggunakan kode lain.

Beautiful Soup

File html yang telah dibuka oleh Requests perlu “dibaca” agar dapat diambil bagian-bagian yang dibutuhkan. Itulah peran Beautiful Soup.

Beautiful Soup akan membantu mencari link yang perlu dibuka untuk menuju halaman berisi file pdf. Di halaman yang dituju, Beautiful Soup mengambil link download soal kemudian memberikan link tersebut pada Requests.

Tugas selanjutnya dilakukan oleh Requests yaitu mendownload file pdf berdasarkan link yang diberikan Beautiful Soup.

Google Colab

Google Colaboratory atau umumnya disebut “Google Colab” atau “Colab” adalah produk Google yang memungkinkan siapapun menulis dan menjalankan kode Python melalui browser.

Kode yang akan ditulis John adalah kode Python yang mendayagunakan Requests dan Beautiful Soup. Kode tersebut butuh dijalankan, baik di komputer sendiri maupun menggunakan platform online seperti Google Colab.

Selain Colab, sebenarnya ada beberapa pilihan lain namun John memilih untuk tidak menambah panjang daftar pihak yang memiliki datanya.


Langkah Kerja

Dalam melakukan web scraping, setidaknya ada dua langkah yang perlu ditempuh John, yaitu:

  1. Secara manual melakukan “kegiatan” pada web seperti mengetik link, mencari link halaman selanjutnya dan melakukan klik pada tombol download. Sembari melakukan prosedur tersebut, John mengamati elemen html apa yang dioperasikan.
  2. Menulis kode untuk mengotomasi pekerjaan manual sebelumnya.

Prosedur Manual

Pertama John ingin mendownload soal untuk Si Kakak di kelas 5.

Halaman awal

Yang dituju adalah https://www.greatschools.org/gk/worksheets/page/1/?category=math-2&grade=5th-grade diketik secara manual oleh John.

Terdapat 93 soal yang dibagi menjadi 10 soal tiap halaman. Untuk berpindah pada halaman selanjutnya, John perlu melakukan klik pada navigasi halaman (dalam bentuk tombol dengan nomor berurutan) di bagian bawah halaman.

Di halaman 10 hanya terdapat 3 soal, tentu saja. Karena 9 halaman dikali 10 soal pada masing-masing halaman hasilnya adalah 90, sehingga 3 sisa soal akan ada di halaman terakhir.

Navigasi Halaman

Jika tombol navigasi, misal pada angka 2, pada browser diklik kanan maka akan muncul pilihan Inspect Element.

Yang akan menunjukkan tag html yang digunakan oleh elemen tersebut.

Dari gambar di atas John tahu bahwa link masing-masing halaman hanya dibedakan dengan angka halaman sehingga format link adalah.

link = 'https://www.greatschools.org/gk/worksheets/page/' + NomorHalaman + '/?grade=5th-grade&category=math-2'

NomorHalaman bisa diganti angka 1 sampai 10.

John mencatat dalam kepalanya mengenai halaman 1 sampai 10 tersebut, “kode akan membuka masing-masing halaman itu”, gumamnya.

Pilih Salah Satu Soal

Langkah selanjutnya adalah membuka salah satu soal, dengan mengklik gambar soal (atau area di sampingnya) pada masing-masing halaman. Namun karena pekerjaan itu akan dilakukan kode, John perlu mencari tahu elemen html area tersebut.

Area tersebut berisi sebuah link menuju soal. Link itu sendiri ada di dalam sebuah elemen div dengan class bernama content-row. John menulis di buku kecilnya urutan elemen tersebut.

  1. elemen div dengan class content-row
  2. elemen li
  3. elemen a, ambil hrefnya!

Untuk memastikan elemen dengan class bernama content-row adalah elemen yang benar, John melakukan pencarian elemen dengan mengetik “.content-row” pada area di bawah kata Inspector.

Ada sebelas elemen yang mengandung kata content-row, namun yang pertama adalah bagian dari Javascript sehingga bukan elemen yang berisi link soal. Sepuluh sisanya adalah elemen yang benar berisi link yang diperlukan. Dan sepuluh adalah jumlah yang sama dengan jumlah soal tiap halaman.

Sepertinya John sudah menemukan yang dicarinya.

Soal

John mengklik salah satu link pada elemen dengan class bernama content-row, menyebabkan browser berpindah ke halaman soal.

Hmm, sepertinya tombol hijau lucuk ini berisi harta karun yang kucari”, gumam John sambil mengelus dagunya. Klik kanan dan Inspect Element menampilkan elemen html tombol tersebut.

Attribut href menunjukkan link menuju sebuah file pdf. Namun attribut tersebut tidak lengkap, “ga ada tulisan http ato wewewe-nya”, gumam John lagi. “Coba klik aja, deh.”

Browser langsung melakukan download pada file. “Sepertinya benar tombol ijo itu untuk download file”, pikir John. “Tapi linknya kan kaga lengkap?” sambungnya lagi, masih dalam pikiran yang sama.

Untuk memastikan link download file, John menyalin link file terakhir yang didownload browser.

Link yang didapat adalah.

https://www.greatschools.org/library/cms/50/25250.pdf

Sedangkan link pada attribut href tombol hijau tadi adalah.

/library/cms/50/25250.pdf

“Ooo. gitu, jadi tinggal nambahin https://wewewe dot greatschools dot org doank inimah.”

Kini John siap untuk mulai mengetik kodenya.

Kode

Google Colab

Sesaat setelah membuka Colab John membuat sebuah New Notebook.

Folder Baru

Folder ini akan digunakan untuk menyimpan file pdf hasil download.

Untuk membuat folder baru, klik ikon Folder di bagian kiri Colab.

Kemudian klik kanan dan pilih New Folder.

Beri nama, misalnya, gs.

Impor Library

Kode diketik pada area di sebelah kanan ikon play (lingkaran merah dengan segitiga di dalamnya). Yang pertama perlu dilakukan adalah mengimpor library yang dibutuhkan

from bs4 import BeautifulSoup
import requests
import shutil

Dua library teratas telah dibahas sebelumnya, yang belum adalah library shutil, John memerlukan itu untuk merubah folder gs menjadi zip, agar mudah didownload ke komputernya.

Kemudian jalankan kode dengan menekan tombol play atau menggunakan kombinasi Shift + Enter.

Navigasi Halaman

Kode berikutnya adalah otomasi dari prosedur buka 10 halaman yang sebelumnya dilakukan secara manual.

for i in range(1, 11):
    url = 'https://www.greatschools.org/gk/worksheets/page/' + str(i) + '/?grade=5th-grade&category=math-2'
    source = requests.get(url).text
    soup = BeautifulSoup(source, features='lxml')

Variabel url didapatkan dengan menggabungkan link dengan angka (yang berganti dari 1 sampai 10). Variabel tersebut kemudian diberikan kepada Requests untuk dibuka.

File html yang dibuka oleh Requests kemudian disimpan dalam variabel source. Selanjutnya Beautiful Soup bertugas membaca file html tersebut.

Pilih Salah Satu Soal

contents = soup.find_all('div', class_='content-row')

for content in contents:
    li = content.find('li')
    a = li.find('a')['href']

Variabel contents berisi semua elemen div yang memiliki class bernama content-row.

Berdasarkan catatan di buku kecil John, variabel contents ini akan ada sebanyak 10, kemudian di masing-masingnya terdapat elemen li. Pada elemen li terdapat elemen a yang perlu diambil attribut hrefnya.

Soal

Atribut href dari elemen a berisi link untuk masing-masing soal. Requests kemudian membuka link (dari atribut tersebut) lalu disimpan dalam variabel wsSource. Sampai di sini kode telah berada di halaman dengan tombol hijau.

Variabel button berisi atribut href pada tombol hijau, yang menurut istilah John, “ga ada tulisan wewewe-nya” (meski setelahnya diralat karena kedapatan tombol hijau yang beratribut href lengkap dengan www).

wsSource = requests.get(a).text
wsSoup = BeautifulSoup(wsSource, 'lxml')
button = wsSoup.find('a', class_='btn-secondary')['href']        
    
# Download pdf
mainUrl = 'https://www.greatschools.org'
if mainUrl in button:
    url = button
else:
    url = mainUrl + button

print(url)
r = requests.get(url, allow_redirects=True)

filename = 'gs/' + button.split('/')[-1]
open(filename, 'wb').write(r.content)

Variabel mainUrl berisi alamat utama Greatschools, jika link dari tombol hijau mengandung teks dari mainUrl maka variabel url cukup menggunakan link dari tombol hijau. Bila link dari tombol hijau tidak mengandung teks dari mainUrl, variabel url adalah gabungan dari mainUrl dan link tersebut.

Variabel url inilah yang berisi link ke file pdf, harta karun yang dicari John. Requests digunakan untuk mengambil file itu, lalu disimpan dalam variabel r. Variabel r tersebut kemudian disimpan dalam bentuk file pdf dalam folder gs.

Kode untuk Download

Jika digabungkan kode di atas maka menjadi seperti ini.

from bs4 import BeautifulSoup
import requests
import shutil

for i in range(1, 11):
    url = 'https://www.greatschools.org/gk/worksheets/page/' + str(i) + '/?grade=5th-grade&category=math-2'
    
    source = requests.get(url).text
    
    soup = BeautifulSoup(source, features='lxml')
    
    contents = soup.find_all('div', class_='content-row')
    
    for content in contents:
        li = content.find('li')
        a = li.find('a')['href']
        
        wsSource = requests.get(a).text
        wsSoup = BeautifulSoup(wsSource, features='lxml')
        button = wsSoup.find('a', class_='btn-secondary')['href']
        
        # Download pdf
        mainUrl = 'https://www.greatschools.org'
        if mainUrl in button:
            url = button
        else:
            url = mainUrl + button
        print(url)
        r = requests.get(url, allow_redirects=True)

        filename = 'gs/' + button.split('/')[-1]
        open(filename, 'wb').write(r.content)

Saat dijalankan, kode akan menampilkan link file pdf yang sedang didownload (kode: print(url)). John perlu menampilkan itu agar ia tahu kodenya sedang mengerjakan apa.

File pdf yang didownload disimpan dalam folder gs.

Zip Agar Makin Sip

Kode John berhasil melaksanakan tugasnya dengan baik. Namun ia lagi-lagi enggan untuk melakukan tugas berulang, yaitu mendownload satu per satu file pdf di folder gs. John ingin lebih mudah (lagi).

shutil.make_archive('gs_zipped', 'zip', 'gs')

Kode di atas membuat sebuah file bernama gs_zipped berekstensi zip yang berisi semua yang ada di dalam folder gs.

Sekarang John bisa mendownload file gs_zipped.zip, cukup dengan mengklik kanan.


Simpulan

Benar jika John perlu menginvestasikan waktu untuk (belajar) membuat kode di atas. Namun inventasi tersebut lebih dari sepadan dengan manfaat yang dirasakannya.

Ia tidak perlu mendownload satu per satu soal, yang jelas akan membuatnya bosan dengan cepat. Lagipula jika John ingin mendapatkan soal untuk kelas lain, misal di tahun ajaran baru nanti, ia cukup mengganti sedikit saja kodenya.

Bahkan jika kita, ya, John adalah kita,

ingin mendownload soal lain dari situs lain, pengetahuan yang didapat dari proses ini dapat diterapkan lagi. Perlu modifikasi di beberapa bagian, namun secara umum prosedur yang ditempuh akan sama.


Referensi


Cover Image by tjevans From Pixabay

2 Replies to “Download Banyak Soal Sekaligus untuk Belajar di Rumah”

Leave a Reply

Your email address will not be published. Required fields are marked *