selenium 庫驅動瀏覽器
selenium庫是一種用于Web應用程序測試的工具,它可以驅動瀏覽器執行特定操作,自動按照腳本代碼做出單擊、輸入、打開、驗證等操作,支持的瀏覽器包括IE、Firefox、Safari、Chrome、Opera等。而在辦公領域中如果經常需要使用瀏覽器操作某些內容,就可以使用selenium庫來實現,例如將大量數據上傳到網頁中或者實現自動驅動瀏覽器進行操作。
與requests庫不同的是,selenium庫是基于瀏覽器的驅動程序來驅動瀏覽器執行操作的。且瀏覽器可以實現網頁源代碼的渲染,因此通過selenium庫還可以輕松獲取網頁中渲染后的數據信息。
使用 selenium 庫前的準備
了解 selenium 庫驅動瀏覽器的原理
瀏覽器是在瀏覽器內核基礎之上開發而成的,測覽器內核主要負責對網頁語法進行哪釋并誼類(顯示)網洲如360瀏覽器和Chr0me瀏覽器都使用Chrome內核,如圖15-26陽圖15-27所示;麗QQ洲覽器使用1E內m.,safari瀏覽器使用Webkit內核
然瀏覽器內核可以被selenium庫驅動,但還是需要安裝對應版本的測覽器內核驅動程序,以便于控制web瀏覽器的行為。每個瀏覽器都有一個特定的用于支持測覽器運行的WebDriver,被稱為驅動程序(可以進入selenium庫的官網進行下載,如果下載失敗或無法匹配版本,還可以嘗試下面介紹的相關方法)。
安裝 WebDriver
這里以Chrome瀏覽器為例,開始介紹安裝瀏覽器內核驅動程序WebDriver的方法。針對Chrome瀏覽器的WebDriver可以進入專用下載通道進行下載,如圖15-28所示。根據圖15-27可知Chrome瀏覽器的內核版本為91.0.4472.124,讀者可能會找不到版本號完全相同的WebDriver,但也可以使用與瀏覽器版本最為接近的版本,例如本書中下載的WebDriver的版本為91.0.4472.101。
選擇并單擊“91.0.4472.101”后將進入如圖15-29所示的驅動程序安裝包頁面,Linux操作系統選擇chromedriver_linux64.zip”,macOS操作系統選擇“chromedriver_mac64.zip”,macOS操作系統(m1芯片)選擇“chromedriver_mac64_m1.zip”,Windows操作系統選擇“chromedriver_win32.zip”
下載完成后還需要解壓相應文件,并將解壓后的文件中的chromedriver,exe文件移動到Python安裝目錄路徑下的Scripts文件夾中。Pvthon安裝目錄路徑的確定方法分為兩種情況,對于Windows系統來說,在命令裝示符窗口中輸入命令wbere-python并按Enter鍵即可獲取Python的安裝目錄路徑。對于macOS系統來說金終端物入命令mhieh pythen3并按Enter鍵即可獲取Python安裝目錄路徑。以Windows系統為例,最終結*果如圖15-30所示。至此即完成了所有關于WebDriver的配置。
安裝selenium 庫
在命令提示符窗口或終端中執行以下命令:
pip install selenium
安裝成功后可使用以下命令查看庫的信息:
pip show selenium
完成了整個selenium庫的安裝及WebDriver的配置后,便可以開始使用selenium庫中的方法調用
WebDriver驅動瀏覽器執行相應操作。
驅動瀏覽器
selenium庫支持的瀏覽器包括Chrome、IE 7~11、Firefox、Safari、Opera Edge、HtmlUnit、PhantomJS等,幾乎覆蓋了當前計算機端和手機端的所有類型的瀏覽器。在selenium庫源代碼文件下的webdriver中可查看所有支持的瀏覽器類型
webdriver的使用形式如下:
webdriver.瀏覽器類型名()
瀏覽器類型名與圖15-31中對應瀏覽器類型的文件夾名稱相同。例如驅動Chrome瀏覽器的使用方法為webdriver.Chrome(),驅動Opera瀏覽器的使用方法為webdriver.opera()。圖15-31所示的每個文件夾中都存在一個webdriver,py文件,當調用webdriver.Chrome()時,會默認調用chrome\webdriver.py文件中的類WebDriver。webdriver.Chrome()的使用形式如下:
webdriver.Chrome(executable path ="chromedriver",port = 0,options = None)
功能:創建一個新的Chrome瀏覽器驅動程序。
參數executable-path:表示瀏覽器的驅動路徑,默認為環境變量中的path,通常計算機中可能存在多個瀏覽器軟件,當沒有在環境變量中設置瀏覽器path時,可以使用參數options。
參數port:表明希望服務運行的端口,如果保留為0,驅動程序將會找到一個空閑端口。
參數options:表示由類Options(位于selenium\webdriver\chrome\options.py)創建的對象,用于實現瀏覽器的綁定。
示例代碼(驅動Chrome瀏覽器):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options,binary_location = r"c:\Program files\Google\chrome\Application\chrome.exe"
driver =webdriver.Chrome(options=chrome options)
第3、4行代碼使用類Options創建了一個對象chrome_options,使用binary_location()方法綁定了瀏覽器。
第5行代碼使用webdriver.Chrome()設置options參數值為綁定Chrome瀏覽器的對象chrome_options,執行代碼后將會自動打開Chrome瀏覽器,實現驅動瀏覽器的第一步。
加載網頁
使用類webdriver.Chrome創建的驅動瀏覽器對象中包含大量操作瀏覽器的方法,類webdriver.Chrome繼承于基礎類WebDriver,該類位于selenium庫的webdriver\remotewebdriver.py文件中。
類WebDriver的簡潔定義:
class WebDriver(object):
????????def file detector context(self,file detector class, *args,**kwargs): ...
????????#覆蓋當前文件檢測器,文件檢測器由方法Fi1e_detector創建
def name(self):...#返回瀏覽器的名稱
def start_client(self):...#啟動客戶端
def stop_client(self):...#關閉客戶端
def start session(self,capabilities,browser_profile=None):...
????????#創建一個具有特定功能的新會話
????????def create_web element(self,element_id):.,,#用指定的element_id創建一個web元素
????????def execute(self,driver_command,params=None):...#執行JavaScript腳本程序
????????def get(self,ur1):...#在當前瀏覽器會話中加載網頁
等等,等等
接下來介紹兩種常用的加載瀏覽器網頁的方法。
1種,get()方法。get()方法用于打開指定的網頁。其使用形式如下
get (url)
功能:在當前瀏覽器會話中加載url指向的網頁。
示例代碼(加載人民郵電出版社官網中的期刊頁):
from selenium import webdriver
from selenium.webdriver.chrome.options import options
chrome_options = Options()
chrome_options.binary_location = r"c:\program Files\Google\chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver,get ('https://www.ptpress.com.cn//periodical')
第6行代碼使用get()方法加載人民郵電出版社官網的期刊頁,執行代碼后將會自動啟動Chrome瀏覽器并加載出相應網頁
第2種,execute_script()方法。executescript()方法用于打開多個標簽頁,即在同一瀏覽器中打開多個網頁。其使用形式如下:
execute script(script,*args)
功能:打開標簽頁,同步執行當前頁面中的JavaScript腳本。JavaScript是網頁中的一種編程語言。
參數script:表示將要執行的腳本內容,數據類型為字符串類型。使用JavaScript語言實現打開一個新標簽頁的使用形式為"window,open(·網站ur1','_blank');"。
示例代碼(打開多個標簽頁):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome options = Options()
chrome_options binary location = r"c:\program Files\Google\chrome\Application\chrome.ex
driver =webdriver.chrome(options=chrome_options)
driver.get ('https://www.ptpress.com.cn/')
driver,execute script("window,open('https: //www.ptpress.com.cn/login','_blank');")
dxiver.execute script ("window,open('https://www,shuyishe,com/','_blank');")
dtiver,execute script ("window,open('https://www,shuyishe.com/course',’ blank');")
第7~9行代碼使用execute_script()方法執行括號中的JavaScript腳本,打開的新標簽頁分別為人民郵電出版社登錄頁面、數藝設的主頁、數藝設的課程頁面
獲取渲染后的網頁代碼
通過get()方法獲取瀏覽器中的網頁資源后,瀏覽器將自動渲染網頁源代碼內容,并生成渲染后的的時使用page_source()方法即可獲取渲染后的網頁代碼。
示例代碼:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome options = Options()
chrome_options.binary_location = r"c:\Program Files\Google\chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome options)
driver.get('https://www.ptpress.com.cn/')
print(driver.page source)
第7行代碼使用driver對象中的pagesource()方法獲取被get()方法獲取到的渲染后的網頁源代碼。
?小項目案例:實現批量下載網頁中的資源
根據15.3.2小節中的返回網頁內容可知,用戶只有獲取了網頁中的圖片url才可以將圖片下載到*在使用selenium庫渲染網頁后,可直接通過正則表達式過濾出指定的網頁圖片,從而實現批量下載接下來以此為思路來實現一個小項目案例。
項目任務
實現批量下載人民郵電出版社官網中與Python相關的圖書封面圖片。
項目實步驟
步驟1,獲取人民郵電出版社官網中與Python相關的圖書封面圖片url。使用get()方法即可獲取“python”的圖書封面圖片url。
步驟2,使用selenium庫驅動瀏覽器渲染網頁,并獲取染后的網頁代碼
步驟3,使用正則表達式過濾出圖片的ur1。
步驟4,使用15.3.2小節的返回網頁內容中的方法將對應ur1的圖片下載到本地
項目實現代碼
from selenium import webdriverfrom selenium,webdriver chrome,options import optionsimport requestsimport rechrome_options = Options ()chrome_options,binary_location = r"c:\program Files\Google\chrome\Application\chrome.exe"driver = webdriver.Chrome(options=chrome_options)driver.get('https://www.ptpress.com.cn/search?keyword=python')a = re.findall('<img src="(.+?jpg)"></div>',driver.page source)i=1for url in a:r = requests.get(url)f2 = open('.\\Python圖書\\'+str(i)+'.jpg','wb')i +=?1f2.write(r.content)f2.close()
第4~6行代碼綁定了Chrome瀏覽器,并驅動瀏覽器
第7行代碼使用get()方法打開Python類圖書的網頁,如圖15-36所示。
第8行代碼使用正則表達式過濾driver,page_source(渲染后的網頁代碼)中的圖片url。如圖15-36所示可以觀察到所有圖書封面圖片的標簽為<img>,圖片格式為.jpg,且下一個標簽為</div>。因此使用正則表達式設計的過濾規則為'<img src="(.+?jpg)"></div>’。過濾規則不是統一的,讀者可以自行設計過濾規則。第9~15行代碼使用requests庫中的get()方法將過濾出來的ur1分別保存到相對路徑“\Python圖書”下。執行代碼后將會自動下載網頁中的圖書封面圖片到本地文件夾“\Python圖書”中,如圖15-37所示。
此項目案例介紹了一個通用的下載網頁資源的方法,讀者掌握此方法后即可實現批量下載大部分網站中的圖片、音樂、視頻等資源文件。
獲取和操作網頁元素
獲取網頁中的指定元素
1獲取標簽中的圖片url使用了正則表達式的方式進行過濾,而WebDriver對象中也提供了大量用于獲取網頁指定元素的方法.
在獲取了網頁中的某個元素后,可以使用以下方法對此元素進行相應操作。
tag-name()方法:獲取元素的名稱。
text()方法:獲取元素的文本內容。
click()方法:單擊此元素。
submit()方法:提交表單。
send_keys()方法:模擬輸入信息。
size()方法:獲取元素的尺寸。
在元素中輸入信息
send_keys()方法可以實現在元素中輸入信息,例如在窗口標簽中輸入信息。其使用形式如下:
send keys(*value)
參數value:表示需要輸入的字符串信息。
示例代碼(在人民郵電出版社官網的搜索框中輸入“Python”):
from selenium import webdriverfrom selenium.webdriver.chrome.options import Optionsfrom selenium.webdriver.common.keys import Keyschrome options = Options()chrome options.binary location = r"c:\Program Files\Google\chrome\Application\chrome.exe"driver = webdriver.Chrome(options=chrome options)driver.get('https://www.ptpress.com.cn/')driver fnd element by tag name ("input").send keys ("Python" )
第8行代碼使用find_element_by_tag_name()方法找到標簽名為input的元素(通過網頁源代碼可知搜索框的標簽名為input)。獲取到標簽后使用send_keys()方法實現在搜索框內輸入字符串"Python"。
獲取元素的方法比較多,讀者可按照不同的方法靈活實現。實現在搜索框中輸入信息的代碼程序后,還可以模擬用戶的按鍵操作,其使用方法為在字符串后面繼續增加按鍵轉義字符串信息。
示例代碼:
from selenium import webdriverfrom selenium,webdriver,chrome.options import Optionsfrom selenium,webdriver,common.keys import Keyschrome options =Options()chrome_options.binary_location = r"C:\Program Files\Google\chrome\Application\chrome,exe"driver=webdriver.Chrome(options=chrome options)driver.get('https://www.ptpress.com.cn/')driver.find element by tag name("input").send keys ("Python"+ KeyS .RETURN)
示例代碼在上二示例代碼的基礎上只對第8行微了修改。第8行代碼在send_keys()方法電行KPyS.RETURN,KeyS RETURN表示技E中談值來源于第3行代碼導入的類Keys,類Kev建。能義了大部分按鍵的轉義字符串。下面展示ySpenium庫官方源代碼中對類Keys的定義,根據定*司知KeyS.RETURN的值為轉義字符串八ue006msend_keys()中寫入的字符串信息為"pythoue006"。
類Keys的定義:
Elass Keys (object):
非甘群Set of special keys codes.gn#
NULL = *\ue000'
CANCEL=\ue001'#^控制鍵
HELP =ue002'
BACKSPACE =\ue003'
BACK SPACE = BACKSPACE
TAB =\ue004'
CLEAR =\ue005'
RETURN =\ue006'ENTER =\ue007'
SHIFT =\ue008'LEFT SHIFT = SHIFTCONTROL =\ue009'LEFT CONTROL=CONTROLALT =\ue00a'LEFT ALT = ALTPAUSE =\ue00b'ESCAPE =\ue00cSPACE =\ue00d'PAGE UP=\ue00e'PAGE DOWN=\ue00f'亻狀到篚剁鈄滹會盹玀攤跑=\ue010'HOME =\ue011'LEFT =\ue012'ARROW LEFT = LEFTUp ='\ue013'ARROW UP = UPRIGHT =\ue014'ARROW RIGHT = RIGHTDOW =\1e015!INSERT =
DELETE = '\ue017
SEMICOLON =\ue018'
EQUALS =\ue019'
#數字鍵NUMPAD0 =\ue0la'
NUMPAD1 =\ue01b'
NUMPAD2=\ue0lc
NUMPAD3=\ue0ld'
NUMPAD4= \ue0le'
NUMPAD5\ue0lf
NUMPAD6'\ue020'三
NUMPAD7 =\ue021'
NUMPAD8=\ue022'
NUMPAD9 =\ue023'
MULTIPLY =\ue024
ADD =\ue025'
SEPARATOR =ue026
SUBTRACT =\ue027'
DECIMAL =\ue028
DIVIDE =\ue029
F1 =\ue031'#功能鍵
F2 =ue032'
F3 =\ue033'
F4=\ue034'
F5 =\ue035'
F6 = \ue036'
F7 =\ue037'
F8=\ue038'
F9=\ue039'
F10 =\ue03a'
F11 =\ue03b'
F12 =\ue03c'
META =\ue03d'
COMMAND=\ue03d'
小項目案例:實現上傳圖片
項目任務泰現在百度識圖官網中上傳一張圖片
項目實現代碼
from selenium import webdriver
from selentan wendrtyer chrome,options import optlons
chrome_options = options()
crome options binary_location = r"c:\program fileslGoogleichromevpplleationichrome.exe
driver = webdriver,chrome (options=chrome optint)
driver.get('百度識圖主頁的網址”
input element = driver.find element by _name('file,)
input element.send_keys(r":\書代碼\識圖,jP)