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('https://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('https://google.com')
_8, menyetel bidang
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get('https://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. Selesai
Properti 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("https://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 minta
Dua bidang WebDriver menarik lainnya adalah
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)
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)
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
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)
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)
7
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 SampleExample
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)
9Searches for elements based on their HTML ID
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
0
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
1
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
2Searches for elements based on their name attribute
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
3
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
4
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
5Searches for elements based on an XPath expression
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
6
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
7
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
8Searches for anchor elements based on a match of their text content
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
9
<html>
<head>
.. some stuff
head>
<body>
<h1 class="someclass" id="greatID">Super titleh1>
body>
html>
0
<html>
<head>
.. some stuff
head>
<body>
<h1 class="someclass" id="greatID">Super titleh1>
body>
html>
1Searches for anchor elements based on a sub-string match of their text content
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("https://www.nintendo.com/")
print(driver.page_source)
driver.quit()
9
<html>
<head>
.. some stuff
head>
<body>
<h1 class="someclass" id="greatID">Super titleh1>
body>
html>
3
<html>
<head>
.. some stuff
head>
<body>
<h1 class="someclass" id="greatID">Super titleh1>
body>
html>
4Searches for elements
Deskripsi lengkap tentang metode dapat ditemukan di sini
contoh find_element
Katakanlah, kita memiliki dokumen HTML berikut
<html>
<head>
.. some stuff
head>
<body>
<h1 class="someclass" id="greatID">Super titleh1>
body>
html>
dan kami ingin memilih elemen
<html>
<head>
.. some stuff
head>
<body>
<h1 class="someclass" id="greatID">Super titleh1>
body>
html>
5. Di sini, lima contoh berikut akan identik dalam apa yang mereka kembalikan
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')
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 HTML
Ada banyak tindakan yang dapat Anda lakukan pada objek tersebut, inilah yang paling berguna
- Mengakses teks elemen dengan properti
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')
6 - Mengklik elemen dengan
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')
_7 - Mengakses atribut dengan
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')
8 - 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
<input type="hidden" id="custId" name="custId" value="">
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
all_links = driver.find_elements(By.TAG_NAME, 'a')
3 - Pilih bidang input nama pengguna menggunakan
all_links = driver.find_elements(By.TAG_NAME, 'a')
_4 lalu panggil all_links = driver.find_elements(By.TAG_NAME, 'a')
5 untuk mengirim teks ke bidang - Ikuti proses yang sama dengan bidang input kata sandi
- Pilih tombol login (
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, tentu saja) dan klik menggunakan 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')
7
Seharusnya mudah bukan?
driver.get("https://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
<input type="hidden" id="custId" name="custId" value="">
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('https://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 ☕
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
Jika Anda menggunakan
<input type="hidden" id="custId" name="custId" value="">
_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
<input type="hidden" id="custId" name="custId" value="">
_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('https://google.com')
_1
Ini akan menunggu hingga elemen dengan ID HTML
<input type="hidden" id="custId" name="custId" value="">
6 muncul, atau batas waktu lima detik telah tercapai. Ada beberapa jenis Kondisi yang Dikecualikan lainnya
<input type="hidden" id="custId" name="custId" value="">
_7<input type="hidden" id="custId" name="custId" value="">
_8<input type="hidden" id="custId" name="custId" value="">
_9driver.get("https://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()
0
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('https://google.com')
_2
Atau 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('https://google.com')
_3
Keuntungan tambahan dari
driver.get("https://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("https://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 kita
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get('https://google.com')
_4
Tidak buruk, bukan?
Mampu mengembalikan nilai,
driver.get("https://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 bersifat sinkron. Jika Anda tidak perlu menunggu nilai, Anda juga dapat menggunakan pasangan asinkronnya driver.get("https://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 saja
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('https://google.com')
_5
Cuplikan 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('https://google.com')
_6
Memblokir 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('https://google.com')
_8 dari sebelumnya? . Misalnya, jika kami ingin menonaktifkan pemuatan gambar dan eksekusi kode JavaScript, kami akan menggunakan opsi berikut
from selenium import webdriver
DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome(executable_path=DRIVER_PATH)
driver.get('https://google.com')
_7
Kesimpulan
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 Sahin
Kevin bekerja di industri web scraping selama 10 tahun sebelum ikut mendirikan ScrapingBee. Dia juga penulis dari Java Web Scraping Handbook.
Bagaimana cara mendapatkan panggilan jaringan di Selenium Python?
Tertaut .
Menggunakan Selenium cara mendapatkan permintaan jaringan
Python selenium dapatkan "Alat Pengembang" → Jaringan → Log media
Mendapatkan error "Browsermob-Proxy binary tidak dapat ditemukan di jalur yang disediakan. path/to/browsermob-proxy" setelah pemasangan Browsermob-Proxy
Bagaimana cara menangkap permintaan jaringan di Selenium?
Selenium menawarkan fitur, captureNetworkTraffic, yang memungkinkan Anda mencegat lalu lintas jaringan seperti yang terlihat oleh browser yang menjalankan pengujian Anda . Responsnya mencakup header, kode status, pengaturan waktu, dan permintaan ajax. Ini sangat berguna jika Anda men-debug permintaan di browser Anda.
Bisakah Anda menggunakan Selenium dengan permintaan?
permintaan selenium 2. 0. 2
Memperluas kelas Selenium WebDriver untuk menyertakan fungsi permintaan dari pustaka Permintaan , sambil melakukan semua cookie dan permintaan yang diperlukan .
Bagaimana cara mendapatkan respons jaringan di Selenium?
4 Jawaban .
Dimungkinkan untuk mendapatkan kode respons dari permintaan protokol HTTP menggunakan Selenium dan Chrome atau Firefox. .
Yang perlu Anda lakukan hanyalah memberi tahu ChromeDriver untuk melakukan "Network. .
Setelah permintaan selesai, yang harus Anda lakukan adalah mendapatkan dan mengulangi log kinerja dan menemukan "Jaringan. responseReceived" untuk URL yang diminta