Scraping Market Place dengan Selenium

Web scraping terhadap market place cukup populer, salah satu indikatornya adalah banyak permintaan di situs bagi freelancer. Dalam tulisan ini kita akan melakukan scraping sederhana pada salah satu market place di Indonesia.

Jika pada tulisantulisan sebelumnya penulis banyak menggunakan Scrapy, kali ini kita akan menggunakan Selenium. Sebab utamanya adalah karena mayoritas market place menggunakan javascript untuk me-load halamannya dan Selenium yang mengotomasi browser, secara default sudah mendukung itu.

Teknologi yang akan kita gunakan:

Instalasi Selenium

Selenium dapat digunakan pada banyak bahasa pemrograman seperti Ruby, Java, JavaScript, C# dan Python. Kita akan menggunakan, tentu saja, Python.

Peramban yang didukung Selenium juga beragam, Edge, IE, Safari, Opera, Chrome dan Firefox. Kita sudah mencoba Chrome, sekarang saatnya mencoba yang lain, Firefox.

Python

Mudah saja, cukup ketik di command prompt/console/terminal.

pip install selenium

Firefox

Bagian ini juga mudah, cukup unduh dari sini.

Pada saat tulisan ini dibuat, versi Gecko Driver terbaru adalah 0.26.0. Driver ini mendukung versi Firefox minimal 60. Karena itu jika pembaca tidak ingin mengunduh Firefox, cukup pastikan versi Firefox yang terpasang adalah versi 60 dan setelahnya.

Untuk yang belum mengetahuinya, versi Firefox dapat dilihat di menu Help > About Firefox.

Gecko Driver

Dari halaman ini, pilih yang sesuai dengan platform yang Anda gunakan.

Kemudian ekstraksi berkas tersebut. Dalam contoh, penulis mengekstraksi di partisi d sehingga gecko driver akan beralamat di “d:\geckodriver.exe“.

Selenium Sederhana

Kita akan mulai dari kode sangat sederhana kemudian meningkatkan tantangan dengan menggabungkan Selenium Python dengan OpenPyXL.

Kode Sangat Sederhana

Kode di bawah ini hanya akan membuka blog ini di browser, menunggu lima detik kemudian browser ditutup.

import time
from selenium import webdriver

driver = webdriver.Firefox(executable_path="d:\geckodriver.exe")
driver.get("https://basangdata.com")

time.sleep(5)

driver.close()

Parameter executable_path diisi dengan alamat gecko driver, sila sesuaikan dengan kondisi pembaca.

Kode Sederhana

Tulisan ini bertujuan mendemokan scraping data dari market place. Kasus yang kita hadapi adalah bagaimana mendapatkan url penjual dari data produk yang kita punyai.

Sebagai ilustrasi, kita memiliki berkas excel bernama mp.xlsx dengan kolom A berisi url produk dan kolom B yang harus diisi dengan url penjual. Kode kita akan menyimpan hasil kerjanya pada berkas excel baru bernama mp_url.xlsx.

Url supplier adalah gabungan dari https://shopee.co.id/ + username. Tugas kita adalah mencari elemen yang berisi username.

Hasil observasi beberap url produk, ternyata username tersebut ada di dalam elemen div dengan kelas _3Lybjn.

Sila membaca tulisan sebelumnya jika pembaca belum mengetahui bagaimana caranya mendapatkan elemen tersebut.

Kode selengkapnya adalah.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
from openpyxl import load_workbook

wb = load_workbook('mp.xlsx', data_only=True)

driver = webdriver.Firefox(executable_path="d:\geckodriver.exe")
delay = 3 # Menunggu selama 3 detik
root_url = 'https://shopee.co.id/'

for ws in wb.worksheets:
    max_row_a = ws.max_row + 1
    
    for row_a in range(2, max_row_a):
        url = ws['A' + str(row_a)].value
        url_username = ''
        if url:
            driver.get(url)
            
            try:
                wait_username = WebDriverWait(driver, delay).until(EC.presence_of_element_located((By.CLASS_NAME, '_3Lybjn')))
                url_username = root_url + driver.find_element(By.CLASS_NAME, '_3Lybjn').text
            except TimeoutException:
                url_username = ''
        
        ws['B' + str(row_a)].value = url_username

driver.close()
wb.save('mp_url.xlsx') # Simpan sebagai berkas excel baru

Banyak class Selenium Python yang dimpor terutama karena kode kita harus menunggu hingga elemen _3Lybjn di-load oleh browser. Eksepsi digunakan agar kode kita tidak berhenti di tengah jalan jika terjadi kesalahan.

Kode di atas menggunakan By.CLASS_NAME untuk mendapatkan elemen berdasarkan kelasnya. Silahkan merujuk pranala ini untuk mendapatkan berbagai metode seleksi elemen yang didukung Selenium Python.

Jika pembaca ingin menjalankan Selenium secara headless (browser tidak ditampilkan), tambah dan sesuaikan bagian kode ini.

from selenium.webdriver.firefox.options import Options # Ini ditambahkan

options = Options() # Ini ditambahkan
options.headless = True # Ini ditambahkan

driver = webdriver.Firefox(executable_path="d:\geckodriver.exe", options=options) # Ini diubah

Cover Photo by Charles Deluvio on Unsplash

Leave a Reply

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