- Python全棧開發:數據分析
- 夏正東編著
- 3756字
- 2023-07-17 20:52:47
1.5.4 Selenium的應用
本節的示例代碼均以Chrome瀏覽器為例,其他瀏覽器的操作參考Chrome瀏覽器即可。
1.打開瀏覽器
可以通過Selenium.webdriver模塊中瀏覽器所對應的相關方法(如表1-15所示)打開瀏覽器,并獲得WebDriver對象。
表1-15 瀏覽器對應的方法

示例代碼如下:
#資源包\Code\chapter1\1.5\0166.py from selenium import webdriver #創建瀏覽器WebDriver對象,并打開Chrome瀏覽器 Chrome_browser=webdriver.Chrome() print(type(Chrome_browser))
2.關閉窗口
可以通過WebDriver對象提供的相關方法關閉窗口,具體如下。
1)close()方法
該方法用于關閉單個窗口,其語法格式如下:
close()
2)quit()方法
該方法用于關閉所有窗口,其語法格式如下:
quit()
示例代碼如下:
#資源包\Code\chapter1\1.5\0167.py from selenium import webdriver import time #創建瀏覽器WebDriver對象,并打開Chrome瀏覽器 Chrome_browser=webdriver.Chrome() time.sleep(2) Chrome_browser.quit()
3.獲取網頁源代碼
可以通過WebDriver對象的相關屬性和方法獲取網頁源代碼,具體如下。
1)屬性page_source
該屬性用于獲取網頁的源代碼,其語法格式如下:
page_source
2)get()方法
該方法用于訪問指定的URL,其語法格式如下:
get(url)
其中,參數url表示URL。
示例代碼如下:
#資源包\Code\chapter1\1.5\0168.py from selenium import webdriver import time Chrome_browser=webdriver.Chrome() url='http://www.oldxia.com/' Chrome_browser.get(url) res=Chrome_browser.page_source with open('oldxia.html','w',encoding='utf-8')as f: f.write(res) time.sleep(2) Chrome_browser.quit()
4.獲取網頁信息
可以通過WebDriver對象的相關屬性獲取網頁信息,具體如下。
1)屬性title
該屬性用于獲取當前頁面的標題,其語法格式如下:
title
2)屬性current_url
該屬性用于獲取當前頁面的URL,其語法格式如下:
current_url
示例代碼如下:
#資源包\Code\chapter1\1.5\0169.py from selenium import webdriver import time Chrome_browser=webdriver.Chrome() url='http://www.oldxia.com/' Chrome_browser.get(url) Chrome_title=Chrome_browser.title Chrome_current_url=Chrome_browser.current_url print(Chrome_title) print(Chrome_current_url) time.sleep(2) Chrome_browser.quit()
5.操作網頁
可以通過WebDriver對象的相關方法操作網頁,具體如下。
1)set_window_size()方法
該方法用于設置瀏覽器的尺寸,其語法格式如下:
set_window_size(width,height)
其中,參數width表示瀏覽器的寬度;參數height表示瀏覽器的高度。
2)back()方法
該方法用于控制瀏覽器后退,其語法格式如下:
back()
3)forward()方法
該方法用于控制瀏覽器前進,其語法格式如下:
forward()
4)refresh()方法
該方法用于刷新當前頁面,其語法格式如下:
refresh()
示例代碼如下:
#資源包\Code\chapter1\1.5\0170.py from selenium import webdriver import time Chrome_browser=webdriver.Chrome() url='http://www.oldxia.com/' Chrome_browser.get(url) Chrome_browser.set_window_size(1000,600) Chrome_browser.refresh() Chrome_browser.back() Chrome_browser.forward() time.sleep(2) Chrome_browser.quit()
6.元素定位
可以通過WebDriver對象的相關方法對網頁中的元素進行定位。
1)find_element()方法
該方法用于獲取符合條件的第1個元素,并返回一個WebElement對象,其語法格式如下:
find_element(by,value)
其中,參數by表示selenium.webdriver.common.by模塊中的By類,其包括多種元素定位的方式,即By.ID(id屬性)、By.CLASS_NAME(class屬性)、By.NAME(name屬性)、By.TAG_NAME(標簽名)、By.XPATH(XPath)、By.CSS_SELECTOR(CSS選擇器)、By.LINK_TEXT(超鏈接文本內容)和By.PARTIAL_LINK_TEXT(部分超鏈接文本內容);參數value表示元素定位方式所對應的值。
2)find_elements()方法
該方法用于獲取符合條件的所有元素,并返回一個由WebElement對象所組成的列表,其語法格式如下:
find_elements(by,value)
其中,參數by表示selenium.webdriver.common.by模塊中的By類,其包括多種元素定位的方式,即By.ID(id屬性)、By.CLASS_NAME(class屬性)、By.NAME(name屬性)、By.TAG_NAME(標簽名)、By.XPATH(XPath)、By.CSS_SELECTOR(CSS選擇器)、By.LINK_TEXT(超鏈接文本內容)和By.PARTIAL_LINK_TEXT(部分超鏈接文本內容);參數value表示元素定位方式所對應的值。
示例代碼如下:
from selenium import webdriver from selenium.webdriver.common.by import By import time Chrome_browser=webdriver.Chrome() url='http://www.sina.com.cn/' Chrome_browser.get(url) res1=Chrome_browser.find_element(by=By.ID,value='xy-impcon') print(res1) print(type(res1)) print('================================') res2=Chrome_browser.find_elements(by=By.CLASS_NAME,value='linkNewsTopBold') print(res2) print(type(res2)) print('================================') res3=Chrome_browser.find_element(by=By.NAME,value='loginname') print(res3) print(type(res3)) print('================================') res4=Chrome_browser.find_element(by=By.TAG_NAME,value='input') print(res4) print(type(res4)) print('================================') res5=Chrome_browser.find_element(by=By.XPATH,value="//div[@id='SI_Order_B']") print(res5) print(type(res5)) print('================================') res6=Chrome_browser.find_element(by=By.CSS_SELECTOR,value='#SI_Order_B') print(res6) print(type(res6)) print('================================') res7=Chrome_browser.find_element(by=By.LINK_TEXT,value='做大做強數字經濟構筑國家競爭 新優勢') print(res7) print(type(res7)) print('================================') res8=Chrome_browser.find_element(by=By.PARTIAL_LINK_TEXT,value='文明之美看東方') print(res8) print(type(res8)) time.sleep(2) Chrome_browser.quit()
7.獲取元素信息
可以通過WebElement對象的相關屬性和方法獲取元素信息,具體如下:
1)屬性text
該屬性用于獲取元素的文本內容,其語法格式如下:
text
2)屬性size
該屬性用于獲取元素的尺寸,其語法格式如下:
size
3)get_attribute()方法
該方法用于獲取元素中指定屬性的屬性值,其語法格式如下:
get_attribute(name)
其中,參數name表示元素的屬性。
示例代碼如下:
#資源包\Code\chapter1\1.5\0172.py from selenium import webdriver from selenium.webdriver.common.by import By import time Chrome_browser=webdriver.Chrome() url='https://www.baidu.com/' Chrome_browser.get(url) time.sleep(3) element=Chrome_browser.find_element(by=By.LINK_TEXT,value="新聞") ele_text=element.text ele_attribute=element.get_attribute('class') ele_size=element.size print(ele_text) print(ele_attribute) print(ele_size) time.sleep(2) Chrome_browser.quit()
8.操作元素
可以通過WebElement對象的click()方法單擊指定的元素,其語法格式如下:
click()
示例代碼如下:
#資源包\Code\chapter1\1.5\0173.py from selenium import webdriver from selenium.webdriver.common.by import By import time Chrome_browser=webdriver.Chrome() url='https://www.baidu.com/' Chrome_browser.get(url) time.sleep(3) element=Chrome_browser.find_element(by=By.LINK_TEXT,value="新聞") element.click() time.sleep(2) Chrome_browser.quit()
9.鼠標事件
鼠標事件主要用于在網頁中模擬鼠標操作。
在Selenium中,關于鼠標事件的相關方法均封裝在selenium.webdriver.common.action_chains模塊中的ActionChains類,具體如下。
1)ActionChains()方法
該方法主要用于創建ActionChains對象,其語法格式如下:
ActionChains(driver)
其中,參數driver表示WebDriver對象。
2)move_to_element()方法
該方法主要用于執行鼠標的懸停操作,其語法格式如下:
move_to_element(to_element)
其中,參數to_element表示WebElement對象。
3)context_click()方法
該方法主要用于執行鼠標的右擊操作,其語法格式如下:
context_click(on_element)
其中,參數on_element表示WebElement對象。
4)double_click()方法
該方法主要用于執行雙擊鼠標的左鍵操作,其語法格式如下:
double_click(on_element)
其中,參數on_element表示WebElement對象。
5)perform()方法
該方法用于提交鼠標事件,其語法格式如下:
perform()
示例代碼如下:
#資源包\Code\chapter1\1.5\0174.py from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import time Chrome_browser=webdriver.Chrome() url='http://www.baidu.com/' Chrome_browser.get(url) Chrome_browser.set_window_size(1600,800) element1=Chrome_browser.find_element(by=By.ID,value='s-usersetting-top') ActionChains(Chrome_browser).move_to_element(element1).perform() time.sleep(3) Chrome_browser.refresh() element2=Chrome_browser.find_element(by=By.LINK_TEXT,value="圖片") ActionChains(Chrome_browser).context_click(element2).perform() time.sleep(3) Chrome_browser.refresh() element3=Chrome_browser.find_element(by=By.LINK_TEXT,value="新聞") ActionChains(Chrome_browser).double_click(element3).perform() time.sleep(2) Chrome_browser.quit()
10.鍵盤事件
鍵盤事件主要用于在網頁中模擬鍵盤操作。
可以通過WebElement對象的send_keys()方法模擬鍵盤操作,其語法格式如下:
send_keys(*value)
其中,參數value既可以表示用戶自定義的輸入信息,又可以模擬鍵盤中的按鍵,而鍵盤中的按鍵則需要通過selenium.webdriver.common.keys模塊中Keys類的常量進行表示,其常用的按鍵如表1-16所示。
表1-16 鍵盤中常用的按鍵

示例代碼如下:
#資源包\Code\chapter1\1.5\0175.py from selenium import webdriver from selenium.webdriver.common.by import By import time Chrome_browser=webdriver.Chrome() url='http://www.baidu.com/' Chrome_browser.get(url) Chrome_browser.set_window_size(1600,800) Chrome_browser.find_element(by=By.ID,value='kw').send_keys('老夏學院') Chrome_browser.find_element(by=By.ID,value='su').click() time.sleep(2) Chrome_browser.quit()
11.切換窗口
在操作網頁的過程中,經常涉及窗口的切換,即當單擊網頁中的某個鏈接時,如果新打開了一個窗口,并且需要在該窗口進行相關操作,則此時必須進行窗口切換,因為當前的窗口句柄仍然是鏈接所在頁面的窗口,如果不切換窗口,就無法在新打開的窗口中進行相關操作。
可以通過WebDriver對象中的相關屬性切換窗口,具體如下。
1)屬性current_window_handle
該屬性用于獲得當前窗口句柄,其語法格式如下:
current_window_handle
2)屬性window_handles
該屬性用于獲得當前所有打開的窗口句柄,其語法格式如下:
window_handles
3)屬性switch_to
該屬性用于創建SwitchTo對象,并通過該對象的window()方法切換到指定的窗口,其語法格式如下:
switch_to.window(window_name)
其中,參數window_name表示窗口句柄。
示例代碼如下:
#資源包\Code\chapter1\1.5\0176.py from selenium import webdriver from selenium.webdriver.common.by import By import time Chrome_browser=webdriver.Chrome() url='http://www.baidu.com/' Chrome_browser.get(url) Chrome_browser.set_window_size(1600,800) #獲得當前的窗口句柄,即"百度首頁" sreach_Windows=Chrome_browser.current_window_handle Chrome_browser.find_element(by=By.LINK_TEXT,value='登錄').click() time.sleep(2) Chrome_browser.find_element(by=By.LINK_TEXT,value="立即注冊").click() time.sleep(2) #獲得當前所有打開的窗口句柄,包括"百度首頁",以及新彈出的窗口"立即注冊" all_handles=Chrome_browser.window_handles for handle in all_handles: #如果當前窗口句柄不是"百度首頁",則將窗口切換為"立即注冊" if handle!=sreach_Windows: Chrome_browser.switch_to.window(handle) print('這里是"立即注冊"') Chrome_browser.find_element(by=By.NAME,value="userName").send_keys('123456789') time.sleep(2) time.sleep(2) Chrome_browser.quit()
12.操作警告框、確認框和提示框
首先,通過SwitchTo對象的屬性alert定位到JavaScript所生成的警告框、確認框和提示框,并返回一個Alert對象,其語法格式如下:
alert
然后,通過Alert對象的相關屬性和方法即可操作警告框、確認框和提示框。
1)屬性text
該屬性用于獲取警告框、確認框或提示框中的文本內容,其語法格式如下:
text
2)accept()方法
該方法用于接受警告框、確認框和提示框,其語法格式如下:
accept()
3)dismiss()方法
該方法用于解散警告框、確認框和提示框,其語法格式如下:
dismiss()
4)send_keys()方法
該方法用于將文本內容發送至提示框,其語法格式如下:
send_keys(keysToSend)
其中,參數keysToSend表示待發送的文本內容。
示例代碼如下:
#資源包\Code\chapter1\1.5\0177.py from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import time Chrome_browser=webdriver.Chrome() url='http://www.baidu.com/' Chrome_browser.get(url) Chrome_browser.set_window_size(1600,800) link=Chrome_browser.find_element(by=By.ID,value='s-usersetting-top') ActionChains(Chrome_browser).move_to_element(link).perform() Chrome_browser.find_element(by=By.LINK_TEXT,value="搜索設置").click() time.sleep(2) #保存設置 Chrome_browser.find_element(by=By.CLASS_NAME,value="prefpanelgo").click() time.sleep(2) print(Chrome_browser.switch_to.alert.text) Chrome_browser.switch_to.alert.accept() time.sleep(2) Chrome_browser.quit()
13.操作下拉菜單
可以通過selenium.webdriver.support.select模塊中Select類的相關方法操作下拉菜單,具體如下。
1)select_by_value()方法
該方法通過select標簽中value屬性的屬性值操作下拉菜單,其語法格式如下:
select_by_value(value)
其中,參數value表示select標簽中value屬性的屬性值。
2)select_by_index()方法
該方法通過下拉菜單中的選項索引值操作下拉菜單,其語法格式如下:
select_by_index(index)
其中,參數index表示下拉菜單中的選項索引值。
3)select_by_visible_text()方法
該方法通過select標簽中option標簽的文本內容操作下拉菜單,其語法格式如下:
select_by_visible_text(text)
其中,參數text表示select標簽中option標簽的文本內容。
示例代碼如下:
#資源包\Code\chapter1\1.5\0178.py from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select import time Chrome_browser=webdriver.Chrome() url='http://www.oldxia.com/selenium.html' Chrome_browser.get(url) time.sleep(3) sel=Chrome_browser.find_element(by=By.NAME,value="city") Select(sel).select_by_visible_text('大連') time.sleep(2) Chrome_browser.quit()
14.上傳文件
可以通過WebElement對象的send_keys()方法操作input標簽上傳文件,其語法格式如下:
send_keys(*value)
其中,參數value表示待上傳文件的路徑。
示例代碼如下:
#資源包\Code\chapter1\1.5\0179.py from selenium import webdriver from selenium.webdriver.common.by import By import time Chrome_browser=webdriver.Chrome() url='http://www.oldxia.com/selenium.html' Chrome_browser.get(url) time.sleep(3) Chrome_browser.find_element(by=By.NAME,value="file").send_keys('E:\Python全棧開發\ selenium.txt') time.sleep(2) Chrome_browser.quit()
15.管理Cookie
可以通過WebDriver對象的相關方法管理Cookie,具體如下。
1)get_Cookies()方法
該方法用于獲取所有Cookie信息,其語法格式如下:
get_Cookies()
2)get_Cookie()方法
該方法用于獲取指定名稱的Cookie信息,其語法格式如下:
get_Cookie(name)
其中,參數name表示Cookie的名稱。
3)add_Cookie()方法
該方法用于添加Cookie信息,其語法格式如下:
add_Cookie(Cookie_dict)
其中,參數Cookie_dict表示字典,并且必須具有name鍵和value鍵。
4)delete_Cookie()方法
該方法用于刪除指定的Cookie信息,其語法格式如下:
delete_Cookie(name)
其中,參數name表示待刪除的Cookie名稱。
5)delete_all_Cookies()方法
該方法用于刪除所有Cookie信息,其語法格式如下:
delete_all_Cookies()
示例代碼如下:
#資源包\Code\chapter1\1.5\0180.py from selenium import webdriver import time Chrome_browser=webdriver.Chrome() url='https://www.baidu.com' Chrome_browser.get(url) print('=====================================') print("所有的Cookie信息:") print(Chrome_browser.get_Cookies()) print('=====================================') dict={'name':"name",'value':'夏正東'} Chrome_browser.add_Cookie(dict) print('添加的Cookie信息:') print(Chrome_browser.get_Cookie('name')) print('=====================================') Chrome_browser.delete_Cookie('name') print('刪除名稱為name的Cookie后,所有的Cookie信息:') num=0 forCookie in Chrome_browser.get_Cookies(): print(f"{Cookie['name']}——{Cookie['value']}") num+=1 print(f'共有{num}條Cookie信息') print('=====================================') print('刪除所有Cookie信息:') Chrome_browser.delete_all_Cookies() num=0 forCookie in Chrome_browser.get_Cookies(): print(f"{Cookie['name']}——{Cookie['value']}") num+=1 print(f'共有{num}條Cookie信息') print('=====================================') time.sleep(2) Chrome_browser.quit()
16.控制滾動條
在Selenium中,沒有提供相關的屬性或方法用于控制滾動條。在這種情況下,可以首先使用JavaScript控制滾動條,然后使用WebDriver對象提供的execute_script()方法來執行JavaScript代碼即可,其語法格式如下:
execute_script(script)
其中,參數script表示JavaScript代碼,示例代碼如下:

17.窗口截圖
可以通過WebDriver對象提供的get_screenshot_as_file()方法進行窗口截圖,其語法格式如下:
get_screenshot_as_file(filename)
其中,參數filename表示圖片存儲的路徑,示例代碼如下:
#資源包\Code\chapter1\1.5\0182.py from selenium import webdriver from selenium.webdriver.common.by import By import time Chrome_browser=webdriver.Chrome() url='http://www.baidu.com/' Chrome_browser.get(url) Chrome_browser.set_window_size(1600,800) Chrome_browser.find_element(by=By.ID,value="kw").send_keys("老夏學院") Chrome_browser.find_element(by=By.ID,value="su").click() time.sleep(2) Chrome_browser.get_screenshot_as_file("E:\Python全棧開發\selenium.png") time.sleep(2) Chrome_browser.quit()
18.Chrome無界面瀏覽器
之前所應用的Selenium,都是直接操作有界面的瀏覽器,這就勢必會影響爬取數據的速度,而為了盡可能地提高爬取數據的速度,則可以使用Chrome無界面瀏覽器進行數據的爬取,其步驟如下:
首先,通過selenium.webdriver.chrome.options中的Options類創建Options對象,用于操作Chrome無界面瀏覽器。
其次,使用Options對象的add_argument()方法啟動參數配置,并將該方法中的參數argument的值設置為“—headless”,表示使用無界面瀏覽器。
最后,在使用Chrome類創建WebDriver對象時設置參數options,并且該參數對應的值需為之前所創建的Options對象。
示例代碼如下:
#資源包\Code\chapter1\1.5\0183.py from selenium import webdriver from selenium.webdriver.chrome.options import Options Chrome_options=Options() Chrome_options.add_argument(argument='--headless') Chrome_browser=webdriver.Chrome(options=Chrome_options) url='http://www.oldxia.com/' Chrome_browser.get(url) Chrome_browser.get_screenshot_as_file('oldxia.png') Chrome_browser.quit()
- Spring 5企業級開發實戰
- Mobile Application Development:JavaScript Frameworks
- Learning Linux Binary Analysis
- Processing互動編程藝術
- C語言從入門到精通(第4版)
- R大數據分析實用指南
- Scala編程實戰(原書第2版)
- SQL Server從入門到精通(第3版)
- 一塊面包板玩轉Arduino編程
- Swift 4從零到精通iOS開發
- QGIS Python Programming Cookbook(Second Edition)
- Nagios Core Administration Cookbook(Second Edition)
- SwiftUI極簡開發
- Java 9 with JShell
- 安卓工程師教你玩轉Android