1.selenium簡介
Selenium是一個用程序操作瀏覽器的工具,利用它可以實現瀏覽器自動化、自動化測試、輔助爬蟲等。
我們使用瀏覽器時的所有操作都是基于鼠標和鍵盤進行交互的,selenium就是用程序的形式來代替我們的鍵鼠操作,實現自動化的操作。
利用scrapy編寫爬蟲時,我們可以使用selenium來驅動瀏覽器加載頁面,獲取JavaScrapt渲染后的頁面HTML代碼,而無須考慮網頁的加載形式、接口是否加密等一系列復雜的問題。
2.selenium總覽
selenium
瀏覽器驅動
通過指定操作的瀏覽器驅動,我們可以通過selenium用代碼來操作瀏覽器。
image
驅動 | 代碼實現 |
---|---|
Chrome瀏覽器 | driver = webdriver.Chrome( ) |
IE瀏覽器 | driver = webdriver.Ie( ) |
Edge瀏覽器 | driver = webdriver.Edge( ) |
Opera瀏覽器 | driver = webdriver.Opera( ) |
PhantomJS瀏覽器 | driver = webdriver.PhantomJS( ) |
元素定位
利用元素定位可以找到加載頁面中的任何對象,類似于我們查看加載的頁面,并找到我們的目標信息,以便執行下一步的操作。
元素定位
元素定位 | 代碼實現 |
---|---|
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
瀏覽器操作 | 代碼實現 |
---|---|
最大化 | browser.maximize_window( ) |
最小化 | browser.minimize_window( ) |
設置窗口大小 | browser.set_window_size( ) |
前進 | browser.forword( ) |
后退 | browser.back( ) |
刷新 | browser.refresh( ) |
操作測試對象
操作測試對象是我們在自動化測試中常用的一些方法,主要是對定位到的元素進行操作。
image
操作測試對象 | 代碼實現 |
---|---|
點擊對象 | click( ) |
模擬按鍵輸入 | send_keys( ) |
清除對象內容 | clear( ) |
提交對象內容 | submit( ) |
獲取元素文本信息 | text( ) |
鍵盤事件
在操作測試對象中,send_keys( )中可以傳遞鍵盤事件,相當于我們按下一下特殊的按鍵。
鍵盤事件
鍵盤事件 | 代碼實現 |
---|---|
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') |
復制 | send_keys(Keys.CONTROL,'c') |
剪切 | send_keys(Keys.CONTROL,'x') |
粘貼 | send_keys(Keys.CONTROL,'v') |
鼠標事件
鼠標事件能夠用于執行所有鼠標能夠完成的操作。
鼠標事件
鼠標事件 | 代碼實現 |
---|---|
執行ActionChains中的操作 | perform( ) |
右擊 | content_click( ) |
雙擊 | double_click( ) |
拖動 | drag_and_drop( ) |
鼠標懸停 | move_to_element( ) |
窗口、框架切換
當打開多個網頁時,利用窗口、框架切換方法可以切換顯示網頁。
窗口切換
獲取斷言信息
image
cookie操作
在這里插入圖片描述
3.selenium應用于爬蟲
selenium應用于爬蟲,主要是為了解決scrapy無法解決的問題:獲取JavaScrapt渲染后的頁面HTML代碼。
在之前講解scrapy庫的文章中,我們了解到引擎于爬蟲之間存在一個下載器中間件,scrapy就是通過這種下載器中間件來下載網頁源碼的;但面對JavaScrapt渲染的網頁,這個下載器中間件就無能為力了,這時selenium就起到了替代下載器中間件的作用。
selenium在爬蟲中的主要應用流程如下圖:
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')
#設置頁面加載的超時時間
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框架只能爬取靜態網站,如需爬取動態網站,需要結合selenium庫進行js的渲染,方可爬取到動態頁面。
寫在最后
歡迎大家關注公眾號:人類之奴!
一起學習,一起進步!