功能強(qiáng)大的python包(十):selenium(瀏覽器機(jī)器人)

1.selenium簡(jiǎn)介

Selenium是一個(gè)用程序操作瀏覽器的工具,利用它可以實(shí)現(xiàn)瀏覽器自動(dòng)化、自動(dòng)化測(cè)試、輔助爬蟲(chóng)等。

我們使用瀏覽器時(shí)的所有操作都是基于鼠標(biāo)和鍵盤(pán)進(jìn)行交互的,selenium就是用程序的形式來(lái)代替我們的鍵鼠操作,實(shí)現(xiàn)自動(dòng)化的操作。

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

2.selenium總覽

selenium
瀏覽器驅(qū)動(dòng)

通過(guò)指定操作的瀏覽器驅(qū)動(dòng),我們可以通過(guò)selenium用代碼來(lái)操作瀏覽器。

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

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

元素定位
元素定位 代碼實(shí)現(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')
瀏覽器操作

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


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

操作測(cè)試對(duì)象是我們?cè)谧詣?dòng)化測(cè)試中常用的一些方法,主要是對(duì)定位到的元素進(jìn)行操作。

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

在操作測(cè)試對(duì)象中,send_keys( )中可以傳遞鍵盤(pán)事件,相當(dāng)于我們按下一下特殊的按鍵。


鍵盤(pán)事件
鍵盤(pán)事件 代碼實(shí)現(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')
鼠標(biāo)事件

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


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

當(dāng)打開(kāi)多個(gè)網(wǎng)頁(yè)時(shí),利用窗口、框架切換方法可以切換顯示網(wǎng)頁(yè)。


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

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

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

在之前講解scrapy庫(kù)的文章中,我們了解到引擎于爬蟲(chóng)之間存在一個(gè)下載器中間件,scrapy就是通過(guò)這種下載器中間件來(lái)下載網(wǎng)頁(yè)源碼的;但面對(duì)JavaScrapt渲染的網(wǎng)頁(yè),這個(gè)下載器中間件就無(wú)能為力了,這時(shí)selenium就起到了替代下載器中間件的作用。

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


image
"""蘇寧易購(gòu)查找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)
"""自動(dòng)下拉頁(yè)面"""

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)
"""等待頁(yè)面加載完成"""

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

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

#設(shè)置頁(yè)面加載的超時(shí)時(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)站,如需爬取動(dòng)態(tài)網(wǎng)站,需要結(jié)合selenium庫(kù)進(jìn)行js的渲染,方可爬取到動(dòng)態(tài)頁(yè)面。

寫(xiě)在最后

歡迎大家關(guān)注公眾號(hào):人類(lèi)之奴!
一起學(xué)習(xí),一起進(jìn)步!

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

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

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