關(guān)于 Selenium
什么是 Selenium
Selenium 是支持 web 瀏覽器自動(dòng)化的一系列工具和庫(kù)的綜合項(xiàng)目。
它提供了擴(kuò)展來模擬用戶與瀏覽器的交互,用于擴(kuò)展瀏覽器分配的分發(fā)服務(wù)器,以及用于實(shí)現(xiàn) W3C WebDriver 規(guī)范 的基礎(chǔ)結(jié)構(gòu),該 規(guī)范 允許您為所有主要 Web 瀏覽器編寫可互換的代碼。
Selenium 可以做什么
使用 Selenium 可以操作瀏覽器從而實(shí)現(xiàn)自動(dòng)化測(cè)試,一般 selenium 可用于以下場(chǎng)景:
- 對(duì)你開發(fā)的網(wǎng)站進(jìn)行自動(dòng)化測(cè)試,檢查網(wǎng)頁的表現(xiàn)是否符合預(yù)期設(shè)計(jì)
- 完成一些自動(dòng)化任務(wù),如自動(dòng)簽到、自動(dòng)下單等
- 爬蟲(雖然 Selenium 可用于爬蟲,但一般不單獨(dú)使用 selenium 爬取信息,尤其是對(duì)效率要求較高的情況,見下文對(duì)比)
和傳統(tǒng)爬蟲工具的差異
對(duì)于爬蟲,python 一般使用 Requests 獲取網(wǎng)頁內(nèi)容,然后使用 Beautiful Soup 進(jìn)行分析和抓取數(shù)據(jù)。
Selenium 也可以完成類似的功能。相對(duì)傳統(tǒng)方法,Selenium 是操縱瀏覽器,可以運(yùn)行頁面的 Javascript 腳本,因此如果網(wǎng)頁是由客戶端渲染的(如使用 Vue ,React 等渲染),Selenium 也可以渲染出內(nèi)容,而且還可以和網(wǎng)頁交互,這個(gè)是傳統(tǒng)方法無法做的(傳統(tǒng)方法只獲取 html 的原始內(nèi)容,并不會(huì)運(yùn)行任何 Javascript)。
但也正因?yàn)樾枰獑?dòng)瀏覽器和運(yùn)行 Javascript,Selenium 的啟動(dòng)時(shí)間較長(zhǎng),而且在爬取數(shù)據(jù)的效率方面遠(yuǎn)遠(yuǎn)也比不上傳統(tǒng)方法。
Selenium 也可以和 Beautiful Soup 結(jié)合使用,如使用 Selenium 完成登錄、渲染動(dòng)態(tài)頁面的工作,然后把得到的 html 內(nèi)容傳給 Beautiful Soup 進(jìn)行分析或獲取數(shù)據(jù)。
根據(jù)目的、渲染方式、和是否需要和頁面交互,可以總結(jié)如下:
目的 | 網(wǎng)頁渲染方式 | 需要和網(wǎng)頁交互 | 建議的方案 |
---|---|---|---|
自動(dòng)化任務(wù) | - | 是 | Selenium |
爬取數(shù)據(jù) | 服務(wù)端渲染 | 否 | Requests + Beautiful Soup |
爬取數(shù)據(jù) | 客戶端渲染 | 是 | Selenium + Beautiful Soup |
當(dāng)然,自動(dòng)任務(wù)、爬取數(shù)據(jù)也可以考慮直接分析網(wǎng)站的接口,通過直接請(qǐng)求接口的方式完成,效率也更高,不過這種方式暫不在本文的討論范圍 :) 。
安裝
安裝 WebDriver
Selenium 通過使用 WebDriver 支持市場(chǎng)上所有主流瀏覽器的自動(dòng)化。 Webdriver 是一個(gè) API 和協(xié)議,它定義了一個(gè)語言中立的接口,用于控制 web 瀏覽器的行為。 每個(gè)瀏覽器都有一個(gè)特定的 WebDriver 實(shí)現(xiàn),稱為驅(qū)動(dòng)程序。 驅(qū)動(dòng)程序是負(fù)責(zé)委派給瀏覽器的組件,并處理與 Selenium 和瀏覽器之間的通信。
Selenium 通過 WebDriver 控制不同瀏覽器,因此使用 selenium前必須安裝瀏覽器對(duì)應(yīng)的 WebDriver。
Selenium 目前支持的瀏覽器及其 WebDriver 下載地址:
瀏覽器 | 支持的操作系統(tǒng) | 維護(hù)者 | 下載 | 問題追蹤 |
---|---|---|---|---|
Chromium/Chrome | Windows/macOS/Linux | 谷歌 | 下載 | 問題 |
火狐 | Windows/macOS/Linux | Mozilla | 下載 | 問題 |
Edge | Windows 10 | 微軟 | 下載 | 問題 |
Internet Explorer | Windows | Selenium 項(xiàng)目組 | 下載 | 問題 |
Safari | macOS El Capitan 及更高版本 | 蘋果 | 內(nèi)置 | 問題 |
Opera | Windows/macOS/Linux | Opera | 下載 | 問題 |
可以根據(jù)自己的需要選擇要安裝的 WebDriver。
目前使用最為廣泛的瀏覽器是 Chrome,下文以 Chrome 作為例子展示在 Windows 系統(tǒng)下安裝 WebDriver 的過程。
安裝 ChromeDriver
下載 ChromeDriver
從 官網(wǎng) 下載 ChromeDriver(國(guó)內(nèi)也可以通過 淘寶鏡像 下載),注意 ChromeDriver 的版本必須要與本機(jī)安裝的 Chrome 大版本一致。
要查看 Chrome 版本,可以打開 Chrome 的選項(xiàng),點(diǎn)擊幫助 -> 關(guān)于 Google Chrome:
選擇對(duì)應(yīng)的版本下載:
根據(jù)操作系統(tǒng)類型選擇合適的文件下載:
Windows 系統(tǒng)下載 chromedriver_win32.zip,解壓后得到 chromedriver.exe。
建議新建一個(gè) webdriver 目錄(如 C:\webdriver)存放 chromedriver.exe,這樣后續(xù)如果安裝其他 WebDriver 也可統(tǒng)一放在此目錄下。
添加到環(huán)境變量 Path
把 webdriver 目錄加入到環(huán)境變量 Path:
測(cè)試 ChromeDriver
在命令行輸入 chromedriver,出現(xiàn)以下內(nèi)容則表示安裝成功:
安裝 Python
這里略過 Python 的安裝,可以自行參考別的文章。本文使用 Python 3.8.4.
安裝 Selenium
python 可以 pip 安裝 Selenium 庫(kù):
pip install selenium
編寫腳本
編寫一個(gè)簡(jiǎn)單的腳本測(cè)試下:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# 配置chromedriver
options = Options()
# 非沙盒模式,不使用此配置在部分情況下可能無法啟動(dòng)
options.add_argument('--no-sandbox')
# 最大化
options.add_argument('--start-maximized')
options.add_argument('--disable-gpu')
with webdriver.Chrome(options=options) as driver:
# 打開百度首頁
driver.get('https://www.baidu.com')
# 設(shè)置等待,超時(shí)時(shí)間為10秒
wait = WebDriverWait(driver, 10)
# 根據(jù)id找到輸入框
input_field = driver.find_element_by_id('kw')
input_field.send_keys('selenium')
# 根據(jù)id找到搜索按鈕
search_button = driver.find_element_by_id('su')
search_button.click()
# 等待搜索結(jié)果出現(xiàn),這里通過判斷content_left是否可見來確定
content = wait.until(
EC.visibility_of_element_located((By.ID, 'content_left')))
# 獲取搜索結(jié)果
items = content.find_elements_by_css_selector(
'.result.c-container.new-pmd')
for item in items:
# 獲取標(biāo)題的文本
title = item.find_element_by_css_selector('h3 a').text
print(title)
以上腳本完成了打開百度自動(dòng)搜索,并獲取第一頁的搜索結(jié)果(不含廣告ヽ(??▽?)ノ):
最后總結(jié)下使用 Selenium 編寫腳本的基本流程是:
- 打開目標(biāo)網(wǎng)頁
- 根據(jù) id,class,css 選擇器、xpath 等,獲取目標(biāo)元素
- 獲取目標(biāo)元素的內(nèi)容,或者和目標(biāo)元素互動(dòng)(點(diǎn)擊、拖動(dòng)等)
- 等待網(wǎng)頁渲染出想要的內(nèi)容
- ...
基本流程和真人使用瀏覽器的過程相同,只是從人手操作改成使用代碼操作。
總結(jié)
Selenium 的功能相當(dāng)強(qiáng)大,可操作瀏覽器完成各種任務(wù)。上手也比較容易,如果掌握一點(diǎn)前端知識(shí)使用起來會(huì)更加方便。