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

從入門到精通解析Python Selenium如何模擬瀏覽器操作

 更新時間:2026年01月09日 09:29:04   作者:愛吃提升  
Selenium是一款開源的自動化測試工具,核心優(yōu)勢在于能模擬真實用戶操作瀏覽器,下面小編就來和大家詳細(xì)講講Python Selenium如何模擬瀏覽器的相關(guān)操作吧

Selenium是一款開源的自動化測試工具,核心優(yōu)勢在于能模擬真實用戶操作瀏覽器(如點擊、輸入、滾動),并渲染動態(tài)加載的網(wǎng)頁內(nèi)容(解決Requests庫無法爬取JS動態(tài)數(shù)據(jù)的問題)。

一、Selenium入門準(zhǔn)備:環(huán)境搭建與核心原理

1. 核心原理

Selenium通過“瀏覽器驅(qū)動(Driver)”與瀏覽器通信:Python代碼發(fā)送操作指令→Driver解析指令→瀏覽器執(zhí)行操作并返回渲染后的頁面數(shù)據(jù),完美適配JS動態(tài)渲染的網(wǎng)頁(如Ajax加載、Vue/React前端頁面)。

2. 環(huán)境安裝

(1)安裝Selenium庫

# 安裝最新版Selenium
pip install selenium

關(guān)鍵步驟

查看瀏覽器版本(如Chrome:設(shè)置→關(guān)于Chrome,查看版本號);

下載對應(yīng)版本的驅(qū)動(版本號需完全匹配,如Chrome 120.x對應(yīng)ChromeDriver 120.x);

配置驅(qū)動路徑:

  • 方法1:將驅(qū)動文件放入Python安裝目錄(如Python39/Scripts),無需手動指定路徑;
  • 方法2:手動指定驅(qū)動路徑(推薦,避免版本沖突)。

3. 驗證環(huán)境

# 導(dǎo)入Selenium核心模塊
from selenium import webdriver
from selenium.webdriver.chrome.service import Service

# 手動指定ChromeDriver路徑
driver_path = "C:/chromedriver.exe"  # Windows路徑示例
# 初始化瀏覽器對象
driver = webdriver.Chrome(service=Service(driver_path))
# 打開測試網(wǎng)頁
driver.get("https://www.baidu.com")
# 打印網(wǎng)頁標(biāo)題(輸出“百度一下,你就知道”則環(huán)境正常)
print(driver.title)
# 關(guān)閉瀏覽器
driver.quit()

二、Selenium基礎(chǔ)操作:瀏覽器與頁面控制

1. 瀏覽器核心操作

操作代碼示例說明
打開網(wǎng)頁driver.get("https://www.xxx.com")加載目標(biāo)URL
刷新頁面driver.refresh()模擬瀏覽器刷新
前進(jìn)/后退driver.forward() / driver.back()模擬瀏覽器前進(jìn)/后退按鈕
窗口最大化driver.maximize_window()避免元素因窗口過小無法定位
設(shè)置窗口大小driver.set_window_size(1920, 1080)自定義窗口分辨率
獲取當(dāng)前URLdriver.current_url查看當(dāng)前頁面URL(驗證跳轉(zhuǎn)是否成功)
獲取頁面源碼driver.page_source獲取渲染后的完整HTML源碼(含JS動態(tài)內(nèi)容)

2. 等待機制:解決元素加載延遲問題

網(wǎng)頁動態(tài)加載時,直接定位元素會因“元素未加載完成”報錯,Selenium提供3種等待方式:

(1)強制等待(不推薦)

import time
# 強制等待3秒(無論元素是否加載完成)
time.sleep(3)

(2)隱式等待(全局生效)

# 設(shè)置隱式等待:最長等待10秒,元素加載完成則立即執(zhí)行
driver.implicitly_wait(10)

(3)顯式等待(推薦,精準(zhǔn)控制)

針對指定元素設(shè)置等待條件(如元素可點擊、可見),超時則拋出異常:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 等待“百度搜索框”可見,最長等待10秒
wait = WebDriverWait(driver, 10)
search_box = wait.until(
    EC.visibility_of_element_located((By.ID, "kw"))
)

常用等待條件

  • EC.visibility_of_element_located:元素可見;
  • EC.element_to_be_clickable:元素可點擊;
  • EC.presence_of_element_located:元素存在于DOM中;
  • EC.text_to_be_present_in_element:元素包含指定文本。

三、核心技能:元素定位(爬取/操作的關(guān)鍵)

元素定位是Selenium的核心,需根據(jù)網(wǎng)頁結(jié)構(gòu)選擇最優(yōu)定位方式,優(yōu)先選擇唯一標(biāo)識(ID、Name),其次選擇XPath/CSS選擇器。

1. 8種定位方式(按優(yōu)先級排序)

定位方式代碼示例適用場景
ID定位driver.find_element(By.ID, "kw")元素有唯一ID(如百度搜索框id=“kw”)
Name定位driver.find_element(By.NAME, "wd")元素有唯一Name屬性
Class定位driver.find_element(By.CLASS_NAME, "s_ipt")元素Class屬性唯一
Tag定位driver.find_element(By.TAG_NAME, "input")標(biāo)簽唯一(如頁面唯一的input框)
Link文本定位driver.find_element(By.LINK_TEXT, "新聞")精準(zhǔn)匹配超鏈接文本
部分Link文本driver.find_element(By.PARTIAL_LINK_TEXT, "新")模糊匹配超鏈接文本
XPath定位driver.find_element(By.XPATH, '//*[@id="kw"]')無唯一屬性時,萬能定位方式
CSS選擇器driver.find_element(By.CSS_SELECTOR, "#kw")定位效率高于XPath,推薦使用

2. 實戰(zhàn):XPath/CSS選擇器高級用法

(1)XPath定位(萬能且靈活)

# 絕對路徑(不推薦,頁面結(jié)構(gòu)變化易失效)
driver.find_element(By.XPATH, "/html/body/div[1]/div[2]/input")
# 相對路徑+屬性(推薦)
driver.find_element(By.XPATH, '//input[@id="kw"]')
# 包含文本的元素
driver.find_element(By.XPATH, '//a[contains(text(), "百度首頁")]')
# 父節(jié)點定位子節(jié)點
driver.find_element(By.XPATH, '//div[@class="s_form"]/input')

(2)CSS選擇器(效率更高)

# ID選擇器
driver.find_element(By.CSS_SELECTOR, "#kw")
# Class選擇器
driver.find_element(By.CSS_SELECTOR, ".s_ipt")
# 屬性選擇器
driver.find_element(By.CSS_SELECTOR, 'input[name="wd"]')
# 層級選擇器
driver.find_element(By.CSS_SELECTOR, "div.s_form > input")

3. 批量定位元素

使用find_elements()(復(fù)數(shù)形式)獲取多個元素,返回列表:

# 獲取頁面所有超鏈接
links = driver.find_elements(By.TAG_NAME, "a")
for link in links:
    print(link.get_attribute("href"))  # 打印鏈接地址

四、模擬用戶操作:輸入、點擊、滾動等

1. 輸入與清空

# 定位搜索框并輸入內(nèi)容
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("Selenium教程")  # 輸入文本
search_box.clear()  # 清空輸入框
search_box.send_keys("Python爬蟲")  # 重新輸入

2. 點擊操作

# 點擊搜索按鈕
search_btn = driver.find_element(By.ID, "su")
search_btn.click()

# 模擬回車鍵(替代點擊按鈕)
search_box.send_keys(Keys.ENTER)

3. 滾動頁面

from selenium.webdriver.common.keys import Keys

# 方式1:模擬鍵盤向下滾動(PageDown)
driver.find_element(By.TAG_NAME, "body").send_keys(Keys.PAGE_DOWN)

# 方式2:JS腳本滾動(精準(zhǔn)控制)
# 滾動到頁面底部
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
# 滾動到指定元素位置
target = driver.find_element(By.ID, "target_id")
driver.execute_script("arguments[0].scrollIntoView();", target)

4. 處理彈窗

(1)alert彈窗(系統(tǒng)彈窗)

# 等待彈窗出現(xiàn)
alert = WebDriverWait(driver, 10).until(EC.alert_is_present())
# 獲取彈窗文本
print(alert.text)
# 確認(rèn)彈窗
alert.accept()
# 取消彈窗(僅confirm彈窗可用)
# alert.dismiss()

(2)iframe框架(嵌套頁面)

需先切換到iframe,才能定位內(nèi)部元素:

# 方式1:通過ID切換
driver.switch_to.frame("iframe_id")
# 方式2:通過元素定位切換
iframe = driver.find_element(By.XPATH, '//iframe[@name="iframe_name"]')
driver.switch_to.frame(iframe)

# 操作iframe內(nèi)元素
driver.find_element(By.ID, "inner_btn").click()

# 切回主頁面
driver.switch_to.default_content()

5. 處理下拉框

from selenium.webdriver.support.ui import Select

# 定位下拉框
select = Select(driver.find_element(By.ID, "select_id"))
# 方式1:按索引選擇(從0開始)
select.select_by_index(1)
# 方式2:按值選擇(option的value屬性)
select.select_by_value("option_value")
# 方式3:按文本選擇
select.select_by_visible_text("選項文本")

# 獲取所有選項
options = select.options
for option in options:
    print(option.text)

五、進(jìn)階技巧:反爬規(guī)避與效率優(yōu)化

1. 配置無界面模式(后臺運行)

from selenium.webdriver.chrome.options import Options

# 創(chuàng)建Chrome配置對象
chrome_options = Options()
# 開啟無界面模式
chrome_options.add_argument("--headless=new")
# 禁用GPU(避免無界面模式報錯)
chrome_options.add_argument("--disable-gpu")

# 初始化瀏覽器(帶配置)
driver = webdriver.Chrome(
    service=Service(driver_path),
    options=chrome_options
)

2. 規(guī)避瀏覽器指紋檢測

# 禁用自動化提示(去除“Chrome正受到自動測試軟件控制”)
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
# 禁用Blink運行時功能
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
# 設(shè)置用戶代理(UA)
chrome_options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
# 移除webdriver屬性(關(guān)鍵反爬)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

3. 多標(biāo)簽頁/窗口操作

# 打開新標(biāo)簽頁
driver.execute_script("window.open('https://www.taobao.com')")
# 獲取所有標(biāo)簽頁句柄
windows = driver.window_handles
# 切換到第二個標(biāo)簽頁
driver.switch_to.window(windows[1])
# 關(guān)閉當(dāng)前標(biāo)簽頁
driver.close()
# 切回第一個標(biāo)簽頁
driver.switch_to.window(windows[0])

4. 截圖與日志

# 頁面全屏截圖
driver.save_screenshot("page.png")
# 元素截圖
element = driver.find_element(By.ID, "kw")
element.screenshot("element.png")

# 查看瀏覽器日志(排查錯誤)
logs = driver.get_log("browser")
for log in logs:
    print(log)

六、實戰(zhàn)案例:爬取JS動態(tài)加載的商品數(shù)據(jù)

以某電商平臺商品列表為例(JS動態(tài)加載),爬取商品名稱、價格、銷量:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

# 配置驅(qū)動路徑
driver_path = "C:/chromedriver.exe"
# 初始化瀏覽器
driver = webdriver.Chrome(service=Service(driver_path))
driver.maximize_window()
driver.implicitly_wait(10)

try:
    # 打開商品列表頁
    driver.get("https://xxx.com/goods-list")
    
    # 滾動頁面加載更多商品(模擬翻頁)
    for i in range(3):  # 滾動3次
        # 滾動到頁面底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
        time.sleep(2)  # 等待數(shù)據(jù)加載
    
    # 定位所有商品元素
    goods_list = WebDriverWait(driver, 10).until(
        EC.presence_of_all_elements_located((By.CLASS_NAME, "goods-item"))
    )
    
    # 解析商品信息
    for goods in goods_list:
        # 商品名稱
        name = goods.find_element(By.CLASS_NAME, "goods-name").text
        # 商品價格
        price = goods.find_element(By.CLASS_NAME, "goods-price").text
        # 商品銷量
        sales = goods.find_element(By.CLASS_NAME, "goods-sales").text
        
        print(f"名稱:{name},價格:{price},銷量:{sales}")

finally:
    # 關(guān)閉瀏覽器
    driver.quit()

七、常見問題與避坑指南

  1. 驅(qū)動版本不匹配:報錯“SessionNotCreatedException”,需下載與瀏覽器版本完全一致的驅(qū)動;
  2. 元素定位失敗
    • 檢查元素是否在iframe內(nèi)(需先切換iframe);
    • 檢查元素是否動態(tài)加載(用顯式等待替代強制等待);
    • 避免使用絕對XPath(頁面結(jié)構(gòu)變化易失效);
  3. 反爬檢測:被網(wǎng)站識別為爬蟲時,添加UA、禁用自動化提示、隨機滾動/點擊間隔;
  4. 內(nèi)存泄漏:務(wù)必用driver.quit()關(guān)閉瀏覽器(而非driver.close()),避免進(jìn)程殘留;
  5. 中文亂碼:爬取的文本亂碼時,添加編碼設(shè)置:driver.execute_script("document.charset='utf-8'")。

到此這篇關(guān)于從入門到精通解析Python Selenium如何模擬瀏覽器操作的文章就介紹到這了,更多相關(guān)Python Selenium模擬瀏覽器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python爬取騰訊疫情實時數(shù)據(jù)并存儲到mysql數(shù)據(jù)庫的示例代碼

    Python爬取騰訊疫情實時數(shù)據(jù)并存儲到mysql數(shù)據(jù)庫的示例代碼

    這篇文章主要介紹了Python爬取騰訊疫情實時數(shù)據(jù)并存儲到mysql數(shù)據(jù)庫的示例代碼,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • python3實現(xiàn)繪制二維點圖

    python3實現(xiàn)繪制二維點圖

    今天小編就為大家分享一篇python3實現(xiàn)繪制二維點圖,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python爬蟲框架Scrapy簡介

    Python爬蟲框架Scrapy簡介

    這篇文章介紹了Python爬蟲框架Scrapy,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Python常見數(shù)據(jù)類型轉(zhuǎn)換操作示例

    Python常見數(shù)據(jù)類型轉(zhuǎn)換操作示例

    這篇文章主要介紹了Python常見數(shù)據(jù)類型轉(zhuǎn)換操作,結(jié)合實例形式分析了Python針對列表、集合、元組、字典等數(shù)據(jù)類型轉(zhuǎn)換的相關(guān)操作技巧,需要的朋友可以參考下
    2019-05-05
  • 深入了解Python 中的TensorFlow

    深入了解Python 中的TensorFlow

    TensorFlow是一個功能強大、生態(tài)完善的深度學(xué)習(xí)框架,尤其適合需要高性能計算、模型部署和生產(chǎn)級應(yīng)用的場景,本文介紹Python中的 TensorFlow,感興趣的朋友跟隨小編一起看看吧
    2026-02-02
  • Python實現(xiàn)12306自動搶火車票功能

    Python實現(xiàn)12306自動搶火車票功能

    一到國慶、春節(jié)這種長假,搶火車票就非常困難?各大互聯(lián)網(wǎng)公司都推出搶票服務(wù),只要加錢給服務(wù)費就可以增加搶到票的幾率。本文將和你一起探索搶票軟件背后的原理。
    2021-12-12
  • Python實現(xiàn)RSA加密解密

    Python實現(xiàn)RSA加密解密

    這篇文章主要介紹了Python實現(xiàn)RSA加密解密,加密技術(shù)在數(shù)據(jù)安全存儲,數(shù)據(jù)傳輸中發(fā)揮著重要作用,能夠保護(hù)用戶隱私數(shù)據(jù)安全,防止信息竊取。RSA是一種非對稱加密技術(shù),在軟件、網(wǎng)頁中已得到廣泛應(yīng)用,下面文章更多相關(guān)內(nèi)容需要的小伙伴可以參考一下
    2022-04-04
  • 用Python實現(xiàn)大文本文件切割的方法

    用Python實現(xiàn)大文本文件切割的方法

    今天小編就為大家分享一篇用Python實現(xiàn)大文本文件切割的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • Python文件讀寫6大實用方法小結(jié)

    Python文件讀寫6大實用方法小結(jié)

    Python文件讀寫的6大實用方法涵蓋了從基本讀取到高級操作的不同場景,本文給大家介紹了是這些方法的具體使用,并通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2025-01-01
  • python encode和decode的妙用

    python encode和decode的妙用

    做網(wǎng)絡(luò)編程的時候,經(jīng)常需要把接收到的數(shù)據(jù)用16進(jìn)制的方式打印出來,方便查看。今天發(fā)現(xiàn)在Python下有這樣一個簡單的方法。
    2009-09-09

最新評論

荆门市| 宁强县| 宁都县| 个旧市| 绥德县| 昌吉市| 新宾| 温州市| 庆阳市| 丹江口市| 丹凤县| 黔西| 旬邑县| 安龙县| 乐山市| 原阳县| 通许县| 安福县| 长治县| 青龙| 金平| 谷城县| 长宁区| 八宿县| 屏南县| 平山县| 华坪县| 高邮市| 乐亭县| 忻城县| 安徽省| 镇江市| 闽清县| 永清县| 马尔康县| 江山市| 玉田县| 新乡县| 三亚市| 同仁县| 洪雅县|