最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用Selenium模擬瀏覽器操作的完整指南

 更新時間:2026年01月04日 11:37:56   作者:剛哥的進化路  
Selenium?核心價值在于模擬真實用戶的瀏覽器操作行為,能夠精準(zhǔn)還原打開頁面、輸入文本、點擊按鈕、滾動頁面等一系列操作,本文將從實操角度出發(fā),詳細(xì)講解?Selenium?模擬各類瀏覽器操作的核心方法,需要的朋友可以參考下

引言

Selenium 核心價值在于模擬真實用戶的瀏覽器操作行為,能夠精準(zhǔn)還原打開頁面、輸入文本、點擊按鈕、滾動頁面等一系列操作,完美解決動態(tài) 網(wǎng)頁的數(shù)據(jù)爬取和自動化場景需求。本文將從實操角度出發(fā),詳細(xì)講解 Selenium 模擬各類瀏覽器操作的核心方法,附帶完整可運行代碼。

一、前期準(zhǔn)備(回顧必備)

  1. 已安裝 Selenium 庫:pip install selenium -i https://pypi.doubanio.com/simple/
  2. 已配置對應(yīng)瀏覽器驅(qū)動(ChromeDriver 優(yōu)先,版本與瀏覽器大版本一致)
  3. 核心導(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()

七、常見問題與解決辦法

  1. NoSuchElementException(未找到元素):① 檢查定位表達式(ID、XPath)是否正確;② 頁面未加載完成,替換為顯式等待;③ 元素在 iframe 中,需先切換:driver.switch_to.frame(iframe_element)。
  2. 驅(qū)動與瀏覽器版本不匹配:下載與瀏覽器大版本一致的驅(qū)動(如 Chrome 119.x 對應(yīng) ChromeDriver 119.x),避免過新或過舊。
  3. 點擊操作無響應(yīng):① 元素被遮擋(如廣告彈窗),先關(guān)閉彈窗;② 元素不可點擊,等待 EC.element_to_be_clickable() 條件滿足。
  4. 中文輸入亂碼: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ù)值方式

    今天小編就為大家分享一篇pytorch獲取模型某一層參數(shù)名及參數(shù)值方式,具有很好的價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python list等分并從等分的子集中隨機選取一個數(shù)

    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)

    這篇文章主要介紹了超簡單的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使用

    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的圖文教程

    pycharm遠(yuǎn)程調(diào)試openstack的圖文教程

    這篇文章主要為大家詳細(xì)介紹了pycharm遠(yuǎn)程調(diào)試openstack的圖文教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Python制作動態(tài)字符畫的源碼

    Python制作動態(tài)字符畫的源碼

    python字符畫是一個簡單有趣的圖畫,它一般由程序制作而成,接下來通過本文給大家分享Python制作動態(tài)字符畫的源碼,需要的朋友可以參考下
    2021-08-08
  • numpy.sum()的使用詳解

    numpy.sum()的使用詳解

    這篇文章主要介紹了numpy.sum()的使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 《與孩子一起學(xué)編程》python自測題

    《與孩子一起學(xué)編程》python自測題

    本文內(nèi)容是關(guān)于《與孩子一起學(xué)編程》python自測題,大家可以跟著測試題上機測試下程序。
    2018-05-05
  • python中open函數(shù)對文件處理的使用教程

    python中open函數(shù)對文件處理的使用教程

    open()函數(shù)的作用是打開一個文件,并返回一個file對象(即文件對象),下面這篇文章主要給大家介紹了關(guān)于python中open函數(shù)對文件處理的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Django學(xué)習(xí)筆記之ORM基礎(chǔ)教程

    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

最新評論

贵州省| 华容县| 遂宁市| 赤壁市| 桑日县| 红河县| 龙门县| 曲水县| 远安县| 霍山县| 永济市| 扎囊县| 岳阳市| 卓资县| 阿克陶县| 东阳市| 朝阳市| 三原县| 宕昌县| 两当县| 莒南县| 利津县| 疏附县| 龙南县| 工布江达县| 柳江县| 凉城县| 夏邑县| 迁西县| 浮梁县| 庄浪县| 庆安县| 汨罗市| 周至县| 娱乐| 南丰县| 雅江县| 苏尼特左旗| 丰台区| 抚顺市| 凤台县|