Python中瀏覽器有頭和無(wú)頭操作的實(shí)戰(zhàn)指南
前言:在這個(gè)自動(dòng)化橫行的時(shí)代,瀏覽器也學(xué)會(huì)了"分身術(shù)"
啥是有頭模式?——看得見(jiàn)摸得著的瀏覽器
專業(yè)解釋
有頭模式,就是我們?cè)谌粘J褂脼g覽器時(shí)最常見(jiàn)的形式。瀏覽器會(huì)以可視化的窗口形式呈現(xiàn)在屏幕上,用戶可以通過(guò)鼠標(biāo)點(diǎn)擊、鍵盤(pán)輸入等方式與頁(yè)面進(jìn)行交互。在這種模式下,瀏覽器會(huì)渲染所有的視覺(jué)元素,包括文字、圖片、動(dòng)畫(huà)等。
大白話解讀
說(shuō)白了,有頭模式就是你平時(shí)用 Chrome、Firefox、Edge 的那種方式。瀏覽器像個(gè)人一樣老老實(shí)實(shí)坐在那里,你想點(diǎn)哪里就點(diǎn)哪里,想看什么就看什么,一切操作都在你的眼皮底下進(jìn)行,就像是坐在電影院看電影一樣直觀。
生活案例
想象一下,你在奶茶店點(diǎn)單:
有頭模式就像是你在柜臺(tái)前點(diǎn)單,你能看到店員的動(dòng)作,能盯著菜單慢慢選,甚至能看到奶茶制作的整個(gè)過(guò)程(如果店子是透明廚房的話)。整個(gè)過(guò)程 真實(shí)可見(jiàn),心里踏實(shí)。
Python 代碼示例
from selenium import webdriver
from selenium.webdriver.common.by import By
import time
?
# 創(chuàng)建有頭瀏覽器實(shí)例
driver = webdriver.Chrome()
?
try:
# 打開(kāi)網(wǎng)頁(yè)
driver.get("https://www.example.com")
# 查找元素并點(diǎn)擊
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("有頭瀏覽器")
search_box.submit()
# 暫停觀察效果
time.sleep(3)
finally:
# 關(guān)閉瀏覽器
driver.quit()
三、啥是無(wú)頭模式?——隱形的高手
專業(yè)解釋
無(wú)頭模式(Headless Mode)是指瀏覽器在沒(méi)有圖形用戶界面(GUI)的環(huán)境下運(yùn)行。在這種模式下,瀏覽器不會(huì)渲染任何視覺(jué)元素,所有操作都在后臺(tái)靜默執(zhí)行,但仍然能夠執(zhí)行 JavaScript、加載頁(yè)面、處理 DOM 等核心功能。
大白話解讀
無(wú)頭模式就像是瀏覽器學(xué)會(huì)了"隱身術(shù)"。它照樣能干所有活兒,只是你看不見(jiàn)它的操作過(guò)程。它在后臺(tái)默默幫你把事兒辦了,就像有個(gè)隱形人在幫你干活一樣。速度快、省資源、不占屏幕。
生活案例
繼續(xù)用奶茶店的例子:
無(wú)頭模式就像是你在 APP 上提前點(diǎn)好單,到店直接拿走。你不需要在柜臺(tái)前等待,不需要看店員制作,也不需要占用你的時(shí)間和注意力。整個(gè)過(guò)程對(duì)你是"隱形"的,但結(jié)果是一樣的——你拿到了奶茶。
Python 代碼示例
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import time
?
# 配置無(wú)頭模式
chrome_options = Options()
chrome_options.add_argument("--headless") # 啟用無(wú)頭模式
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920,1080")
?
# 創(chuàng)建無(wú)頭瀏覽器實(shí)例
driver = webdriver.Chrome(options=chrome_options)
?
try:
# 打開(kāi)網(wǎng)頁(yè)(你看不見(jiàn)瀏覽器窗口)
driver.get("https://www.example.com")
# 截圖驗(yàn)證(這是你能看到結(jié)果的唯一方式)
driver.save_screenshot("screenshot.png")
# 查找元素并操作
page_title = driver.title
print(f"頁(yè)面標(biāo)題: {page_title}")
finally:
# 關(guān)閉瀏覽器
driver.quit()
四、有頭模式 vs 無(wú)頭模式:巔峰對(duì)決
| 對(duì)比維度 | 有頭模式 | 無(wú)頭模式 |
|---|---|---|
| 可見(jiàn)性 | ? 操作過(guò)程可見(jiàn) | ? 后臺(tái)靜默執(zhí)行 |
| 資源占用 | ? 占用內(nèi)存和顯卡 | ? 資源消耗少 |
| 運(yùn)行速度 | ? 較慢(需要渲染) | ? 較快(跳過(guò)渲染) |
| 調(diào)試體驗(yàn) | ? 直觀看到問(wèn)題 | ? 需要截圖或日志 |
| 適用場(chǎng)景 | 開(kāi)發(fā)調(diào)試、演示 | 自動(dòng)化測(cè)試、爬蟲(chóng) |
五、使用場(chǎng)景:什么時(shí)候該選誰(shuí)
有頭模式的最佳時(shí)機(jī)
- 開(kāi)發(fā)調(diào)試階段:當(dāng)你需要親眼看到每一步操作的結(jié)果,排查問(wèn)題的時(shí)候
- 演示展示:給老板或客戶展示自動(dòng)化效果的時(shí)候(要有視覺(jué)沖擊力)
- 需要人工干預(yù):有些網(wǎng)站會(huì)檢測(cè)是否有真實(shí)用戶操作,有頭模式更容易通過(guò)
無(wú)頭模式的最佳時(shí)機(jī)
- 自動(dòng)化測(cè)試:CI/CD 流程中需要快速執(zhí)行測(cè)試用例
- 大規(guī)模爬蟲(chóng):需要同時(shí)運(yùn)行多個(gè)瀏覽器實(shí)例
- 服務(wù)器環(huán)境:在沒(méi)有圖形界面的 Linux 服務(wù)器上運(yùn)行
Python 代碼示例:根據(jù)環(huán)境自動(dòng)切換
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
import os
?
def get_driver(headless=False):
"""根據(jù)需求創(chuàng)建有頭或無(wú)頭瀏覽器"""
chrome_options = Options()
if headless:
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=chrome_options)
return driver
?
# 開(kāi)發(fā)時(shí)用有頭模式
driver = get_driver(headless=False)
?
# 生產(chǎn)環(huán)境用無(wú)頭模式
# driver = get_driver(headless=True)
?
try:
driver.get("https://www.example.com")
print("頁(yè)面加載成功!")
finally:
driver.quit()
六、性能對(duì)比:用數(shù)據(jù)說(shuō)話

測(cè)試場(chǎng)景
用 Selenium 打開(kāi) 10 個(gè)網(wǎng)頁(yè)并獲取頁(yè)面標(biāo)題,對(duì)比兩種模式的耗時(shí):
import time
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
?
def test_performance(mode, url, iterations=10):
chrome_options = Options()
if mode == "headless":
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
driver = webdriver.Chrome(options=chrome_options)
start_time = time.time()
for i in range(iterations):
driver.get(url)
title = driver.title
end_time = time.time()
driver.quit()
return end_time - start_time
?
# 測(cè)試有頭模式
headful_time = test_performance("headful", "https://www.example.com", 10)
?
# 測(cè)試無(wú)頭模式
headless_time = test_performance("headless", "https://www.example.com", 10)
?
print(f"有頭模式耗時(shí): {headful_time:.2f}秒")
print(f"無(wú)頭模式耗時(shí): {headless_time:.2f}秒")
print(f"無(wú)頭模式快了: {(headful_time - headless_time) / headful_time * 100:.1f}%")
典型測(cè)試結(jié)果
根據(jù)多次測(cè)試,無(wú)頭模式通常比有頭模式快 30%-50%。差異的主要原因:
- 有頭模式需要渲染所有 DOM 元素和 CSS 樣式
- 無(wú)頭模式跳過(guò)了視覺(jué)渲染,直接執(zhí)行邏輯
七、進(jìn)階技巧:讓你的瀏覽器操作更專業(yè)
1. 無(wú)頭模式下的調(diào)試技巧
問(wèn)題:無(wú)頭模式下看不到操作過(guò)程,怎么調(diào)試?
解決方案:定期截圖!
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
?
def setup_driver():
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
chrome_options.add_argument("--window-size=1920,1080")
return webdriver.Chrome(options=chrome_options)
?
driver = setup_driver()
?
try:
driver.get("https://www.example.com")
# 關(guān)鍵步驟截圖
driver.save_screenshot("step1_landing.png")
# 執(zhí)行操作
search_box = driver.find_element(By.NAME, "q")
search_box.send_keys("調(diào)試截圖")
search_box.submit()
# 操作后截圖
driver.save_screenshot("step2_search_result.png")
finally:
driver.quit()
2. 防檢測(cè)技巧
問(wèn)題:有些網(wǎng)站會(huì)檢測(cè)無(wú)頭瀏覽器并封禁
解決方案:偽裝成正常瀏覽器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
?
def setup_stealth_driver():
chrome_options = Options()
chrome_options.add_argument("--headless")
# 添加偽裝參數(shù)
chrome_options.add_argument("--disable-blink-features=AutomationControlled")
chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
chrome_options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=chrome_options)
# 修改navigator.webdriver屬性
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
"source": """
Object.defineProperty(navigator, 'webdriver', {
get: () => undefined
})
"""
})
return driver
八、常見(jiàn)陷阱與避坑指南
陷阱 1:無(wú)頭模式下的元素定位問(wèn)題
現(xiàn)象:代碼在本地有頭模式運(yùn)行正常,部署到服務(wù)器無(wú)頭模式就報(bào)錯(cuò)
原因:窗口尺寸不同導(dǎo)致元素位置變化
解決方法:
chrome_options.add_argument("--window-size=1920,1080") # 統(tǒng)一窗口尺寸
陷阱 2:動(dòng)態(tài)加載內(nèi)容無(wú)法獲取
現(xiàn)象:無(wú)頭模式下某些動(dòng)態(tài)加載的內(nèi)容獲取不到
原因:無(wú)頭模式執(zhí)行速度太快,內(nèi)容還沒(méi)加載完
解決方法:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
?
# 等待元素出現(xiàn)
wait = WebDriverWait(driver, 10)
element = wait.until(
EC.presence_of_element_located((By.ID, "dynamic-content"))
)
陷阱 3:內(nèi)存泄漏
現(xiàn)象:長(zhǎng)時(shí)間運(yùn)行后瀏覽器占用內(nèi)存飆升
原因:沒(méi)有正確關(guān)閉瀏覽器實(shí)例
解決方法:
# 始終使用try-finally確保瀏覽器被關(guān)閉
driver = webdriver.Chrome()
try:
# 你的代碼
pass
finally:
driver.quit() # 確保一定會(huì)關(guān)閉
九、總結(jié):選對(duì)模式,事半功倍
有頭模式和無(wú)頭模式各有優(yōu)劣,關(guān)鍵在于選擇合適的場(chǎng)景:
- 學(xué)習(xí)和調(diào)試 → 有頭模式(看得見(jiàn),心里有數(shù))
- 自動(dòng)化測(cè)試 → 無(wú)頭模式(快速、穩(wěn)定)
- 數(shù)據(jù)采集 → 無(wú)頭模式(高效、省資源)
- 產(chǎn)品演示 → 有頭模式(有視覺(jué)沖擊力)
記?。?strong>沒(méi)有最好的模式,只有最適合的模式。根據(jù)你的實(shí)際需求靈活選擇,才能發(fā)揮瀏覽器的最大威力!
到此這篇關(guān)于Python中瀏覽器有頭和無(wú)頭操作的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Python瀏覽器操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django的restframework接口框架自定義返回?cái)?shù)據(jù)格式的示例詳解
這篇文章主要介紹了Django的restframework接口框架自定義返回?cái)?shù)據(jù)格式,本文介紹了通過(guò)Django的restframework接口框架自定義Response返回對(duì)象來(lái)自定義返回?cái)?shù)據(jù)格式,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
利用Python制作一個(gè)簡(jiǎn)單的天氣播報(bào)系統(tǒng)
最近天氣的多變,好幾次出門半路天氣轉(zhuǎn)變。本文將利用python整個(gè)天氣爬蟲(chóng)來(lái)獲取天氣情況。這樣也好可以進(jìn)行一個(gè)提前預(yù)防,感興趣的可以動(dòng)手試一試2022-05-05
python數(shù)組中的?k-diff?數(shù)對(duì)例題解析
這篇文章主要介紹了python數(shù)組中的?k-diff?數(shù)對(duì)例題解析,文章根據(jù)題目?jī)?nèi)容對(duì)其進(jìn)行分析以此展開(kāi)主題內(nèi)容,感興趣的小伙伴可以參考一下下面文章詳情2022-06-06
Python輕量級(jí)定時(shí)任務(wù)調(diào)度APScheduler的使用
Apscheduler是一個(gè)基于Quartz的python定時(shí)任務(wù)框架,本文主要介紹了Python輕量級(jí)定時(shí)任務(wù)調(diào)度APScheduler的使用,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02
django框架模板中定義變量(set variable in django template)的方法分析
這篇文章主要介紹了django框架模板中定義變量(set variable in django template)的方法,結(jié)合實(shí)例形式分析了Django框架實(shí)現(xiàn)模板中定義變量與變量賦值相關(guān)操作技巧,需要的朋友可以參考下2019-06-06

