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

測試場景
用 Selenium 打開 10 個網(wǎng)頁并獲取頁面標題,對比兩種模式的耗時:
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
?
# 測試有頭模式
headful_time = test_performance("headful", "https://www.example.com", 10)
?
# 測試無頭模式
headless_time = test_performance("headless", "https://www.example.com", 10)
?
print(f"有頭模式耗時: {headful_time:.2f}秒")
print(f"無頭模式耗時: {headless_time:.2f}秒")
print(f"無頭模式快了: {(headful_time - headless_time) / headful_time * 100:.1f}%")
典型測試結果
根據(jù)多次測試,無頭模式通常比有頭模式快 30%-50%。差異的主要原因:
- 有頭模式需要渲染所有 DOM 元素和 CSS 樣式
- 無頭模式跳過了視覺渲染,直接執(zhí)行邏輯
七、進階技巧:讓你的瀏覽器操作更專業(yè)
1. 無頭模式下的調(diào)試技巧
問題:無頭模式下看不到操作過程,怎么調(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")
# 關鍵步驟截圖
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. 防檢測技巧
問題:有些網(wǎng)站會檢測無頭瀏覽器并封禁
解決方案:偽裝成正常瀏覽器
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
八、常見陷阱與避坑指南
陷阱 1:無頭模式下的元素定位問題
現(xiàn)象:代碼在本地有頭模式運行正常,部署到服務器無頭模式就報錯
原因:窗口尺寸不同導致元素位置變化
解決方法:
chrome_options.add_argument("--window-size=1920,1080") # 統(tǒng)一窗口尺寸
陷阱 2:動態(tài)加載內(nèi)容無法獲取
現(xiàn)象:無頭模式下某些動態(tài)加載的內(nèi)容獲取不到
原因:無頭模式執(zhí)行速度太快,內(nè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)象:長時間運行后瀏覽器占用內(nèi)存飆升
原因:沒有正確關閉瀏覽器實例
解決方法:
# 始終使用try-finally確保瀏覽器被關閉
driver = webdriver.Chrome()
try:
# 你的代碼
pass
finally:
driver.quit() # 確保一定會關閉
九、總結:選對模式,事半功倍
有頭模式和無頭模式各有優(yōu)劣,關鍵在于選擇合適的場景:
- 學習和調(diào)試 → 有頭模式(看得見,心里有數(shù))
- 自動化測試 → 無頭模式(快速、穩(wěn)定)
- 數(shù)據(jù)采集 → 無頭模式(高效、省資源)
- 產(chǎn)品演示 → 有頭模式(有視覺沖擊力)
記住:沒有最好的模式,只有最適合的模式。根據(jù)你的實際需求靈活選擇,才能發(fā)揮瀏覽器的最大威力!
到此這篇關于Python中瀏覽器有頭和無頭操作的實戰(zhàn)指南的文章就介紹到這了,更多相關Python瀏覽器操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Django的restframework接口框架自定義返回數(shù)據(jù)格式的示例詳解
這篇文章主要介紹了Django的restframework接口框架自定義返回數(shù)據(jù)格式,本文介紹了通過Django的restframework接口框架自定義Response返回對象來自定義返回數(shù)據(jù)格式,本文通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下2022-07-07
python數(shù)組中的?k-diff?數(shù)對例題解析
這篇文章主要介紹了python數(shù)組中的?k-diff?數(shù)對例題解析,文章根據(jù)題目內(nèi)容對其進行分析以此展開主題內(nèi)容,感興趣的小伙伴可以參考一下下面文章詳情2022-06-06
Python輕量級定時任務調(diào)度APScheduler的使用
Apscheduler是一個基于Quartz的python定時任務框架,本文主要介紹了Python輕量級定時任務調(diào)度APScheduler的使用,具有一定的參考價值,感興趣的可以了解一下2024-02-02
django框架模板中定義變量(set variable in django template)的方法分析
這篇文章主要介紹了django框架模板中定義變量(set variable in django template)的方法,結合實例形式分析了Django框架實現(xiàn)模板中定義變量與變量賦值相關操作技巧,需要的朋友可以參考下2019-06-06

