Python使用Selenium模擬瀏覽器操作的完整指南
引言
Selenium 核心價值在于模擬真實用戶的瀏覽器操作行為,能夠精準(zhǔn)還原打開頁面、輸入文本、點擊按鈕、滾動頁面等一系列操作,完美解決動態(tài) 網(wǎng)頁的數(shù)據(jù)爬取和自動化場景需求。本文將從實操角度出發(fā),詳細(xì)講解 Selenium 模擬各類瀏覽器操作的核心方法,附帶完整可運行代碼。
一、前期準(zhǔn)備(回顧必備)
- 已安裝 Selenium 庫:
pip install selenium -i https://pypi.doubanio.com/simple/ - 已配置對應(yīng)瀏覽器驅(qū)動(ChromeDriver 優(yōu)先,版本與瀏覽器大版本一致)
- 核心導(dǎo)入模塊(后續(xù)示例默認(rèn)包含以下導(dǎo)入):
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Keys import time
二、基礎(chǔ)操作:初始化瀏覽器與訪問網(wǎng)頁
這是模擬瀏覽器操作的第一步,完成瀏覽器的啟動、配置與目標(biāo)網(wǎng)頁的訪問。
1. 基礎(chǔ)初始化(可視化模式)
# 1. 初始化 Chrome 瀏覽器驅(qū)動(啟動瀏覽器)
driver = webdriver.Chrome()
# 2. 可選:最大化瀏覽器窗口(模擬用戶正常使用習(xí)慣)
driver.maximize_window()
# 3. 訪問目標(biāo)網(wǎng)頁(get 方法會等待頁面初步加載完成)
target_url = "https://www.baidu.com"
driver.get(target_url)
print(f"已成功訪問:{target_url},當(dāng)前頁面標(biāo)題:{driver.title}")
# 4. 可選:短暫延時,確保頁面完全渲染(后續(xù)優(yōu)先使用顯式等待)
time.sleep(2)
2. 無界面模式(后臺運行,不顯示瀏覽器窗口)
適合服務(wù)器運行或無需可視化的場景,節(jié)省系統(tǒng)資源:
# 1. 構(gòu)造 Chrome 配置對象
chrome_options = webdriver.ChromeOptions()
# 啟用無界面模式(Selenium 4.x 推薦寫法)
chrome_options.add_argument("--headless=new")
# 禁用 GPU 加速,避免部分環(huán)境報錯
chrome_options.add_argument("--disable-gpu")
# 2. 傳入配置初始化瀏覽器
driver = webdriver.Chrome(options=chrome_options)
driver.get("https://www.baidu.com")
print(f"無界面模式:頁面標(biāo)題為 {driver.title}")
三、核心操作1:定位頁面元素(操作的前提)
模擬瀏覽器操作的核心是「先定位元素,再執(zhí)行操作」,Selenium 提供了 6 種常用定位方式,其中 ID、XPath、CSS 選擇器 最為實用,優(yōu)先掌握。
| 定位方式 | 語法(By.XXX) | 適用場景 |
|---|---|---|
| ID 定位 | By.ID | 元素 ID 唯一(高效精準(zhǔn),優(yōu)先使用) |
| XPath 定位 | By.XPATH | 萬能靈活,可應(yīng)對復(fù)雜頁面(無唯一 ID/Class 時首選) |
| CSS 選擇器 | By.CSS_SELECTOR | 高效,與前端開發(fā)語法一致 |
| Name 定位 | By.NAME | 元素有唯一 name 屬性 |
| 標(biāo)簽名定位 | By.TAG_NAME | 批量查找相同標(biāo)簽(如所有 <a> 標(biāo)簽) |
| 鏈接文本定位 | By.LINK_TEXT | 精準(zhǔn)匹配 <a> 標(biāo)簽的完整文本 |
實操示例(以百度首頁為例)
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
time.sleep(2)
# 1. ID 定位(百度搜索框 ID 為 "kw")
search_input = driver.find_element(By.ID, "kw")
print("ID 定位成功:", search_input.tag_name)
# 2. XPath 定位(相對路徑,容錯性強)
search_button = driver.find_element(By.XPATH, '//input[@id="su"]')
print("XPath 定位成功:", search_button.tag_name)
# 3. CSS 選擇器定位(# 表示 ID,. 表示 Class)
news_link = driver.find_element(By.CSS_SELECTOR, 'a[ rel="external nofollow" ]')
print("CSS 選擇器定位成功:", news_link.text)
driver.quit()
說明:driver.find_element() 返回第一個匹配元素,driver.find_elements() 返回所有匹配元素列表(無匹配返回空列表)。
四、核心操作2:模擬用戶常用交互行為
1. 輸入與清空文本(如搜索框、登錄輸入框)
使用 send_keys() 輸入文本,clear() 清空輸入框內(nèi)容,是表單操作的核心方法。
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
time.sleep(2)
# 1. 定位搜索框,輸入關(guān)鍵詞
search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("Selenium 模擬瀏覽器操作") # 輸入任意文本(支持中文)
print("已輸入搜索關(guān)鍵詞")
time.sleep(2)
# 2. 清空搜索框內(nèi)容(可選)
search_input.clear()
print("已清空搜索框")
time.sleep(1)
# 3. 重新輸入并回車提交搜索(結(jié)合 Keys 類模擬鍵盤操作)
search_input.send_keys("Python 爬蟲進階")
search_input.send_keys(Keys.ENTER) # 模擬按下回車鍵
print("已提交搜索,等待結(jié)果加載")
time.sleep(3)
driver.quit()
2. 模擬點擊操作(按鈕、鏈接、復(fù)選框等)
使用 click() 方法模擬用戶左鍵點擊,支持所有可點擊元素(按鈕、<a> 標(biāo)簽、單選框等)。
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
time.sleep(2)
# 1. 定位搜索框,輸入關(guān)鍵詞
search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("Selenium 教程")
# 2. 定位搜索按鈕,模擬點擊提交
search_button = driver.find_element(By.ID, "su")
search_button.click() # 核心點擊方法
print("點擊搜索按鈕,提交查詢")
time.sleep(3)
# 3. 定位搜索結(jié)果中的鏈接,點擊跳轉(zhuǎn)
first_result = driver.find_element(By.XPATH, '//div[@id="content_left"]//a[1]')
first_result.click()
print("點擊第一條搜索結(jié)果,跳轉(zhuǎn)新頁面")
time.sleep(3)
driver.quit()
3. 模擬頁面滾動(應(yīng)對滾動加載、查看更多內(nèi)容)
動態(tài) 網(wǎng)頁常需要滾動頁面才能加載更多數(shù)據(jù),Selenium 推薦使用 execute_script() 執(zhí)行 JavaScript 腳本實現(xiàn)滾動,萬能且穩(wěn)定。
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.runoob.com/python/python-blog.html")
time.sleep(2)
# 1. 滾動到頁面底部(獲取完整動態(tài)數(shù)據(jù))
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
print("已滾動到頁面底部")
time.sleep(3)
# 2. 滾動到頁面頂部
driver.execute_script("window.scrollTo(0, 0);")
print("已滾動到頁面頂部")
time.sleep(2)
# 3. 滾動到指定位置(橫向 x=0,縱向 y=800 像素)
driver.execute_script("window.scrollTo(0, 800);")
print("已滾動到頁面 y=800 位置")
time.sleep(2)
# 4. 模擬逐頁滾動(PageDown 鍵)
driver.find_element(By.TAG_NAME, "body").send_keys(Keys.PAGE_DOWN)
print("已向下滾動一頁")
time.sleep(2)
driver.quit()
4. 瀏覽器窗口輔助操作(刷新、前進、后退、關(guān)閉)
模擬用戶對瀏覽器窗口的常用操作,完善自動化流程:
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
time.sleep(2)
# 1. 刷新當(dāng)前頁面
driver.refresh()
print("已刷新頁面")
time.sleep(2)
# 2. 訪問新頁面(為后續(xù)前進/后退做準(zhǔn)備)
driver.get("https://www.runoob.com")
print("已訪問菜鳥教程")
time.sleep(2)
# 3. 后退到上一個頁面(百度首頁)
driver.back()
print("已后退到百度首頁")
time.sleep(2)
# 4. 前進到下一個頁面(菜鳥教程)
driver.forward()
print("已前進到菜鳥教程")
time.sleep(2)
# 5. 關(guān)閉瀏覽器(釋放所有資源,推薦使用 quit() 而非 close())
# driver.close() # 關(guān)閉當(dāng)前窗口(多窗口時適用)
driver.quit() # 退出瀏覽器,釋放所有資源
print("瀏覽器已關(guān)閉")
五、關(guān)鍵優(yōu)化:等待元素加載(避免操作失?。?/h2>
動態(tài) 網(wǎng)頁存在加載延遲,直接執(zhí)行操作可能會因元素未加載完成而拋出 NoSuchElementException 異常。Selenium 提供 3 種等待策略,顯式等待 是最優(yōu)選擇。
1. 強制等待(最簡單,不推薦)
即 time.sleep(seconds),固定延時,無論頁面是否加載完成都等待,適合簡單場景或臨時調(diào)試。
driver.get("https://www.baidu.com")
time.sleep(2) # 固定等待 2 秒
2. 隱式等待(全局生效,中等推薦)
通過 driver.implicitly_wait(seconds) 設(shè)置全局等待時間,在指定時間內(nèi)會不斷嘗試定位元素,直到找到或超時。
driver = webdriver.Chrome()
# 設(shè)置隱式等待 10 秒(全局生效,僅對元素定位操作有效)
driver.implicitly_wait(10)
driver.get("https://www.baidu.com")
# 若 10 秒內(nèi)找到元素則立即執(zhí)行,否則拋出異常
search_input = driver.find_element(By.ID, "kw")
search_input.send_keys("隱式等待測試")
driver.quit()
3. 顯式等待(靈活高效,強烈推薦)
通過 WebDriverWait 配合 expected_conditions,針對單個元素設(shè)置個性化等待條件(如元素可見、可點擊),超時后拋出明確異常,適合復(fù)雜動態(tài)頁面。
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.maximize_window()
driver.get("https://www.baidu.com")
# 1. 構(gòu)造顯式等待對象(最長等待 10 秒,每 0.5 秒檢查一次條件)
wait = WebDriverWait(driver, 10, poll_frequency=0.5)
# 2. 等待搜索框可點擊(常用條件:element_to_be_clickable)
search_input = wait.until(
EC.element_to_be_clickable((By.ID, "kw")),
message="超時:未找到可點擊的百度搜索框"
)
# 3. 元素加載完成后執(zhí)行操作
search_input.send_keys("顯式等待測試")
print("輸入成功,等待條件滿足")
driver.quit()
常用等待條件:EC.visibility_of_element_located()(元素可見)、EC.presence_of_element_located()(元素存在于 DOM 中)、EC.element_to_be_clickable()(元素可點擊)。
六、完整實戰(zhàn):模擬瀏覽器完成搜索+滾動+數(shù)據(jù)提取
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup
import time
def simulate_browser_operation():
# 1. 初始化瀏覽器
driver = webdriver.Chrome()
driver.maximize_window()
target_url = "https://www.baidu.com"
try:
# 2. 訪問網(wǎng)頁
driver.get(target_url)
print(f"已訪問:{target_url}")
# 3. 顯式等待搜索框,輸入關(guān)鍵詞并提交
wait = WebDriverWait(driver, 10)
search_input = wait.until(
EC.element_to_be_clickable((By.ID, "kw")),
message="超時:搜索框未加載完成"
)
search_input.send_keys("Selenium 模擬瀏覽器操作 實戰(zhàn)")
search_input.send_keys(Keys.ENTER)
print("已提交搜索,等待結(jié)果加載")
time.sleep(3)
# 4. 模擬滾動頁面,查看更多結(jié)果
driver.execute_script("window.scrollTo(0, 1000);")
print("已滾動到搜索結(jié)果中部")
time.sleep(2)
# 5. 獲取頁面源碼,提取第一條結(jié)果標(biāo)題
html_source = driver.page_source
soup = BeautifulSoup(html_source, "lxml")
first_result_title = soup.find("h3", class_="t").get_text(strip=True)
print(f"\n第一條搜索結(jié)果標(biāo)題:{first_result_title}")
except Exception as e:
print(f"操作過程中出現(xiàn)錯誤:{e}")
finally:
# 6. 關(guān)閉瀏覽器
time.sleep(2)
driver.quit()
print("\n瀏覽器已關(guān)閉,操作流程結(jié)束")
if __name__ == "__main__":
simulate_browser_operation()
七、常見問題與解決辦法
NoSuchElementException(未找到元素):① 檢查定位表達式(ID、XPath)是否正確;② 頁面未加載完成,替換為顯式等待;③ 元素在iframe中,需先切換:driver.switch_to.frame(iframe_element)。- 驅(qū)動與瀏覽器版本不匹配:下載與瀏覽器大版本一致的驅(qū)動(如 Chrome 119.x 對應(yīng) ChromeDriver 119.x),避免過新或過舊。
- 點擊操作無響應(yīng):① 元素被遮擋(如廣告彈窗),先關(guān)閉彈窗;② 元素不可點擊,等待
EC.element_to_be_clickable()條件滿足。 - 中文輸入亂碼:Selenium 4.x 已良好支持中文,確保瀏覽器編碼為 UTF-8,直接使用
send_keys()傳入中文即可。
以上就是Python使用Selenium模擬瀏覽器操作的完整指南的詳細(xì)內(nèi)容,更多關(guān)于Python Selenium模擬瀏覽器操作的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
pytorch獲取模型某一層參數(shù)名及參數(shù)值方式
今天小編就為大家分享一篇pytorch獲取模型某一層參數(shù)名及參數(shù)值方式,具有很好的價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python list等分并從等分的子集中隨機選取一個數(shù)
這篇文章主要介紹了python list等分并從等分的子集中隨機選取一個數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
超簡單的scrapy實現(xiàn)ip動態(tài)代理與更換ip的方法實現(xiàn)
這篇文章主要介紹了超簡單的scrapy實現(xiàn)ip動態(tài)代理與更換ip的方法實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
python生成器函數(shù)yield與yield?from使用
生成器函數(shù)通過yield實現(xiàn)在調(diào)用時逐項生成值,實現(xiàn)惰性計算以節(jié)省內(nèi)存量,yieldfrom用于委托其他生成器或迭代器,直接傳遞其生成的值給調(diào)用者,而非返回整個生成器對象,使數(shù)據(jù)處理更高效2025-08-08
pycharm遠(yuǎn)程調(diào)試openstack的圖文教程
這篇文章主要為大家詳細(xì)介紹了pycharm遠(yuǎn)程調(diào)試openstack的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11
Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程
ORM,即Object-Relational Mapping(對象關(guān)系映射),它的作用是在關(guān)系型數(shù)據(jù)庫和業(yè)務(wù)實體對象之間作一個映射,下面這篇文章主要給大家介紹了關(guān)于Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2018-03-03

