從入門到精通解析Python Selenium如何模擬瀏覽器操作
Selenium是一款開源的自動化測試工具,核心優(yōu)勢在于能模擬真實用戶操作瀏覽器(如點擊、輸入、滾動),并渲染動態(tài)加載的網頁內容(解決Requests庫無法爬取JS動態(tài)數據的問題)。
一、Selenium入門準備:環(huán)境搭建與核心原理
1. 核心原理
Selenium通過“瀏覽器驅動(Driver)”與瀏覽器通信:Python代碼發(fā)送操作指令→Driver解析指令→瀏覽器執(zhí)行操作并返回渲染后的頁面數據,完美適配JS動態(tài)渲染的網頁(如Ajax加載、Vue/React前端頁面)。
2. 環(huán)境安裝
(1)安裝Selenium庫
# 安裝最新版Selenium pip install selenium
關鍵步驟:
查看瀏覽器版本(如Chrome:設置→關于Chrome,查看版本號);
下載對應版本的驅動(版本號需完全匹配,如Chrome 120.x對應ChromeDriver 120.x);
配置驅動路徑:
- 方法1:將驅動文件放入Python安裝目錄(如Python39/Scripts),無需手動指定路徑;
- 方法2:手動指定驅動路徑(推薦,避免版本沖突)。
3. 驗證環(huán)境
# 導入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))
# 打開測試網頁
driver.get("https://www.baidu.com")
# 打印網頁標題(輸出“百度一下,你就知道”則環(huán)境正常)
print(driver.title)
# 關閉瀏覽器
driver.quit()
二、Selenium基礎操作:瀏覽器與頁面控制
1. 瀏覽器核心操作
| 操作 | 代碼示例 | 說明 |
|---|---|---|
| 打開網頁 | driver.get("https://www.xxx.com") | 加載目標URL |
| 刷新頁面 | driver.refresh() | 模擬瀏覽器刷新 |
| 前進/后退 | driver.forward() / driver.back() | 模擬瀏覽器前進/后退按鈕 |
| 窗口最大化 | driver.maximize_window() | 避免元素因窗口過小無法定位 |
| 設置窗口大小 | driver.set_window_size(1920, 1080) | 自定義窗口分辨率 |
| 獲取當前URL | driver.current_url | 查看當前頁面URL(驗證跳轉是否成功) |
| 獲取頁面源碼 | driver.page_source | 獲取渲染后的完整HTML源碼(含JS動態(tài)內容) |
2. 等待機制:解決元素加載延遲問題
網頁動態(tài)加載時,直接定位元素會因“元素未加載完成”報錯,Selenium提供3種等待方式:
(1)強制等待(不推薦)
import time # 強制等待3秒(無論元素是否加載完成) time.sleep(3)
(2)隱式等待(全局生效)
# 設置隱式等待:最長等待10秒,元素加載完成則立即執(zhí)行 driver.implicitly_wait(10)
(3)顯式等待(推薦,精準控制)
針對指定元素設置等待條件(如元素可點擊、可見),超時則拋出異常:
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:元素包含指定文本。
三、核心技能:元素定位(爬取/操作的關鍵)
元素定位是Selenium的核心,需根據網頁結構選擇最優(yōu)定位方式,優(yōu)先選擇唯一標識(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") | 標簽唯一(如頁面唯一的input框) |
| Link文本定位 | driver.find_element(By.LINK_TEXT, "新聞") | 精準匹配超鏈接文本 |
| 部分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定位(萬能且靈活)
# 絕對路徑(不推薦,頁面結構變化易失效) 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()(復數形式)獲取多個元素,返回列表:
# 獲取頁面所有超鏈接
links = driver.find_elements(By.TAG_NAME, "a")
for link in links:
print(link.get_attribute("href")) # 打印鏈接地址
四、模擬用戶操作:輸入、點擊、滾動等
1. 輸入與清空
# 定位搜索框并輸入內容
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腳本滾動(精準控制)
# 滾動到頁面底部
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彈窗(系統彈窗)
# 等待彈窗出現 alert = WebDriverWait(driver, 10).until(EC.alert_is_present()) # 獲取彈窗文本 print(alert.text) # 確認彈窗 alert.accept() # 取消彈窗(僅confirm彈窗可用) # alert.dismiss()
(2)iframe框架(嵌套頁面)
需先切換到iframe,才能定位內部元素:
# 方式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內元素
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)
五、進階技巧:反爬規(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")
# 設置用戶代理(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屬性(關鍵反爬)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
3. 多標簽頁/窗口操作
# 打開新標簽頁
driver.execute_script("window.open('https://www.taobao.com')")
# 獲取所有標簽頁句柄
windows = driver.window_handles
# 切換到第二個標簽頁
driver.switch_to.window(windows[1])
# 關閉當前標簽頁
driver.close()
# 切回第一個標簽頁
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)加載的商品數據
以某電商平臺商品列表為例(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
# 配置驅動路徑
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) # 等待數據加載
# 定位所有商品元素
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:
# 關閉瀏覽器
driver.quit()
七、常見問題與避坑指南
- 驅動版本不匹配:報錯“SessionNotCreatedException”,需下載與瀏覽器版本完全一致的驅動;
- 元素定位失敗:
- 檢查元素是否在iframe內(需先切換iframe);
- 檢查元素是否動態(tài)加載(用顯式等待替代強制等待);
- 避免使用絕對XPath(頁面結構變化易失效);
- 反爬檢測:被網站識別為爬蟲時,添加UA、禁用自動化提示、隨機滾動/點擊間隔;
- 內存泄漏:務必用
driver.quit()關閉瀏覽器(而非driver.close()),避免進程殘留; - 中文亂碼:爬取的文本亂碼時,添加編碼設置:
driver.execute_script("document.charset='utf-8'")。
到此這篇關于從入門到精通解析Python Selenium如何模擬瀏覽器操作的文章就介紹到這了,更多相關Python Selenium模擬瀏覽器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python?numpy庫之如何使用matpotlib庫繪圖
Numpy的主要對象是同構多維數組,它是一個元素表,所有類型都相同,由非負整數元組索引,在Numpy維度中稱為軸,這篇文章主要介紹了python?numpy庫?使用matpotlib庫繪圖,需要的朋友可以參考下2022-10-10
Python中Flask-RESTful編寫API接口(小白入門)
這篇文章主要介紹了Python中Flask-RESTful編寫API接口(小白入門),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-12-12

