Dalam tutorial terakhir kita belajar bagaimana memanfaatkan framework Scrapy untuk menyelesaikan tugas web scraping yang umum. Hari ini kita akan melihat Selenium [dengan Python ❤️ ] dalam tutorial langkah demi langkah
Selenium mengacu pada sejumlah proyek sumber terbuka berbeda yang digunakan untuk otomatisasi browser. Ini mendukung binding untuk semua bahasa pemrograman utama, termasuk bahasa favorit kami. Piton
Selenium API menggunakan protokol WebDriver untuk mengontrol browser web seperti Chrome, Firefox, atau Safari. Selenium dapat mengontrol keduanya, instance browser yang diinstal secara lokal, serta yang berjalan di mesin jarak jauh melalui jaringan
Awalnya [dan itu sudah sekitar 20 tahun sekarang. ], Selenium dimaksudkan untuk lintas-browser, pengujian ujung ke ujung [tes penerimaan]. Sementara itu, bagaimanapun, sebagian besar telah diadopsi sebagai platform otomatisasi browser umum [mis. g. untuk mengambil tangkapan layar], yang tentunya juga mencakup tujuan perayapan web dan pengikisan web. Jarang ada yang lebih baik dalam "berbicara" dengan situs web daripada browser yang sebenarnya dan tepat, bukan?
Selenium menyediakan berbagai cara untuk berinteraksi dengan situs, seperti
- Mengklik tombol
- Mengisi formulir dengan data
- Menggulir halaman
- Mengambil tangkapan layar
- Menjalankan kode JavaScript kustom Anda sendiri
Tetapi argumen terkuat yang mendukungnya adalah kemampuan untuk menangani situs dengan cara alami, seperti yang dilakukan browser mana pun. Ini terutama terlihat bersinar dengan situs Aplikasi Halaman Tunggal JavaScript-berat. Jika Anda menggores situs seperti itu dengan kombinasi tradisional klien HTTP dan pengurai HTML, sebagian besar Anda akan memiliki banyak file JavaScript, tetapi tidak begitu banyak data untuk dikorek
Instalasi
Meskipun Selenium mendukung sejumlah mesin browser, kami akan menggunakan Chrome untuk contoh berikut, jadi pastikan Anda telah menginstal paket berikut
- Halaman unduhan Chrome
- Biner ChromeDriver cocok dengan versi Chrome Anda
- Paket Selenium Python Binding
Untuk menginstal paket Selenium, seperti biasa, saya sarankan Anda membuat lingkungan virtual [misalnya menggunakan virtualenv] lalu
pip install selenium
Mulai cepat
Setelah Anda mengunduh, Chrome dan ChromeDriver dan menginstal paket Selenium, Anda harus siap untuk memulai browser
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_Karena kami tidak mengonfigurasi mode tanpa kepala secara eksplisit, ini sebenarnya akan menampilkan jendela Chrome biasa, dengan pesan peringatan tambahan di atas, yang mengatakan bahwa Chrome sedang dikendalikan oleh Selenium
Mode Tanpa Kepala Chrome
Menjalankan browser dari Selenium seperti yang baru saja kami lakukan sangat membantu selama pengembangan. Ini memungkinkan Anda mengamati dengan tepat apa yang terjadi dan bagaimana perilaku halaman dan browser dalam konteks kode Anda. Namun, setelah Anda puas dengan semuanya, umumnya disarankan untuk beralih ke mode tanpa kepala tersebut dalam produksi
Dalam mode itu, Selenium akan memulai Chrome di "latar belakang" tanpa keluaran visual atau jendela apa pun. Bayangkan sebuah server produksi, menjalankan beberapa instance Chrome secara bersamaan dengan semua jendelanya terbuka. Yah, server umumnya cenderung diabaikan dalam hal seberapa "perhatian" orang terhadap UI mereka - hal yang buruk ☹️ - tapi serius, tidak ada gunanya membuang sumber daya GUI tanpa alasan
Untungnya, mengaktifkan mode tanpa kepala hanya membutuhkan beberapa tanda
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
Kita hanya perlu membuat instance objek
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_8, menyetel bidang from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
9 ke from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
0, dan meneruskannya ke konstruktor WebDriver kita. SelesaiProperti Halaman WebDriver
Membangun contoh mode tanpa kepala kita, mari kita lengkapi Mario dan lihat situs web Nintendo
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
_Saat Anda menjalankan skrip itu, Anda akan mendapatkan beberapa pesan debug terkait browser dan akhirnya kode HTML nintendo. com. Itu karena panggilan
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
1 kami mengakses bidang from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
2 driver, yang berisi dokumen HTML dari situs yang terakhir kami mintaDua bidang WebDriver menarik lainnya adalah
3, untuk mendapatkan judul halamanfrom selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options[] options.headless = True options.add_argument["--window-size=1920,1200"] driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
4, untuk mendapatkan URL saat ini [ini berguna ketika ada pengalihan di situs web dan Anda memerlukan URL final]from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options[] options.headless = True options.add_argument["--window-size=1920,1200"] driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
Daftar lengkap properti dapat ditemukan di dokumentasi WebDriver
Menemukan Elemen
Untuk mengikis/mengekstrak data, Anda harus terlebih dahulu mengetahui di mana data itu berada. Oleh karena itu, menemukan elemen situs web adalah salah satu fitur utama dari pengikisan web. Secara alami, Selenium hadir dengan out-of-the-box [mis. g. kasus uji perlu memastikan bahwa elemen tertentu ada/tidak ada di halaman]
Ada beberapa cara standar bagaimana seseorang dapat menemukan elemen tertentu pada halaman. Misalnya, Anda bisa
- cari berdasarkan nama tag
- filter untuk kelas HTML atau ID HTML tertentu
- atau gunakan pemilih CSS atau ekspresi XPath
Khususnya untuk ekspresi XPath, saya sangat menyarankan untuk membaca artikel kami tentang bagaimana ekspresi XPath dapat membantu Anda memfilter pohon DOM. Jika Anda belum sepenuhnya mengenalnya, ini benar-benar memberikan pengantar pertama yang sangat bagus untuk ekspresi XPath dan cara menggunakannya
Seperti biasa, cara termudah untuk menemukan elemen adalah dengan membuka alat pengembang Chrome dan memeriksa elemen yang Anda perlukan. Pintasan keren untuk ini adalah menyorot elemen yang Anda inginkan dengan mouse Anda lalu tekan Ctrl + Shift + C atau di macOS Cmd + Shift + C alih-alih harus mengklik kanan dan memilih
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
5 setiap saat
Setelah Anda menemukan elemen di pohon DOM, Anda dapat menentukan metode terbaik, untuk menangani elemen tersebut secara terprogram. Misalnya, Anda dapat mengklik kanan elemen di inspektur dan menyalin ekspresi XPath absolut atau pemilih CSS
Metode find_element
WebDriver menyediakan dua metode utama untuk menemukan elemen
6from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options[] options.headless = True options.add_argument["--window-size=1920,1200"] driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
7from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options[] options.headless = True options.add_argument["--window-size=1920,1200"] driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
Mereka sangat mirip, dengan perbedaan bahwa yang pertama mencari satu elemen tunggal, yang dikembalikan, sedangkan yang terakhir akan mengembalikan daftar semua elemen yang ditemukan.
Kedua metode mendukung delapan jenis pencarian yang berbeda, ditunjukkan dengan kelas
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
8TypeDescriptionDOM SampleExamplefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
9Searches for elements based on their HTML IDfrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
0from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
1from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
2Searches for elements based on their name attributefrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
3from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
4from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
5Searches for elements based on an XPath expressionfrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
6from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
7from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
8Searches for anchor elements based on a match of their text contentfrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
9
.. some stuff
Super title
0
.. some stuff
Super title
1Searches for anchor elements based on a sub-string match of their text contentfrom selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
driver.get["//www.nintendo.com/"]
print[driver.page_source]
driver.quit[]
9
.. some stuff
Super title
3
.. some stuff
Super title
4Searches for elements Deskripsi lengkap tentang metode dapat ditemukan di sini
contoh find_element
Katakanlah, kita memiliki dokumen HTML berikut
.. some stuff
Super title
dan kami ingin memilih elemen
.. some stuff
Super title
5. Di sini, lima contoh berikut akan identik dalam apa yang mereka kembalikanh1 = driver.find_element[By.NAME, 'h1']
h1 = driver.find_element[By.CLASS_NAME, 'someclass']
h1 = driver.find_element[By.XPATH, '//h1']
h1 = driver.find_element[By.XPATH, '/html/body/h1']
h1 = driver.find_element[By.ID, 'greatID']
Contoh lain bisa jadi, untuk memilih semua tag jangkar/tautan di halaman. Karena kami menginginkan lebih dari satu elemen, kami akan menggunakan
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
7 di sini [harap perhatikan jamaknya]all_links = driver.find_elements[By.TAG_NAME, 'a']
Beberapa elemen tidak mudah diakses dengan ID atau kelas sederhana, dan saat itulah Anda membutuhkan ekspresi XPath. Anda juga mungkin memiliki banyak elemen dengan kelas yang sama dan terkadang bahkan ID, meskipun yang terakhir dianggap unik
XPath adalah cara favorit saya untuk menemukan elemen di halaman web. Ini adalah cara ampuh untuk mengekstrak elemen apa pun di halaman, berdasarkan posisi absolutnya di DOM, atau relatif terhadap elemen lain
Elemen Web Selenium
h1 = driver.find_element[By.NAME, 'h1']
h1 = driver.find_element[By.CLASS_NAME, 'someclass']
h1 = driver.find_element[By.XPATH, '//h1']
h1 = driver.find_element[By.XPATH, '/html/body/h1']
h1 = driver.find_element[By.ID, 'greatID']
_5 adalah objek Selenium yang mewakili elemen HTMLAda banyak tindakan yang dapat Anda lakukan pada objek tersebut, inilah yang paling berguna
- Mengakses teks elemen dengan properti
6h1 = driver.find_element[By.NAME, 'h1'] h1 = driver.find_element[By.CLASS_NAME, 'someclass'] h1 = driver.find_element[By.XPATH, '//h1'] h1 = driver.find_element[By.XPATH, '/html/body/h1'] h1 = driver.find_element[By.ID, 'greatID']
- Mengklik elemen dengan
_7h1 = driver.find_element[By.NAME, 'h1'] h1 = driver.find_element[By.CLASS_NAME, 'someclass'] h1 = driver.find_element[By.XPATH, '//h1'] h1 = driver.find_element[By.XPATH, '/html/body/h1'] h1 = driver.find_element[By.ID, 'greatID']
- Mengakses atribut dengan
8h1 = driver.find_element[By.NAME, 'h1'] h1 = driver.find_element[By.CLASS_NAME, 'someclass'] h1 = driver.find_element[By.XPATH, '//h1'] h1 = driver.find_element[By.XPATH, '/html/body/h1'] h1 = driver.find_element[By.ID, 'greatID']
- Mengirim teks ke input dengan ________36______9
Ada beberapa metode menarik lainnya seperti
all_links = driver.find_elements[By.TAG_NAME, 'a']
0. Ini mengembalikan from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
_0 jika suatu elemen terlihat oleh pengguna dan terbukti berguna untuk menghindari honeypots [e. g. elemen input yang sengaja disembunyikan]. Honeypots adalah mekanisme yang digunakan oleh pemilik situs web untuk mendeteksi bot. Misalnya, jika input HTML memiliki atribut all_links = driver.find_elements[By.TAG_NAME, 'a']
2 seperti ini
Nilai input ini seharusnya kosong. Jika bot mengunjungi halaman dan yakin perlu mengisi semua elemen input dengan nilai, itu juga akan mengisi input tersembunyi. Pengguna yang sah tidak akan pernah memberikan nilai pada bidang tersembunyi itu, karena tidak ditampilkan oleh browser sejak awal
Itu honeypot klasik
Contoh lengkap
Berikut adalah contoh lengkap menggunakan metode API Selenium yang baru saja kita bahas
Kami akan masuk ke Hacker News
Tentu saja, mengautentikasi ke Hacker News tidak terlalu berguna dengan sendirinya. Namun, Anda dapat membayangkan membuat bot untuk memposting tautan ke posting blog terbaru Anda secara otomatis
Untuk mengotentikasi kita perlu
- Buka halaman login menggunakan
3all_links = driver.find_elements[By.TAG_NAME, 'a']
- Pilih bidang input nama pengguna menggunakan
_4 lalu panggilall_links = driver.find_elements[By.TAG_NAME, 'a']
5 untuk mengirim teks ke bidangall_links = driver.find_elements[By.TAG_NAME, 'a']
- Ikuti proses yang sama dengan bidang input kata sandi
- Pilih tombol login [
_6, tentu saja] dan klik menggunakanfrom selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options[] options.headless = True options.add_argument["--window-size=1920,1200"] driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
7h1 = driver.find_element[By.NAME, 'h1'] h1 = driver.find_element[By.CLASS_NAME, 'someclass'] h1 = driver.find_element[By.XPATH, '//h1'] h1 = driver.find_element[By.XPATH, '/html/body/h1'] h1 = driver.find_element[By.ID, 'greatID']
Seharusnya mudah bukan?
driver.get["//news.ycombinator.com/login"]
login = driver.find_element_by_xpath["//input"].send_keys[USERNAME]
password = driver.find_element_by_xpath["//input[@type='password']"].send_keys[PASSWORD]
submit = driver.find_element_by_xpath["//input[@value='login']"].click[]
Mudah, bukan? . Bagaimana kita tahu jika kita sudah masuk?
Kami dapat mencoba beberapa hal
- Periksa pesan kesalahan [seperti "Sandi salah"]
- Periksa satu elemen pada halaman yang hanya ditampilkan setelah masuk
Jadi, kita akan memeriksa tombol logout. Tombol logout memiliki ID
all_links = driver.find_elements[By.TAG_NAME, 'a']
8 [mudah]Kami tidak bisa hanya memeriksa apakah elemen
all_links = driver.find_elements[By.TAG_NAME, 'a']
9 karena from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options[]
options.headless = True
options.add_argument["--window-size=1920,1200"]
driver = webdriver.Chrome[options=options, executable_path=DRIVER_PATH]
6 menimbulkan pengecualian, jika elemen tidak ditemukan di DOM. Jadi kita harus menggunakan blok coba/kecuali dan menangkap pengecualian
1# dont forget from selenium.common.exceptions import NoSuchElementException
try:
logout_button = driver.find_element_by_id["logout"]
print['Successfully logged in']
except NoSuchElementException:
print['Incorrect login/password']
Brilian, berhasil
Mengambil tangkapan layar
Keindahan dari pendekatan browser, seperti Selenium, adalah bahwa kita tidak hanya mendapatkan data dan pohon DOM, tetapi - sebagai browser - ia juga merender seluruh halaman dengan benar dan lengkap. Ini, tentu saja, juga memungkinkan untuk tangkapan layar dan Selenium sepenuhnya siap di sini
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_0
Satu panggilan tunggal dan kami memiliki tangkapan layar halaman kami. Sekarang, jika itu tidak keren
Harap diperhatikan, beberapa hal masih bisa salah atau perlu penyesuaian, saat Anda mengambil tangkapan layar dengan Selenium. Pertama, Anda harus memastikan bahwa ukuran jendela diatur dengan benar. Kemudian, Anda perlu memastikan bahwa setiap panggilan HTTP asinkron yang dilakukan oleh kode JavaScript frontend telah selesai, dan halaman telah dirender sepenuhnya
Dalam kasus Berita Peretas kami, ini sederhana dan kami tidak perlu khawatir tentang masalah ini
💡 Tahukah Anda, ScrapingBee menawarkan API tangkapan layar khusus? . Tidak ada yang lebih nyaman daripada mengirimkan permintaan tangkapan layar Anda ke API dan duduk santai dan nikmati cokelat panas ☕
Menunggu elemen untuk hadir
Berurusan dengan situs web yang menggunakan banyak JavaScript untuk merender kontennya bisa jadi rumit. Saat ini, semakin banyak situs yang menggunakan framework seperti Angular, React, dan Vue. js untuk front-end mereka. Framework front-end ini rumit untuk ditangani karena tidak hanya menampilkan kode HTML, tetapi Anda memiliki serangkaian kode JavaScript yang agak rumit, yang mengubah pohon DOM dengan cepat dan mengirimkan banyak informasi secara asinkron di
Artinya, kita tidak bisa begitu saja mengirimkan permintaan dan langsung mengorek data, tetapi kita mungkin harus menunggu hingga JavaScript menyelesaikan pekerjaannya. Biasanya ada dua cara untuk mendekati itu
- Gunakan
_2 sebelum mengambil tangkapan layar - Mempekerjakan objek
3
Jika Anda menggunakan
_2 Anda harus menggunakan penundaan yang paling wajar untuk kasus penggunaan Anda. Masalahnya adalah, Anda menunggu terlalu lama atau tidak cukup lama dan tidak ada yang ideal. Selain itu, situs mungkin memuat lebih lambat di koneksi ISP tempat tinggal Anda daripada saat kode Anda berjalan dalam produksi di pusat data. Dengan
_3, Anda tidak perlu memperhitungkannya. Itu hanya akan menunggu selama diperlukan sampai elemen yang diinginkan muncul [atau mencapai batas waktu]from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_1Ini akan menunggu hingga elemen dengan ID HTML
6 muncul, atau batas waktu lima detik telah tercapai. Ada beberapa jenis Kondisi yang Dikecualikan lainnya
_7
_8
_9
0driver.get["//news.ycombinator.com/login"] login = driver.find_element_by_xpath["//input"].send_keys[USERNAME] password = driver.find_element_by_xpath["//input[@type='password']"].send_keys[PASSWORD] submit = driver.find_element_by_xpath["//input[@value='login']"].click[]
Daftar lengkap Menunggu dan Kondisi yang Diharapkan, tentu saja, dapat ditemukan di dokumentasi Selenium
Namun, memiliki mesin browser lengkap yang kita miliki, tidak hanya berarti kita dapat, kurang lebih, dengan mudah menangani kode JavaScript yang dijalankan oleh situs web, itu juga berarti kita memiliki kemampuan untuk menjalankan JavaScript kustom kita sendiri. Mari kita periksa selanjutnya
Menjalankan JavaScript
Seperti halnya dengan , kita juga dapat menggunakan sepenuhnya mesin JavaScript browser kita. Artinya, kita dapat memasukkan dan mengeksekusi kode arbitrer dan menjalankannya dalam konteks situs. Anda ingin mengambil tangkapan layar dari bagian yang terletak sedikit di bawah halaman?
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_2Atau Anda ingin menyorot semua tag jangkar dengan batas?
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_3Keuntungan tambahan dari
driver.get["//news.ycombinator.com/login"]
login = driver.find_element_by_xpath["//input"].send_keys[USERNAME]
password = driver.find_element_by_xpath["//input[@type='password']"].send_keys[PASSWORD]
submit = driver.find_element_by_xpath["//input[@value='login']"].click[]
_2 adalah mengembalikan nilai ekspresi yang Anda berikan. Singkatnya, kode berikut akan meneruskan judul dokumen kita langsung ke variabel driver.get["//news.ycombinator.com/login"]
login = driver.find_element_by_xpath["//input"].send_keys[USERNAME]
password = driver.find_element_by_xpath["//input[@type='password']"].send_keys[PASSWORD]
submit = driver.find_element_by_xpath["//input[@value='login']"].click[]
4 kitafrom selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_4Tidak buruk, bukan?
Mampu mengembalikan nilai,
2 bersifat sinkron. Jika Anda tidak perlu menunggu nilai, Anda juga dapat menggunakan pasangan asinkronnyadriver.get["//news.ycombinator.com/login"] login = driver.find_element_by_xpath["//input"].send_keys[USERNAME] password = driver.find_element_by_xpath["//input[@type='password']"].send_keys[PASSWORD] submit = driver.find_element_by_xpath["//input[@value='login']"].click[]
6, tentu sajadriver.get["//news.ycombinator.com/login"] login = driver.find_element_by_xpath["//input"].send_keys[USERNAME] password = driver.find_element_by_xpath["//input[@type='password']"].send_keys[PASSWORD] submit = driver.find_element_by_xpath["//input[@value='login']"].click[]
Menggunakan proxy dengan Selenium Wire
Sayangnya, penanganan proxy Selenium cukup mendasar. Misalnya, itu tidak dapat menangani autentikasi proxy di luar kotak
Untuk mengatasi masalah ini, Anda dapat menggunakan Selenium Wire. Paket ini memperluas pengikatan Selenium dan memberi Anda akses ke semua permintaan mendasar yang dibuat oleh browser. Jika Anda perlu menggunakan Selenium dengan proxy dengan autentikasi, inilah paket yang Anda perlukan
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_5Cuplikan kode ini menunjukkan cara cepat menggunakan browser headless Anda di belakang proxy
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_6Memblokir gambar dan JavaScript
Memiliki seluruh rangkaian fitur peramban standar di ujung jari kita, benar-benar membawa gesekan ke tingkat berikutnya. Kami telah merender halaman sepenuhnya, yang memungkinkan kami mengambil tangkapan layar, JavaScript situs dijalankan dengan benar dalam konteks yang tepat, dan banyak lagi
Namun, terkadang, kami sebenarnya tidak membutuhkan semua fitur ini. Misalnya, jika kami tidak mengambil tangkapan layar, tidak ada gunanya mengunduh semua gambar. Untungnya, Selenium dan WebDriver membantu kami di sini juga
Apakah Anda ingat kelas
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_8 dari sebelumnya? . Misalnya, jika kami ingin menonaktifkan pemuatan gambar dan eksekusi kode JavaScript, kami akan menggunakan opsi berikutfrom selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_7Kesimpulan
Saya harap Anda menikmati posting blog ini. Anda sekarang harus memiliki pemahaman yang baik tentang cara kerja Selenium API di Python. Jika Anda ingin tahu lebih banyak tentang cara mengorek web dengan Python, jangan ragu untuk melihat panduan umum mengorek web Python kami
Bacaan lain yang menarik adalah panduan kami untuk Dalang dengan Python. Dalang adalah API untuk mengontrol Chrome, ini cukup lebih kuat daripada Selenium [dikelola langsung oleh tim Google]
Selenium seringkali diperlukan untuk mengekstrak data dari situs web menggunakan banyak JavaScript. Masalahnya adalah menjalankan banyak instance Selenium/Headless Chrome dalam skala besar itu sulit. Ini adalah salah satu hal yang kami selesaikan dengan ScrapingBee, API pengikisan web kami. API kami adalah platform pengikisan SaaS, yang memungkinkan untuk menskalakan pekerjaan perayapan Anda dengan mudah, tetapi juga mengetahui cara menangani topik terkait pengikisan lainnya secara langsung, seperti proxy dan manajemen koneksi serta pembatasan permintaan
Selenium juga merupakan alat yang sangat baik untuk mengotomatiskan hampir semua hal di web
Jika Anda melakukan tugas berulang, seperti mengisi formulir atau memeriksa informasi di balik formulir login di mana situs web tidak memiliki API, mungkin ide yang bagus untuk mengotomatiskannya dengan Selenium, jangan lupakan komik xkcd ini
Kevin bekerja di industri web scraping selama 10 tahun sebelum ikut mendirikan ScrapingBee. Dia juga penulis dari Java Web Scraping Handbook.