python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python浏览器操作

Python中浏览器有头和无头操作的实战指南

作者:Java后端的Ai之路

有头模式就是我们在日常使用浏览器时最常见的形式,无头模式是指浏览器在没有图形用户界面(GUI)的环境下运行,下面小编就和大家详细介绍一下二者的区别并给出Python示例代码,感兴趣的小伙伴可以了解下

前言:在这个自动化横行的时代,浏览器也学会了"分身术"

啥是有头模式?——看得见摸得着的浏览器

专业解释

有头模式,就是我们在日常使用浏览器时最常见的形式。浏览器会以可视化的窗口形式呈现在屏幕上,用户可以通过鼠标点击、键盘输入等方式与页面进行交互。在这种模式下,浏览器会渲染所有的视觉元素,包括文字、图片、动画等。

大白话解读

说白了,有头模式就是你平时用 Chrome、Firefox、Edge 的那种方式。浏览器像个人一样老老实实坐在那里,你想点哪里就点哪里,想看什么就看什么,一切操作都在你的眼皮底下进行,就像是坐在电影院看电影一样直观。

生活案例

想象一下,你在奶茶店点单:

有头模式就像是你在柜台前点单,你能看到店员的动作,能盯着菜单慢慢选,甚至能看到奶茶制作的整个过程(如果店子是透明厨房的话)。整个过程 真实可见,心里踏实

Python 代码示例

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
​
# 创建有头浏览器实例
driver = webdriver.Chrome()
​
try:
    # 打开网页
    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()

三、啥是无头模式?——隐形的高手

专业解释

无头模式(Headless Mode)是指浏览器在没有图形用户界面(GUI)的环境下运行。在这种模式下,浏览器不会渲染任何视觉元素,所有操作都在后台静默执行,但仍然能够执行 JavaScript、加载页面、处理 DOM 等核心功能。

大白话解读

无头模式就像是浏览器学会了"隐身术"。它照样能干所有活儿,只是你看不见它的操作过程。它在后台默默帮你把事儿办了,就像有个隐形人在帮你干活一样。速度快、省资源、不占屏幕

生活案例

继续用奶茶店的例子:

无头模式就像是你在 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")
​
# 创建无头浏览器实例
driver = webdriver.Chrome(options=chrome_options)
​
try:
    # 打开网页(你看不见浏览器窗口)
    driver.get("https://www.example.com")
    
    # 截图验证(这是你能看到结果的唯一方式)
    driver.save_screenshot("screenshot.png")
    
    # 查找元素并操作
    page_title = driver.title
    print(f"页面标题: {page_title}")
    
finally:
    # 关闭浏览器
    driver.quit()

四、有头模式 vs 无头模式:巅峰对决

对比维度有头模式无头模式
可见性✅ 操作过程可见❌ 后台静默执行
资源占用❌ 占用内存和显卡✅ 资源消耗少
运行速度⏳ 较慢(需要渲染)⚡ 较快(跳过渲染)
调试体验✅ 直观看到问题❌ 需要截图或日志
适用场景开发调试、演示自动化测试、爬虫

五、使用场景:什么时候该选谁

有头模式的最佳时机

无头模式的最佳时机

Python 代码示例:根据环境自动切换

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):
    """根据需求创建有头或无头浏览器"""
    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
​
# 开发时用有头模式
driver = get_driver(headless=False)
​
# 生产环境用无头模式
# driver = get_driver(headless=True)
​
try:
    driver.get("https://www.example.com")
    print("页面加载成功!")
    
finally:
    driver.quit()

六、性能对比:用数据说话

测试场景

用 Selenium 打开 10 个网页并获取页面标题,对比两种模式的耗时:

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}%")

典型测试结果

根据多次测试,无头模式通常比有头模式快 30%-50%。差异的主要原因:

七、进阶技巧:让你的浏览器操作更专业

1. 无头模式下的调试技巧

问题:无头模式下看不到操作过程,怎么调试?

解决方案定期截图

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")
    
    # 执行操作
    search_box = driver.find_element(By.NAME, "q")
    search_box.send_keys("调试截图")
    search_box.submit()
    
    # 操作后截图
    driver.save_screenshot("step2_search_result.png")
    
finally:
    driver.quit()

2. 防检测技巧

问题:有些网站会检测无头浏览器并封禁

解决方案伪装成正常浏览器

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
​
def setup_stealth_driver():
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    
    # 添加伪装参数
    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:无头模式下的元素定位问题

现象:代码在本地有头模式运行正常,部署到服务器无头模式就报错

原因窗口尺寸不同导致元素位置变化

解决方法

chrome_options.add_argument("--window-size=1920,1080")  # 统一窗口尺寸

陷阱 2:动态加载内容无法获取

现象:无头模式下某些动态加载的内容获取不到

原因无头模式执行速度太快,内容还没加载完

解决方法

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
​
# 等待元素出现
wait = WebDriverWait(driver, 10)
element = wait.until(
    EC.presence_of_element_located((By.ID, "dynamic-content"))
)

陷阱 3:内存泄漏

现象:长时间运行后浏览器占用内存飙升

原因没有正确关闭浏览器实例

解决方法

# 始终使用try-finally确保浏览器被关闭
driver = webdriver.Chrome()
try:
    # 你的代码
    pass
finally:
    driver.quit()  # 确保一定会关闭

九、总结:选对模式,事半功倍

有头模式和无头模式各有优劣,关键在于选择合适的场景

记住:没有最好的模式,只有最适合的模式。根据你的实际需求灵活选择,才能发挥浏览器的最大威力!

到此这篇关于Python中浏览器有头和无头操作的实战指南的文章就介绍到这了,更多相关Python浏览器操作内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文