Beranda BlogPengikisan web Panduan komprehensif untuk web scraping dengan Selenium WebDriver dengan Python

Panduan komprehensif untuk web scraping dengan Selenium WebDriver dengan Python

oleh Kadek

Python adalah salah satu bahasa yang paling umum digunakan untuk menulis web scraper. Ada banyak perpustakaan, kerangka kerja, dan utilitas untuk ini, dari yang sederhana seperti perpustakaan Permintaan atau PycURL hingga yang lebih kaya fitur dan canggih seperti Selenium atau Puppeteer.

Namun, Selenium adalah perpustakaan terpopuler kedua setelah Permintaan yang memungkinkan Anda mencari halaman web statis dan konten halaman web dinamis. Anda dapat dengan mudah menyimpan data yang diterima, termasuk file CSV.

Memulai dengan Selenium WebDriver

Untuk mengekstrak data situs web dengan Selenium, Anda memerlukan tiga hal: Python, Selenium, driver web, dan browser. Dalam tutorial ini kita menggunakan Python 3.11. Jika Anda tidak memilikinya atau menggunakan Python 2, Anda perlu mengunduh juru bahasa Python versi terbaru. Untuk menginstal Selenium, cukup gunakan pip di command prompt:

pip install selenium

Selenium mendukung hampir semua browser populer. Untuk menggunakannya, Anda memerlukan driver web yang sesuai, yang harus sesuai dengan versi browser yang diinstal. Browser web yang paling umum digunakan adalah Chrome, Firefox, dan Edge.

Alternatifnya, Anda dapat menginstal WebDriver menggunakan Web Driver Manager. WebDriver yang diperlukan akan diunduh dan diinstal secara otomatis. Anda dapat menginstal dan mengakses Webdriver Manager sebagai perpustakaan Python biasa:

pip install webdriver-manager

Ini adalah opsi termudah untuk mengotomatiskan browser web, jadi Anda tidak perlu khawatir tentang pencocokan versi dan menemukan driver web yang tepat.

Interaksi dengan situs web

Kami akan menggunakan Chromium WebDriver dalam contoh ini karena ini adalah yang paling populer. Untuk contoh ini, kami akan mengunduh versi yang diperlukan secara manual dan menempatkannya di drive C. Seperti disebutkan sebelumnya, Anda juga dapat menggunakan perpustakaan Webdriver Manager untuk bekerja dengan Selenium.

Sebelum kita menjelajahi semua fitur Selenium, mari kita luncurkan jendela browser. Untuk melakukan ini, kita hanya perlu mengimpor perpustakaan ke dalam skrip, menentukan jalur ke file driver web dan menjalankan perintah start:

from selenium import webdriver
DRIVER_PATH = 'C:\chromedriver.exe' #or any other path of webdriver
driver = webdriver.Chrome(executable_path=DRIVER_PATH)

Jika semuanya benar, Anda akan melihat jendela Chrome:


Pengemudi Web Chrome
Pengemudi Web Chrome

Anda kemudian dapat menavigasi ke halaman yang diinginkan atau melakukan tindakan yang diperlukan.

driver.get('https://example.com/')

Hasilnya Anda akan melihat sesuatu seperti ini:


Ambil halaman
Ambil halaman dengan WebDriver

Tentu saja, Anda juga bisa mendapatkan kode HTML seluruh halaman untuk diedit lebih lanjut atau dicetak di layar:

print(driver.page_source)

Untuk menutup sesi browser dengan semua tab dan menyelesaikan eksekusi skrip, gunakan metode ini:

driver.quit()

Selenium adalah alat canggih yang dapat digunakan untuk berbagai tujuan termasuk web scraping. Sangat mudah untuk dipelajari dan digunakan serta mendukung penyeleksi XPath dan CSS, membuatnya sangat fleksibel.

Sesuaikan ukuran Windows

Selenium menyediakan sejumlah properti dan metode untuk mengontrol jendela browser. Ini memungkinkan Anda mengubah ukuran, posisi, dan status layar penuh jendela. Misalnya, Anda bisa menggunakan metode set_window_size() untuk mengubah ukuran jendela. Metode ini membutuhkan dua argumen: lebar dan tinggi jendela.

driver.set_window_size(800, 600)

Untuk memaksimalkan jendela, Anda dapat menggunakan metode maxim_window().

driver.maximize_window()

Untuk meminimalkan jendela, Anda dapat menggunakan metode minim_window().

driver.minimize_window()

Anda dapat menggunakan metode set_window_position() untuk memposisikan jendela. Metode ini membutuhkan dua argumen: koordinat x dan y dari jendela.

driver.set_window_position(100, 100)

Anda dapat menggunakan metode fullscreen_window() untuk mengatur jendela ke mode layar penuh.

driver.fullscreen_window()

Jika Anda ingin mengetahui ukuran jendela saat ini dan tidak ingin mengubahnya, Anda dapat menggunakan metode berikut:

driver.get_window_size()

Pengaturan spesifik yang Anda gunakan bergantung pada kebutuhan Anda. Metode ini memungkinkan Anda mengontrol perilaku jendela browser sesuai kebutuhan.

Mode tanpa kepala Chrome

Browser tanpa kepala adalah browser web tanpa antarmuka pengguna grafis (GUI) yang dikontrol melalui antarmuka baris perintah.

Biasanya pendekatan ini digunakan agar jendela browser yang terbuka tidak mengganggu proses scraping dan tidak menyia-nyiakan sumber daya PC. Dalam mode tanpa kepala, browser menghapus semua elemen GUI dan membiarkannya berjalan tanpa pengawasan di latar belakang, sehingga mengurangi konsumsi sumber daya lebih dari 10 kali lipat.

Untuk menggunakan mode tanpa kepala, cukup tambahkan yang berikut ini:

options = driver.ChromeOptions() 
options.headless = True 

Setelah itu, jendela browser tidak akan terbuka dan data akan tergores di latar belakang.

Cara menemukan elemen situs web

Untuk mendapatkan isi suatu elemen atau elemen, Anda harus mengidentifikasinya terlebih dahulu. Selenium menawarkan berbagai pencari lokasi untuk membantu Anda dalam hal ini. Metode yang paling umum adalah dengan menggunakan pemilih CSS:

element = driver.find_element_by_css_selector("#price")

Anda juga dapat menggunakan XPath:

element = driver.find_element_by_xpath("/html/body/div/p")

Selain itu, Selenium mendukung pencari lokasi populer lainnya seperti tag, ID, dan nama elemen:

element = driver.find_element_by_name("element_name")
element = driver.find_element_by_id("element_id")
elements = driver.find_elements_by_tag_name("a")

Jika Anda perlu bekerja dengan tautan, mereka memiliki pencari lokasi terpisah. Anda dapat menggunakan metode ini untuk menemukan elemen jangkar berdasarkan teks tautannya:

element = driver.find_element_by_link_text("Link Text")

Atau melalui teks tautan sebagian:

element = driver.find_element_by_partial_link_text("Partial Link")

Untuk menghapus semua link dari suatu halaman, Anda dapat menggunakan kombinasi metode lokasi elemen Selenium dan loop untuk mengulangi semua link di halaman:

all_links = driver.find_elements_by_tag_name("a")

for link in all_links:
    print(link.get_attribute("href")) 

Seperti yang Anda lihat, Selenium mendukung pencari lokasi yang cukup untuk menemukan elemen apa pun di mana pun pada halaman. Anda juga dapat menggunakan beberapa pencari lokasi untuk menemukan suatu elemen, misalnya dengan menemukan orang tua dan anak dalam orang tua tersebut.

Menunggu item ada

Menunggu keberadaan elemen adalah konsep penting dalam otomatisasi web dengan Selenium. Halaman web sering kali bersifat dinamis dan elemennya mungkin memerlukan waktu untuk muncul. Anda harus menerapkan strategi menunggu untuk memastikan skrip otomatisasi Anda bekerja dengan andal.

Saat bekerja dengan Selenium, Anda memiliki dua pilihan: menunggu halaman dimuat selama jangka waktu tertentu, atau menunggu elemen tertentu dimuat. Opsi mana yang tepat untuk Anda bergantung pada tujuan proyek Anda dan situs web spesifik yang Anda jelajahi. Untuk menunggu dalam jangka waktu tertentu, Anda dapat menggunakan fungsi berikut:

driver.implicitly_wait(10)

Anda dapat menggunakan pendekatan berbeda untuk menunggu elemen tertentu dimuat di halaman. Impor modul tambahan terlebih dahulu:

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By

Kemudian tambahkan tanda centang setiap 10 detik untuk melihat apakah item yang Anda butuhkan sudah dimuat:

wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "element_id")))

Jika elemen ditemukan dalam waktu ini, elemen tersebut akan ditugaskan ke variabel elemen dan proyek Python Anda dapat dilanjutkan. Penantian eksplisit lebih spesifik dan dapat digunakan untuk kondisi tertentu, misalnya elemen terlihat atau dapat diklik.

Atasi tantangan pengikisan

Kecoa memang menantang, tetapi selenium dapat membantu Anda mengatasi beberapa kendala. Menggunakan browser tanpa kepala, Selenium dapat meniru perilaku pengguna sebenarnya. Jadi mari kita lihat beberapa tantangan web scraping yang paling umum dan bagaimana perpustakaan Selenium dapat membantu Anda mengatasi tantangan ini.

Lewati perlindungan anti-scraping dengan Python dengan Selenium Web Scraping

Melewati perlindungan anti-scraping dengan Selenium dengan Python bisa menjadi tugas yang rumit. Situs web menggunakan berbagai mekanisme untuk melacak dan menangkap pencakar secara otomatis. Oleh karena itu, untuk menghindari hal ini, Anda perlu melakukan pendekatan yang komprehensif dan menyembunyikan perilaku scraper sebanyak mungkin agar terlihat seperti perilaku manusia biasa.

Pertama, situs web sering kali memeriksa string agen pengguna di header permintaan HTTP untuk mengidentifikasi bot otomatis. Anda dapat menyiapkan agen pengguna khusus untuk meniru browser sebenarnya dan mengurangi kemungkinan deteksi. Misalnya:

options = webdriver.ChromeOptions()
options.add_argument("user-agent=Mozilla/5.0 (X11; CrOS x86_64 8172.45.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.64 Safari/537.36")
driver = webdriver.Chrome(options=options)

Anda juga dapat menerapkan penundaan antar permintaan untuk meniru perilaku manusia. Anda dapat menggunakan time.sleep() untuk menjeda eksekusi selama durasi tertentu. Hal ini dapat membantu menghindari terpicunya mekanisme pembatasan tarif di situs web target.

import time

time.sleep(2)

Untuk memanusiakan perilaku scraper, Anda dapat menjaga konsistensi sesi dengan mengelola cookie dan sesi secara efektif. Simpan dan gunakan kembali cookie untuk menghindari login terus-menerus dan menjaga informasi sesi antar permintaan.

Menggunakan Proxy dengan Selenium Wire

Penting untuk menggunakan proxy saat menyalin situs web karena beberapa alasan:

  1. Ada peluang untuk mengatasi batasan jumlah permintaan ke situs.
  2. Karena banyaknya permintaan, scraper dianggap sebagai serangan DDoS.
  3. Kurangnya proxy mengurangi keamanan dan privasi aktivitas online.

Sayangnya, Selenium hanya menawarkan dukungan proxy terbatas. Sebagai opsi driver, Anda dapat menambahkan proxy tanpa otentikasi.

proxy = "12.345.67.890:1234" 
options.add_argument("--proxy-server=%s" % proxy)

Namun, untuk kenyamanan lebih, Selenium mendukung penggunaan server proxy dan proxy dengan otentikasi. Untuk melakukan ini, Anda perlu menginstal paket Selenium tambahan:

pip install selenium-wire

Anda kemudian dapat menggunakan fungsi dengan otentikasi:

options = {
    "proxy": {
        "http": f"http://{proxy_username}:{proxy_password}@{proxy_url}:{proxy_port}",
        "verify_ssl": False,
    },
}

Artikel ini tidak menjelaskan di mana menemukan penyedia proxy gratis atau berbayar, apa itu proxy, dan cara menggunakannya dengan Python. Namun, Anda dapat menemukan semua informasi ini di artikel kami yang lain.

Teknik tingkat lanjut

Selenium adalah kerangka kerja yang awalnya dirancang untuk pengujian. Ini berarti ia memiliki fungsi yang lebih luas daripada perpustakaan scraping pada umumnya. Berikut beberapa tip untuk meningkatkan fungsi scraper dengan selenium.

Cara mengklik item

Mengklik elemen adalah interaksi mendasar dalam otomatisasi web dengan Selenium. Selenium memungkinkan Anda mencari dan mengklik berbagai elemen halaman web, termasuk link, tombol, kotak centang, dan banyak lagi.

Jika Anda ingin mengklik tautan tertentu (elemen jangkar) di halaman web, Anda dapat menggunakan Selenium untuk menemukan tautan tersebut dan kemudian menggunakan metode click() untuk berinteraksi dengannya:

link = driver.find_element_by_xpath("//a(@href)")
link.click()

Anda juga dapat menggunakan metode ini untuk berinteraksi dengan berbagai jenis elemen halaman web, termasuk tombol, tombol radio, kotak centang, dan lainnya:

button = driver.find_element_by_id("button_id")
button.click()

radio_button = driver.find_element_by_name("radio_button_name")
radio_button.click()

Anda dapat menggunakan klik item untuk mengirimkan formulir, mengirim data, atau menavigasi melalui proses multi-langkah. Kemampuan untuk mengklik elemen memungkinkan Anda mensimulasikan interaksi pengguna, menjadikannya ideal untuk tugas web scraping.

Mengisi formulir dengan Selenium Web Driver

Hampir setiap website memiliki form, baik itu filter maupun form autentikasi. Formulir web berisi kolom input, kotak centang, tombol radio, formulir pencarian, link, menu drop-down, dan tombol kirim untuk mengumpulkan data pengguna.

Untuk menerima data dari formulir dan mentransfernya kembali, pertama-tama seseorang harus menemukan formulir lalu memasukkan teks atau memilih nilai yang disarankan.

kotak masukan

Bentuk yang paling umum adalah kolom input. Bidang masukan adalah bidang teks yang menyimpan data yang dimasukkan oleh pengguna. Untuk menggunakannya, Anda perlu memahami bagaimana informasi dimasukkan (metode send_keys()), dihapus (metode clear()), dan bagaimana teks masukan diambil (metode get_attribute()). Misalnya:

driver.find_element_by_id('here_id_name').send_keys("Test")
driver.find_element_by_id('here_id_name').clear()
nameTest = driver.find_element_by_id('here_id_name').get_attribute("value")

kotak centang

Kotak centang adalah kotak kecil yang memiliki dua opsi: centang atau hapus centang. Namun, sebelum memilih kotak centang, seseorang harus mengetahui statusnya saat ini, karena pilihan kedua akan mengubahnya menjadi sebaliknya.

Untuk pemeriksaan seperti itu, Anda dapat menggunakan variabel Boolean (0 atau 1, Benar atau Salah, dll.). Ini akan mencetak True jika kotak centang sudah dicentang, atau False jika belum:

acc_boolean = driver.find_element_by_id('acception').is_selected()
print(type(acc_boolean))

Untuk mengklik tombol di situs web atau kotak centang, cukup gunakan:

driver.find_element_by_id('acception').click()

Untuk mengirimkan formulir menggunakan Selenium, cukup panggil metode submit() pada elemen formulir, bukan click().

Unduh file menggunakan Selenium

Selenium memungkinkan Anda mengotomatiskan proses mengklik tautan atau tombol unduh, menentukan lokasi unduhan, dan mengelola file yang diunduh.

Untuk mendownload file, cukup identifikasi item yang berisi link download dan klik di atasnya, seperti pada contoh sebelumnya. Namun, Anda juga dapat menentukan direktori tempat file akan disimpan sebelum mengklik:

options.add_experimental_option("prefs", {
    "download.default_directory": "/path/to/download/directory"
})

Untuk memastikan pengunduhan selesai sebelum melanjutkan, Anda dapat memberikan waktu tunggu, seperti: B. waktu tunggu implisit atau eksplisit, atau pantau folder unduhan untuk selesainya transfer file.

Berinteraksi dengan tab

Anda dapat menggunakan Selenium untuk membuka tab atau jendela baru dan menavigasi ke URL lain. Hal ini biasanya dicapai dengan menyimulasikan pintasan keyboard seperti Ctrl+T untuk tab baru dan kemudian beralih ke tab baru:

driver.find_element_by_tag_name('body').send_keys(Keys.CONTROL + 't')
driver.switch_to.window(driver.window_handles(1))

Untuk menutup tab aktif tanpa menutup browser, gunakan cara ini:

driver.close()

Ini hanya akan menutup tab saat ini jika tab lain terbuka. Jika tab saat ini adalah satu-satunya, browser juga akan ditutup.

Cara menjalankan JavaScript dengan Selenium dengan Python

Menjalankan JavaScript dengan Selenium dengan Python adalah fitur canggih yang memungkinkan Anda menjalankan kode JavaScript khusus dalam konteks halaman web. Ini bisa sangat berguna saat berinteraksi dengan elemen web, memodifikasi DOM, atau menangani skenario kompleks yang tidak dapat dicapai menggunakan perintah standar Selenium.

Anda dapat mengeksekusi kode JavaScript di Selenium menggunakan metode mengeksekusi_script() yang disediakan oleh instance WebDriver (biasanya dikaitkan dengan instance browser). Misalnya:

result = driver.execute_script("return 2 + 2")

Anda dapat menggunakan JavaScript untuk berinteraksi dengan elemen yang tidak dapat langsung diakses melalui perintah Selenium biasa. Misalnya, Anda dapat mengubah properti CSS suatu elemen agar terlihat.

Memblokir gambar dan JavaScript

Memblokir gambar dan JavaScript dapat membantu meningkatkan kinerja web scraping Selenium. Saat mengakses situs web dengan Selenium untuk tujuan pengikisan, Anda mungkin tidak perlu memuat dan merender semua sumber daya seperti gambar dan JavaScript, karena elemen ini dapat memperlambat proses secara signifikan.

Gambar adalah salah satu elemen yang paling banyak menggunakan sumber daya di situs web. Saat melakukan scraping data, terutama data berbasis teks, Anda dapat menonaktifkan pemuatan gambar untuk mempercepat prosesnya. Di Selenium Anda dapat mengonfigurasi Chrome WebDriver untuk menonaktifkan gambar:

options.add_argument("--disable-images")

Menonaktifkan gambar dapat mengurangi waktu pemuatan halaman web secara signifikan. Untuk menonaktifkan JavaScript Anda juga dapat menggunakan opsi:

options.add_argument("--disable-javascript")

Pendekatan ini lebih ekstrem dan mungkin hanya cocok untuk beberapa situs web, karena banyak situs yang mengandalkan JavaScript untuk fungsionalitas inti.

Gulir ke bawah halaman

Anda dapat menggunakan Selenium untuk mensimulasikan pengguliran ke bawah halaman web. Ini sangat berguna ketika Anda perlu mengakses konten yang hanya terlihat saat menggulir. Cara termudah untuk menggulir ke bawah di Selenium adalah dengan menggunakan JavaScrip:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

Alternatifnya, Anda dapat menyimulasikan pengguliran dengan mengirimkan kunci “END” ke elemen body. Jika Anda ingin menangani pengguliran tak terbatas, Anda dapat menggunakan loop untuk menggulir dan mengumpulkan data hingga tidak ada lagi konten yang dimuat:

while(1):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")
    # Save or proccess your data here

Perlu diingat bahwa penerapan spesifik pengguliran dapat bervariasi tergantung pada struktur dan perilaku situs web. Oleh karena itu, Anda mungkin perlu menyesuaikan kode Anda.

Ambil tangkapan layar

Mengambil tangkapan layar halaman web secara terprogram menggunakan Selenium dan bahasa pemrograman Python adalah fitur yang berguna untuk pengikisan, pengujian, dan pemantauan web. Selenium memungkinkan Anda mengambil tangkapan layar seluruh halaman web atau elemen tertentu dalam suatu halaman.

Anda dapat menggunakan perintah ini untuk mengambil tangkapan layar seluruh halaman web, termasuk konten yang mungkin perlu digulir:

driver.save_screenshot("page.png")

Anda juga dapat mengambil tangkapan layar elemen tertentu di laman web berdasarkan posisi dan ukurannya. Misalnya, untuk mengambil tangkapan layar tombol dengan pemilih CSS tertentu:

element = driver.find_element_by_css_selector("#button")
element.screenshot("element_screenshot.png")

Anda dapat menyimpan screenshot dalam berbagai format file seperti PNG, JPEG dan BMP dengan menentukan ekstensi file yang diinginkan saat memanggil metode save_screenshot(). Jadi, Anda dapat menggunakan Selenium untuk mengambil tangkapan layar untuk tugas pengikisan dan pemantauan Anda.

Kesimpulan dan temuan

Selenium adalah kerangka kerja Python yang populer dan kuat untuk web scraping. Ini dapat digunakan untuk mengekstrak data dari halaman web dan melakukan tindakan pada halaman tersebut, seperti masuk atau menavigasi antar halaman. Selenium juga relatif mudah dipelajari dan digunakan dibandingkan dengan kerangka scraping lainnya seperti Puppeteer.

Selenium sangat cocok untuk menangani konten yang dimuat secara dinamis di situs web. Tidak seperti perpustakaan lain yang mungkin kesulitan mengekstrak data yang hanya muncul setelah interaksi pengguna atau permintaan AJAX, Selenium dapat dengan mudah menavigasi medan ini. Fitur ini berguna untuk situs web modern dan kaya data yang mengandalkan JavaScript untuk memuat informasi.

Selenium adalah alat yang ampuh untuk pengikisan dan otomatisasi web. Ini dapat memproses data dinamis, meniru interaksi manusia, dan mengotomatiskan tindakan web, menjadikannya pilihan pertama bagi pengembang dan pakar data.

Pos terkait

Tinggalkan Komentar