Beranda BlogPengikisan web Cara menggulir halaman menggunakan Selenium dengan Python

Cara menggulir halaman menggunakan Selenium dengan Python

oleh Kadek

Selenium adalah kerangka kerja terkemuka untuk mensimulasikan interaksi pengguna di browser web. Ini adalah landasan dalam pengujian perangkat lunak dan ekstraksi data. Meskipun kami merinci panduan Selenium Python untuk pemula di artikel sebelumnya, fokus kami di sini adalah pada fungsi inti: menggulir.

Artikel ini memberikan tutorial Python sederhana tentang berbagai teknik pengguliran dan penerapan praktisnya. Kami akan mempelajari berbagai metode, mulai dari pengguliran sederhana hingga skenario yang lebih kompleks, untuk memastikan Anda memahami cara menggunakan fitur pengguliran Selenium secara efektif.

Menggunakan Pelaksana JavaScript

Metode pengguliran yang paling sederhana dan paling umum digunakan adalah dengan menjalankan kode JavaScript di Chromedriver yang mengimplementasikan fungsionalitas yang diperlukan. JavaScript mengizinkan tiga jenis pengguliran utama, mengabaikan perbedaan horizontal dan vertikal:

  1. Gulir ke posisi tertentuIni juga termasuk menggulir ke atas atau bawah halaman.
  2. Gulir ke item tertentu. Jika kita tidak mengetahui target gulir yang tepat tetapi mengetahui elemen targetnya, kita dapat dengan mudah menggulir halaman web ke elemen tersebut.
  3. Gulir ke koordinat tertentuIni berguna ketika Anda perlu menggulir sejumlah piksel tertentu dari posisi saat ini.

Mari kita lihat contoh praktis dan tulis kode sederhana untuk mengimplementasikan tipe gulir ini. Untuk semua contoh di artikel ini, kami menggunakan templat berikut:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains

url = "https://demo.opencart.com/"

chrome_options = Options()
driver = webdriver.Chrome(options=chrome_options)
driver.get(url)

# Here will be code

driver.quit()

Hanya bagian setelah menavigasi ke halaman yang akan berubah. Di sini kami telah memuat modul yang diperlukan dari perpustakaan Selenium. Di bawah ini kami hanya memberikan contoh scrolling sehingga Anda dapat menggunakan template ini untuk menjalankannya.

Gulir ke item tertentu

Karena menggulir ke posisi tertentu atau berdasarkan koordinat memerlukan metode serupa, kita akan membahasnya nanti. Pertama, mari fokus menggulir ke elemen tertentu. Untuk melakukan ini kita memerlukan cara untuk mengidentifikasi elemen ini. Pemilih CSS, XPath, atau metode lain dapat digunakan.

Mari kita coba menggulir ke elemen dengan ID tertentu menggunakan JavaScript. Karena setiap item hanya dapat memiliki ID unik, ini adalah cara yang dapat diandalkan untuk mengidentifikasinya. Namun, hanya beberapa elemen yang memiliki ID, jadi pendekatan ini terkadang hanya praktis. Jadi pertama-tama kita temukan elemen yang diinginkan lalu gulir ke sana:

element = driver.find_element(By.ID, "carousel-banner-1")
driver.execute_script("arguments(0).scrollIntoView(true);", element)

Kode ini pada dasarnya berlaku untuk setiap elemen. Metode By mendukung berbagai cara untuk menemukan elemen tertentu. Kode dapat disesuaikan dengan skenario yang berbeda hanya dengan mengubah metode pencarian dan data yang digunakan untuk mengidentifikasi item target.

Gulir ke posisi tertentu

Saat kita ingin menggulir ke posisi tertentu pada suatu halaman web, biasanya kita menggunakan window.scrollTo(x, y) Fungsi. Dimana x dan y mewakili koordinat absolut pada halaman. Untuk menggulir secara horizontal, sesuaikan nilai x, dan untuk menggulir secara vertikal, ubah nilai y.

Karena pengguliran vertikal lebih umum, kami akan fokus pada pengguliran ke atas dan ke bawah. Skrip ini menggulir halaman hingga ke bawah dengan mengatur koordinat Y ke tinggi total teks dokumen:

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

Untuk menggulir kembali ke atas, kita atur x dan y ke 0 dan letakkan sudut kiri atas area pandang di asal dokumen:

driver.execute_script("window.scrollTo(0, 0);")

Jika Anda mengetahui ketinggian pasti yang ingin Anda gulirkan, Anda dapat mengatur nilai Y secara manual. Namun perlu diingat bahwa koordinat ini bersifat mutlak dan tidak bergantung pada posisi gulir Anda saat ini.

Gulir berdasarkan koordinat

Menggulir berdasarkan koordinat sangat mirip dengan menggulir ke posisi tertentu. Perbedaan utamanya adalah posisi menggunakan nilai absolut, sedangkan pengguliran berdasarkan koordinat menunjukkan perubahan relatif terhadap posisi saat ini. Ini dilakukan dengan menggunakan window.scrollBy(x, y) Fungsi.

Karena fungsi ini melakukan perubahan posisi relatif terhadap posisi saat ini, nilainya dapat ditetapkan positif dan negatif. Saat digulir ke kanan dan ke bawah nilainya positif, saat digulir ke atas atau ke kiri bernilai negatif.

Misalnya untuk menggulir ke bawah 500 piksel, Anda dapat menggunakan kode berikut:

driver.execute_script("window.scrollBy(0, 500);")  

Untuk menggulir ke atas 500 piksel:

driver.execute_script("window.scrollBy(0, -500);")

Untuk menggulir ke kanan:

driver.execute_script("window.scrollBy(500, 0);")

Untuk menggulir ke kiri:

driver.execute_script("window.scrollBy(-500, 0);")

Anda dapat mengubah nilai x dan y secara bersamaan dengan menggulir secara diagonal.

Menggunakan Kelas Aksi

Selenium juga menawarkan serangkaian fungsi khusus yang disebut “Tindakan” yang memungkinkan emulasi komprehensif interaksi pengguna nyata di halaman web. Tindakan ini mencakup gerakan mouse, penekanan tombol, dan menggulir.

Untuk menggunakan fitur ini kita perlu membuat objek ActionChains:

actions = ActionChains(driver)

Kami menggunakan objek ini di kedua contoh, jadi kami mendefinisikannya terlebih dahulu untuk menghindari pengulangan.

Menggunakan rantai tindakan untuk menggulir ke suatu item

Mari kita replikasi contoh JavaScript menggunakan Action Chains Selenium. Cari item yang diinginkan menggunakan By.IDgulir ke item ini dan lakukan hal berikut:

element = driver.find_element(By.ID, 'carousel-banner-1')
actions.move_to_element(element).perform()

Ini akan memberi Anda hasil yang sama seperti solusi JavaScript kami sebelumnya. Namun, kekuatan rantai tindakan terletak pada kemampuannya untuk menyatukan berbagai tindakan. Misalnya, Anda dapat mencari item, mengklik item tersebut, dan memasukkan teks dalam satu urutan.

 actions.move_to_element(element).click().perform()

Hal ini sangat berguna untuk mengotomatiskan interaksi dengan dropdown, menu, dan formulir. Dengan menyatukan tindakan, Action Chains menyederhanakan tugas otomatisasi yang kompleks dibandingkan dengan menggunakan eksekusi JavaScript murni. Hal ini menjadikannya alat yang sangat berharga untuk proyek yang lebih besar.

Menggulir rantai tindakan menggunakan tombol keyboard

Opsi pengguliran lainnya adalah menggunakan tombol keyboard dalam rantai tindakan. Ini mirip dengan pengguliran keyboard biasa (yang akan kita bahas selanjutnya), namun bisa lebih nyaman saat menggabungkan tindakan.

Untuk menggulir ke atas atau ke bawah Anda dapat menggunakan kode ini:

actions.send_keys(Keys.PAGE_DOWN).perform() 
actions.send_keys(Keys.PAGE_UP).perform()

Jika Anda tidak memerlukan tindakan tambahan dan lebih memilih pendekatan yang lebih sederhana tanpa rangkaian tindakan, lihat bagian berikutnya untuk contoh sederhana pengguliran keyboard.

Untuk berinteraksi dengan tombol keyboard, pertama-tama kita perlu mengidentifikasi elemen target. Saat menggulir, kita berinteraksi dengan seluruh bagian halaman yang terlihat, yang biasanya terdapat dalam tag body.

body = driver.find_element(By.TAG_NAME, "body")

Setelah kita memiliki elemen body, kita dapat mensimulasikan penekanan tombol. Misalnya, untuk menggulir ke bagian atas halaman kita dapat menggunakan:

body.send_keys(Keys.HOME)

Dan untuk menggulir halaman ke bawah:

body.send_keys(Keys.END) 

Seperti yang Anda lihat, pendekatan ini mirip dengan menggunakan ActionChains, namun sedikit lebih sederhana.

Jika elemen web memiliki gaya yang memungkinkan pengguliran (seperti overflow: auto atau overflow: scroll), Anda dapat menggunakan Selenium dan JavaScript untuk menggulir dalam elemen ini.

Katakanlah kita memiliki elemen dengan ID 'scrollbar' di halaman kami yang ingin kami gulir. Pertama kita perlu menemukan elemen ini:

scrollable_element = driver.find_element(By.ID, 'scrollbar')

Lalu kita bisa gulir ke bawah:

driver.execute_script("arguments(0).scrollTop = arguments(0).scrollHeight;", scrollable_element)

Atau gulir ke atas:

driver.execute_script("arguments(0).scrollTop = 0;", scrollable_element)

Perhatikan bahwa Anda dapat menggulir seluruh halaman dan elemen tertentu di dalamnya.

Tip dan trik

Terkadang pertanyaan atau masalah spesifik muncul selama web scraping. Namun, dengan menggunakan keterampilan yang dijelaskan dalam artikel ini, Anda dapat mengatasi kesulitan ini dengan menggunakan sedikit trik.

Pengguliran tanpa batas

Pengguliran tak terbatas adalah teknik umum untuk memuat konten secara dinamis saat pengguna menggulir halaman ke bawah. Hal ini menciptakan aliran konten yang seolah tak ada habisnya seperti yang sering Anda lihat di media sosial dan situs berita.

Untuk mengimplementasikan Infinite Scroll dengan Selenium kita dapat menggunakan algoritma berikut:

  1. Membuat lingkaran. Perulangan ini terus-menerus menggulir halaman ke bawah.
  2. Cari konten baru. Setelah setiap pengguliran, periksa halaman untuk melihat apakah konten baru telah dimuat.
  3. Mengulang. Jika konten baru ditemukan, perulangan akan berlanjut, jika tidak, perulangan akan terhenti.

Contoh yang sudah selesai akan terlihat seperti ini:

while (True):
    driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
    time.sleep(2)

Untuk membuat perulangan menjadi terbatas, Anda dapat memperkenalkan penghitung atau pernyataan kondisional untuk mengakhiri perulangan ketika kondisi tertentu terpenuhi. Misalnya, Anda dapat berhenti menggulir setelah sejumlah iterasi tertentu atau ketika Anda menemukan elemen tertentu pada halaman.

Akurasi pengguliran

Tugas umum lainnya adalah menggulir ke tengah elemen tertentu. Kita dapat memodifikasi contoh sebelumnya dengan menggunakan metode scrollIntoView dengan opsi Perilaku dan Blokir:

driver.execute_script("arguments(0).scrollIntoView({ behavior: 'smooth', block: 'center' });", element)

Meskipun tugas ini kurang umum, penyelesaiannya bisa menjadi sangat penting dalam skenario tertentu.

Popup dan overlay

Popup adalah tantangan umum saat membuat web scraper atau mengotomatiskan tugas dengan Selenium. Mereka sering kali menghambat pengguliran dan secara signifikan menghambat proses otomatisasi Anda.

Untuk memperbaiki masalah ini, kami memperkenalkan teknik sederhana: sebelum menggulir, kami dapat mencoba menutup semua pop-up.

try:
    popup_close_button = driver.find_element(By.ID, 'popup_id')
    popup_close_button.click()
except:
    print("Pop-up not found.")

Blok kode ini mencoba menemukan elemen dengan ID “popup_id” dan kemudian mengkliknya untuk menutup popup. Blok coba-kecuali memastikan skrip tidak mogok jika tombol popup atau tutup tidak ditemukan.

Bingkai dan elemen bersarang

Untuk berinteraksi dengan elemen dalam iframe, Anda harus terlebih dahulu mengalihkan konteks ke dalam iframe. Setelah Anda berada di dalam, Anda dapat menerapkan prinsip yang sama yang telah kita bahas untuk menggulir elemen dengan overflow. Mari kita uraikan sebuah contoh.

Pertama, temukan iframe dengan ID yang ditentukan dan atur fokus pengemudi padanya:

iframe = driver.find_element(By.ID, 'iframe_id')
driver.switch_to.frame(iframe)

Setelah beralih ke iframe, Anda dapat menemukan elemen spesifik yang ingin Anda gunakan untuk berinteraksi dan menggulir di dalamnya:

nested_element = driver.find_element(By.ID, 'nested_element_id')
driver.execute_script("arguments(0).scrollIntoView(true);", nested_element)

Terakhir, untuk terus berinteraksi dengan elemen di dokumen utama, beralih kembali ke konten default:

driver.switch_to.default_content()

Langkah-langkah ini akan membantu Anda mengekstrak data secara efektif dari kontainer yang berisi konten dari sumber eksternal. Hal ini sangat berguna untuk mengotomatiskan tugas situs web yang menggunakan iframe untuk menyematkan konten pihak ketiga.

Kesimpulan dan temuan

Artikel ini membahas berbagai metode untuk mengimplementasikan pengguliran di Selenium menggunakan Python. Kami telah membahas teknik penting seperti menggunakan JavaScript Executor untuk menggulir ke elemen dan posisi tertentu dan menavigasi berdasarkan koordinat. Rantai tindakan disorot karena kemampuannya dalam mencapai pengguliran yang mulus dan menangani skenario kompleks seperti pengguliran menggunakan tombol keyboard dan menangani peristiwa penting.

Kami juga membahas topik lanjutan termasuk menangani elemen yang meluap, pengguliran tak terbatas, dan memastikan akurasi pengguliran. Ini juga memberikan solusi terhadap tantangan umum seperti mengelola pop-up, overlay, dan menggulir dalam bingkai dan elemen bersarang.

Dengan memahami dan menerapkan teknik ini, Anda dapat secara efektif mengikis, mengotomatiskan, dan menguji situs web dinamis, memastikan skrip yang kuat dan andal.

Pos terkait

Tinggalkan Komentar