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總覽
瀏覽器驅(qū)動(dòng)
通過(guò)指定操作的瀏覽器驅(qū)動(dòng),我們可以通過(guò)selenium用代碼來(lái)操作瀏覽器。
| 驅(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ù)端的一些操作,如我們常用的最大化、最小化等。
| 瀏覽器操作 | 代碼實(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)行操作。
| 操作測(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)事件 | 代碼實(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)事件 | 代碼實(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è)。
獲取斷言信息
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)用流程如下圖:
"""蘇寧易購(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)步!