前言
selenium?庫是一種用于 Web 應用程序測試的工具,它可以驅動瀏覽器執行特定操作,自動按照腳本代碼做出單擊、輸入、打開、驗證等操作,支持的瀏覽器包括 IE、Firefox、Safari、Chrome、Opera 等。
與 requests 庫不同的是,selenium 庫是基于瀏覽器的驅動程序來驅動瀏覽器執行操作的。且瀏覽器可以實現網頁源代碼的渲染,因此通過 selenium 庫還可以輕松獲取網頁中渲染后的數據信息。
一、使用 selenium 庫前的準備
1.了解 selenium 庫驅動瀏覽器的原理
瀏覽器是在瀏覽器內核基礎之上開發而成的,瀏覽器內核主要負責對網頁語法進行解釋并渲染(顯示)網頁。例如 Edge 瀏覽器使用??Chromium 內核,而 QQ 瀏覽器使用 IE 內核,Safari 瀏覽器使用 Webkit 內核。
雖然瀏覽器內核可以被 selenium 庫驅動,但還是需要安裝對應版本的瀏覽器內核驅動程序,以便于控制 Web 瀏覽器的行為。每個瀏覽器都有一個特定的用于支持瀏覽器運行的 WebDriver,被稱為驅動程序(可以進入 selenium 庫的官網進行下載,如果下載失敗或無法匹配版本,還可以嘗試下面介紹的相關方法)。
2.安裝 WebDriver
以Edge瀏覽器為例,開始介紹安裝瀏覽器內核驅動程序 WebDriver 的方法。
在設置中找到“關于 Microsoft Edge”,查看當前Edge瀏覽器版本,進入此網址:Microsoft Edge WebDriver |Microsoft Edge 開發人員,找到對應版本號的?WebDriver。有的可能會找不到版本號完全相同的 WebDriver,但也可以使用與瀏覽器版本最為接近的版本。
下載完成后還需要解壓相應文件,并將解壓后的文件中的 msedgedriver.exe 文件移動到 Python 安裝目錄路徑下的 Scripts 文件夾中。?
3.安裝 selenium 庫
在命令提示符窗口或終端中執行以下命令:
pip install selenium
二、驅動瀏覽器
selenium 庫支持的瀏覽器包括 Chrome、IE 7 - 11、Firefox、Safari、Opera Edge、HtmlUnit、PhantomJS 等,幾乎覆蓋了當前計算機端和手機端的所有類型的瀏覽器。在 selenium 庫源代碼文件下的 webdriver 中可查看所有支持的瀏覽器類型,如圖所示。
webdriver 的使用形式如下:
webdriver.瀏覽器類型名()
瀏覽器類型名與圖中對應瀏覽器類型的文件夾名稱相同。例如驅動 Edge 瀏覽器的使用方法為webdriver.Edge()
,驅動 Opera 瀏覽器的使用方法為webdriver.opera()
。圖所示的每個文件夾中都存在一個webdriver.py
文件,當調用webdriver.Edge()
時,會默認調用edge\webdriver.py
文件中的類 WebDriver。webdriver.Edge()
的使用形式如下:
webdriver.Edge(executable_path = "msedgedriver", port = 0, options = None)
- 功能:創建一個新的 Edge 瀏覽器驅動程序。
- 參數 executable_path:表示瀏覽器的驅動路徑,默認為環境變量中的 path,通常計算機中可能存在多個瀏覽器軟件,當沒有在環境變量中設置瀏覽器 path 時,可以使用參數 options。
- 參數 port:表明希望服務運行的端口,如果保留為 0,驅動程序將會找到一個空閑端口。
- 參數 options:表示由類 Options(位于
selenium\webdriver\edge\options.py
?)創建的對象,用于實現瀏覽器的綁定。
示例代碼(驅動Edge瀏覽器):
from selenium import webdriver
from selenium.webdriver.edge.options import Options
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
第 3、4 行代碼使用類 Options 創建了一個對象 edge_options,使用 binary_location () 方法綁定了瀏覽器。第 5 行代碼使用 webdriver.Edge() 設置 options 參數值為綁定 Edge 瀏覽器的對象 edge_options。
執行代碼后將會自動打開 Edge 瀏覽器,實現驅動瀏覽器的第一步。
三、加載網頁
接下來介紹兩種常用的加載瀏覽器網頁的方法。
1.get() 方法
get() 方法用于打開指定的網頁。其使用形式如下:
get(url)
功能:在當前瀏覽器會話中加載 url 指向的網頁。
示例代碼(加載人民郵電出版社官網中的期刊頁):
from selenium import webdriver
from selenium.webdriver.edge.options import Options
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
driver.get('https://www.ptpress.com.cn/periodical')
運行結果:?
第 6 行代碼使用 get() 方法加載人民郵電出版社官網的期刊頁,執行代碼后將會自動啟動 Edge 瀏覽器并加載出相應網頁,結果如圖所示。
2.execute_script() 方法
execute_script() 方法用于打開多個標簽頁,即在同一瀏覽器中打開多個網頁。其使用形式如下:
execute_script(script, *args)
功能:打開標簽頁,同步執行當前頁面中的 JavaScript 腳本。JavaScript 是網頁中的一種編程語言。
參數 script:表示將要執行的腳本內容,數據類型為字符串類型。使用 JavaScript 語言實現打開一個新標簽頁的使用形式為"window.open('網站url','_blank')"
?。
示例代碼(打開多個標簽頁):
from selenium import webdriver
from selenium.webdriver.edge.options import Options
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
driver.get('https://www.ptpress.com.cn/')
driver.execute_script("window.open('https://www.ptpress.com.cn/login','_blank');")
driver.execute_script("window.open('https://www.shuyishe.com/','_blank');")
driver.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.edge.options import Options
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
driver.get('https://www.ptpress.com.cn/')
print(driver.page_source)
運行結果:?
第 7 行代碼使用driver
對象中的page_source()
方法獲取被get()
方法獲取到的渲染后的網頁源代碼。執行代碼后的輸出結果如圖所示,圖中標注框處的內容即網頁中的圖片 url。
五、獲取和操作網頁元素
1.獲取網頁中的指定元素
WebDriver對象提供了大量用于獲取網頁指定元素的方法。
方法 | 功能 |
---|---|
tag_name() | 獲取元素的名稱 |
text() | 獲取元素的文本內容 |
click() | 單擊此元素 |
submit() | 提交表單 |
send_keys() | 模擬輸入信息 |
size() | 獲取元素的尺寸 |
2.在元素中輸入信息
send_keys () 方法可以實現在元素中輸入信息,例如在窗口標簽中輸入信息。其使用形式如下:
send_keys(*value)
參數 value:表示需要輸入的字符串信息。
示例代碼(在人民郵電出版社官網的搜索框中輸入 “Python”):
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
driver.get('https://www.ptpress.com.cn/')
driver.find_element(by=By.TAG_NAME,value='input').send_keys('Python')
第 8 行代碼使用 find_element() 方法找到標簽名為 input 的元素(通過網頁源代碼可知搜索框的標簽名為 input)。獲取到標簽后使用 send_keys () 方法實現在搜索框內輸入字符串 "Python"。代碼執行結束后的網頁效果如圖所示。
實現在搜索框中輸入信息的代碼程序后,還可以模擬用戶的按鍵操作,其使用方法為在字符串后面繼續增加按鍵轉義字符串信息。
示例代碼:
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
driver.get('https://www.ptpress.com.cn/')
driver.find_element(by=By.TAG_NAME,value='input').send_keys("Python"+Keys.RETURN)
該示例代碼在上一示例代碼的基礎上只對第 8 行代碼做了修改。第 8 行代碼在 send_keys () 方法中增加了 Keys.RETURN,Keys.RETURN 表示按 Enter 鍵。該值來源于第 3 行代碼導入的類 Keys,類 Keys 中定義了大部分按鍵的轉義字符串。下面展示了 Selenium 庫官方源代碼中對類 Keys 的定義,根據定義可知 Keys.RETURN 的值為轉義字符串 '\ue006',即 send_keys () 中寫入的字符串信息為 "Python\ue006"。
執行代碼后將會自動在人民郵電出版社官網的搜索框輸入 Python,并按 Enter 鍵實現提交。
類Keys的定義:
class Keys:"""Set of special keys codes."""NULL = "\ue000"CANCEL = "\ue001" # ^breakHELP = "\ue002"BACKSPACE = "\ue003"BACK_SPACE = BACKSPACETAB = "\ue004"CLEAR = "\ue005"RETURN = "\ue006"ENTER = "\ue007"SHIFT = "\ue008"LEFT_SHIFT = SHIFTRIGHT_SHIFT = "\ue050"CONTROL = "\ue009"LEFT_CONTROL = CONTROLRIGHT_CONTROL = "\ue051"ALT = "\ue00a"LEFT_ALT = ALTRIGHT_ALT = "\ue052"PAUSE = "\ue00b"ESCAPE = "\ue00c"SPACE = "\ue00d"PAGE_UP = "\ue00e"PAGE_DOWN = "\ue00f"END = "\ue010"HOME = "\ue011"LEFT = "\ue012"ARROW_LEFT = LEFTUP = "\ue013"ARROW_UP = UPRIGHT = "\ue014"ARROW_RIGHT = RIGHTDOWN = "\ue015"ARROW_DOWN = DOWNINSERT = "\ue016"DELETE = "\ue017"SEMICOLON = "\ue018"EQUALS = "\ue019"NUMPAD0 = "\ue01a" # number pad keysNUMPAD1 = "\ue01b"NUMPAD2 = "\ue01c"NUMPAD3 = "\ue01d"NUMPAD4 = "\ue01e"NUMPAD5 = "\ue01f"NUMPAD6 = "\ue020"NUMPAD7 = "\ue021"NUMPAD8 = "\ue022"NUMPAD9 = "\ue023"MULTIPLY = "\ue024"ADD = "\ue025"SEPARATOR = "\ue026"SUBTRACT = "\ue027"DECIMAL = "\ue028"DIVIDE = "\ue029"F1 = "\ue031" # function keysF2 = "\ue032"F3 = "\ue033"F4 = "\ue034"F5 = "\ue035"F6 = "\ue036"F7 = "\ue037"F8 = "\ue038"F9 = "\ue039"F10 = "\ue03a"F11 = "\ue03b"F12 = "\ue03c"META = "\ue03d"LEFT_META = METARIGHT_META = "\ue053"COMMAND = "\ue03d"LEFT_COMMAND = COMMANDZENKAKU_HANKAKU = "\ue040"# Extended macOS keysLEFT_OPTION = LEFT_ALTRIGHT_OPTION = RIGHT_ALT
六、其他操作
1.模擬單擊
獲取網頁元素后可以使用 click () 方法實現單擊該元素,即模擬單擊網頁中的某個元素所在的位置。
示例代碼(單擊人民郵電出版社官網中的 “圖書”):
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
driver.get('https://www.ptpress.com.cn/periodical')
elements = driver.find_elements(by=By.CLASS_NAME, value='item')
i = 0
for element in elements:print(i,'個',element.text)i += 1
elements[4].click()
input()
2.WebDriver 對象中的方法?
幾種常見的對瀏覽器操作的方法:
方法 | 功能 |
---|---|
back() | 返回到上一個頁面 |
forward() | 前進到下一個頁面 |
refresh() | 刷新當前頁面 |
quit() | 關閉當前瀏覽器 |
close() | 關閉當前標簽頁 |
3.不啟動瀏覽器也能獲取網頁資源
在通過代碼獲取網頁中的資源時,往往并不需要啟動瀏覽器,因為用戶需要獲取的是處理后的結果,而不是處理的過程。因此在驅動瀏覽器時,可以設置無窗口模式,即驅動瀏覽器后并不會打開瀏覽器窗口,而是將網頁代碼在內存中處理,類 Options 中的 add_argument () 方法即可實現在不啟動瀏覽器的情況下獲取網頁資源。其使用形式如下(寫入參數 '--headless' 即表明不啟動瀏覽器窗口):
options().add_argument('--headless')
from selenium import webdriver
from selenium.webdriver.edge.options import Options
from selenium.webdriver.common.by import By
edge_options = Options()
edge_options.add_argument('--headless')
edge_options.binary_location = r"C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe"
driver = webdriver.Edge(options = edge_options)
driver.get('https://www.ptpress.com.cn/')
elements = driver.find_elements(by=By.TAG_NAME,value='a')
for element in elements:print(element.text)
第 4 行代碼設置瀏覽器啟動無窗口模式。因此執行代碼后雖然不會顯示瀏覽器,但瀏覽器仍然會在內存中進行數據處理。第 9~10 行代碼獲取人民郵電出版社官網中所有標簽名為 a 的文本內容。