功能強大的python包(十):selenium(瀏覽器機器人)

1.selenium簡介

Selenium是一個用程序操作瀏覽器的工具,利用它可以實現(xiàn)瀏覽器自動化、自動化測試、輔助爬蟲等。

我們使用瀏覽器時的所有操作都是基于鼠標和鍵盤進行交互的,selenium就是用程序的形式來代替我們的鍵鼠操作,實現(xiàn)自動化的操作。

利用scrapy編寫爬蟲時,我們可以使用selenium來驅(qū)動瀏覽器加載頁面,獲取JavaScrapt渲染后的頁面HTML代碼,而無須考慮網(wǎng)頁的加載形式、接口是否加密等一系列復(fù)雜的問題。

2.selenium總覽

selenium
瀏覽器驅(qū)動

通過指定操作的瀏覽器驅(qū)動,我們可以通過selenium用代碼來操作瀏覽器。

image
驅(qū)動 代碼實現(xiàn)
Chrome瀏覽器 driver = webdriver.Chrome( )
IE瀏覽器 driver = webdriver.Ie( )
Edge瀏覽器 driver = webdriver.Edge( )
Opera瀏覽器 driver = webdriver.Opera( )
PhantomJS瀏覽器 driver = webdriver.PhantomJS( )
元素定位

利用元素定位可以找到加載頁面中的任何對象,類似于我們查看加載的頁面,并找到我們的目標信息,以便執(zhí)行下一步的操作。

元素定位
元素定位 代碼實現(xiàn)
id定位 find_element_by_id( )、find_element(By.ID,'id')
name定位 find_element_by_name( )、find_element(By.NAME,'name')
class定位 find_element_by_class_name( )、find_element(By.CLASS_NAME,'class_name')
link定位 find_element_by_link_text( )、find_element(By.LINK_TEXT,'link_text')
tag定位 find_element_by_tag_name( )、find_element(By.TAG_NAME,'tag_name')
xpath定位 find_element_by_xpath( )、find_element(By.XPATH,'xpath')
css定位 find_element_by_css( )、find_element(By.CSS,'css')
瀏覽器操作

瀏覽器操作是針對瀏覽器客戶端的一些操作,如我們常用的最大化、最小化等。


image
瀏覽器操作 代碼實現(xiàn)
最大化 browser.maximize_window( )
最小化 browser.minimize_window( )
設(shè)置窗口大小 browser.set_window_size( )
前進 browser.forword( )
后退 browser.back( )
刷新 browser.refresh( )
操作測試對象

操作測試對象是我們在自動化測試中常用的一些方法,主要是對定位到的元素進行操作。

image
操作測試對象 代碼實現(xiàn)
點擊對象 click( )
模擬按鍵輸入 send_keys( )
清除對象內(nèi)容 clear( )
提交對象內(nèi)容 submit( )
獲取元素文本信息 text( )
鍵盤事件

在操作測試對象中,send_keys( )中可以傳遞鍵盤事件,相當于我們按下一下特殊的按鍵。


鍵盤事件
鍵盤事件 代碼實現(xiàn)
TAB send_keys(Keys.TAB)
ENTER send_keys(Keys.ENTER)
BackSpace send_keys(Keys.BackSpace)
Space send_keys(Keys.Space)
Esc send_keys(Keys.Esc)
F1 send_keys(Keys.F1)
F12 send_keys(Keys.F12)
全選 send_keys(Keys.CONTROL,'a')
復(fù)制 send_keys(Keys.CONTROL,'c')
剪切 send_keys(Keys.CONTROL,'x')
粘貼 send_keys(Keys.CONTROL,'v')
鼠標事件

鼠標事件能夠用于執(zhí)行所有鼠標能夠完成的操作。


鼠標事件
鼠標事件 代碼實現(xiàn)
執(zhí)行ActionChains中的操作 perform( )
右擊 content_click( )
雙擊 double_click( )
拖動 drag_and_drop( )
鼠標懸停 move_to_element( )
窗口、框架切換

當打開多個網(wǎng)頁時,利用窗口、框架切換方法可以切換顯示網(wǎng)頁。


窗口切換
獲取斷言信息
image
cookie操作
在這里插入圖片描述

3.selenium應(yīng)用于爬蟲

selenium應(yīng)用于爬蟲,主要是為了解決scrapy無法解決的問題:獲取JavaScrapt渲染后的頁面HTML代碼。

在之前講解scrapy庫的文章中,我們了解到引擎于爬蟲之間存在一個下載器中間件,scrapy就是通過這種下載器中間件來下載網(wǎng)頁源碼的;但面對JavaScrapt渲染的網(wǎng)頁,這個下載器中間件就無能為力了,這時selenium就起到了替代下載器中間件的作用。

selenium在爬蟲中的主要應(yīng)用流程如下圖:


image
"""蘇寧易購查找iphone"""

from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium import webdriver

driver = webdriver.Edge(executable_path='msedgedriver.exe')
driver.get('https://www.suning.com')

input = driver.find_element_by_id('searchKeywords')

input.clear
input.send_keys('iphone')
input.send_keys(Keys.RETURN)

wait = WebDriverWait(driver,10)
wait.until(EC.presence_of_element_located((By.CLASS_NAME,'root990')))
print(driver.page_source)
"""自動下拉頁面"""

from selenium import webdriver
import time

driver = webdriver.Edge(executable_path='msedgedriver.exe')
driver.get('https://www.suning.com/')
time.sleep(4)

input = driver.find_element_by_id('searchKeywords')
input.clear
input.send_keys('iphone')
input.send_keys(Keys.RETURN)
driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
"""定位元素"""

from selenium import webdriver

driver = webdriver.Edge(executable_path='msedgedriver.exe')
driver.get('https://www.suning.com/')

input_id = driver.find_element_by_id('searchKeywords')
input_name = driver.find_element_by_name('index1_none_search_ss2')
input_xpath = driver.find_element_by_xpath("http://input[@id='searchKeywords']")
input_css = driver.find_element_by_css_selector('#searchKeywords')
print(input_id,input_name,input_xpath,input_css)
"""等待頁面加載完成"""

from selenium import webdriver
from selenium.common.exceptions import TimeoutException

driver = webdriver.Edge(executable_path='msedgedriver.exe')

#設(shè)置頁面加載的超時時間
driver.set_page_load_timeout(5)
try:
    driver.get('https://www.suning.com/')
    driver.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    print(driver.page_source)
except TimeoutException:
    print('timeout')
driver.quit()
"""隱式等待"""

from selenium import webdriver

driver = webdriver.Edge(executable_path='msedgedriver.exe')
driver.implicitly_wait(5)
driver.get("https://www.suning.com/")
print(driver.page_source)

"""顯示等待"""

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

driver = webdriver.Edge(executable_path='msedgedriver.exe')
driver.get('https://www.suning.com/')

try:
    input = WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"searchKeywords")))
    print(input)
except TimeoutException:
    print('time out!')
driver.quit()
 scrapy框架只能爬取靜態(tài)網(wǎng)站,如需爬取動態(tài)網(wǎng)站,需要結(jié)合selenium庫進行js的渲染,方可爬取到動態(tài)頁面。

寫在最后

歡迎大家關(guān)注公眾號:人類之奴!
一起學習,一起進步!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容