Selenium dapatkan permintaan jaringan python

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. 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["//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 halaman
  • 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]
    
    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]
    
    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]
    
    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]
8

TypeDescriptionDOM 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["//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["//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["//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["//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["//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["//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["//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["//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["//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["//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 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["//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 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


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["//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']
_1

Ini 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
  • 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[]
    
    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['//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['//google.com']
_3

Keuntungan 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 kita

from selenium import webdriver

DRIVER_PATH = '/path/to/chromedriver'
driver = webdriver.Chrome[executable_path=DRIVER_PATH]
driver.get['//google.com']
_4

Tidak buruk, bukan?

Mampu mengembalikan nilai,

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 bersifat sinkron. Jika Anda tidak perlu menunggu nilai, Anda juga dapat menggunakan pasangan asinkronnya
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[]
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['//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['//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['//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['//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

Bài mới nhất

Chủ Đề