服务端2月19日 14:05
Puppeteer 无头模式和有头模式有什么区别?Puppeteer 的无头模式(Headless)和有头模式(Headful)是两种浏览器运行方式,核心差异在于是否渲染图形界面,这直接决定了它们的性能表现、调试能力和适用场景。
## 核心区别
无头模式下浏览器不创建可视化窗口,所有页面渲染和脚本执行在内存中完成;有头模式则启动完整的 Chrome GUI 窗口,每一步操作都可以肉眼观察。
这个看似简单的差异会引发一系列连锁影响:
- **资源消耗**:无头模式省去了 GUI 渲染的开销,内存占用通常低 30%-50%,启动速度快 20% 左右
- **User Agent 差异**:旧版无头模式的 UA 包含 `Headles...前端2月19日 14:09
Puppeteer 如何实现设备模拟和移动端测试?## 核心概念
Puppeteer 的设备模拟通过 `page.emulate()` 方法实现,它一次性设置视口(viewport)、用户代理(User-Agent)、设备像素比、触摸支持等属性,让无头浏览器完整模拟目标设备的浏览器环境。
从 Puppeteer v21 开始,设备预设从 `puppeteer.devices` 迁移到了 `KnownDevices`,这是面试中容易踩的坑。
## 内置设备与 KnownDevices
### 使用内置设备预设
```javascript
const puppeteer = require('puppeteer');
const ...前端2月19日 14:13
Puppeteer 如何管理 Cookie 与存储实现会话持久化?## 核心回答
Puppeteer 通过 `page.cookies()` / `page.setCookie()` 管理 Cookie,通过 `page.evaluate()` 操作 LocalStorage、SessionStorage 和 IndexedDB,结合 `userDataDir` 或手动序列化实现会话持久化,利用 `browser.createIncognitoBrowserContext()` 实现多账户隔离。
三种会话持久化方案的对比:
| 方案 | 适用场景 | 优点 | 缺点 |
|------|---------|------|------|
| use...前端2月19日 14:10
Puppeteer 如何实现页面交互和表单操作?Puppeteer 是 Google 维护的 Node.js 浏览器自动化库,通过 DevTools 协议控制 Chrome/Chromium,核心能力就是模拟用户在页面上的真实操作——导航、点击、输入、拖拽、截图等。前端面试中,Puppeteer 的页面交互与表单操作是高频考点,本文将系统梳理常用 API 和实际场景中的最佳实践。
## 页面导航与基础操作
Puppeteer 的一切操作都围绕 `page` 对象展开。最基础的交互就是导航:
```javascript
const browser = await puppeteer.launch();
const page = a...前端2月19日 14:14
Puppeteer 如何进行错误处理和调试?Puppeteer 在浏览器自动化场景下,错误类型多、调试链路长,从脚本层到浏览器层再到网络层都可能出问题。掌握系统的错误处理策略和调试手段,是写出可靠自动化脚本的关键。
## Puppeteer 常见的错误类型有哪些?
Puppeteer 脚本运行时主要会遇到三类错误:
**脚本层错误**——语法错误、逻辑错误,这类错误 Node.js 会直接抛出栈信息,属于常规调试范畴。
**协议层错误**——Puppeteer 通过 CDP(Chrome DevTools Protocol)与浏览器通信,协议调用失败时会抛出特定错误类:
```javascript
const { Tim...前端2月19日 14:15
Puppeteer 如何使用 Chrome DevTools Protocol (CDP) 进行高级调试和性能分析?Puppeteer 通过 `page.target().createCDPSession()` 创建 CDP 会话,直接与 Chrome DevTools Protocol 通信,访问 Performance、Network、Runtime、DOM、HeapProfiler 等底层域,实现性能指标采集、网络请求拦截、运行时异常捕获、内存堆快照等高级调试能力。
## CDP 会话的创建与基本用法
CDP 会话是所有操作的起点。每个 CDP 命令和事件监听都依赖这个会话对象:
```javascript
const client = await page.target().create...前端2月19日 14:16
Puppeteer 如何处理动态网页和单页应用(SPA)?Puppeteer 在处理动态网页和单页应用(SPA)时拥有天然优势——它运行完整的 Chromium 浏览器,能够执行 JavaScript、等待异步加载完成、捕获路由变化,这些都是传统 HTTP 爬虫无法做到的。但真正写出健壮的 SPA 爬虫,关键在于选择正确的等待策略、合理拦截网络请求、以及处理各种边界情况。
## 等待动态内容加载的正确方式
SPA 的核心特征是页面内容由 JavaScript 动态渲染,因此"等待"是 Puppeteer 爬虫的第一要务。三种等待策略各有适用场景:
**waitForSelector — 等待元素出现**
最常用的等待方式,适合目标元素有...服务端2月19日 19:30
优化 Ollama 性能需要调整哪些参数?## 优化 Ollama 性能该从哪些方面入手?
Ollama 的性能瓶颈通常出现在三个环节:模型加载、推理计算和内存调度。优化思路可以归纳为——选对量化、调好参数、用满硬件。下面逐项展开。
## 模型量化怎么选?
量化是影响推理速度和显存占用最直接的参数。Ollama 支持多种量化级别,核心区别在于精度和速度的权衡:
| 量化格式 | 模型体积 | 推理速度 | 精度损失 | 适用场景 |
|---------|---------|---------|---------|---------|
| Q4_K_M | 最小 | 最快 | 较明显 | 显存紧张、追求速度 |
| Q5...前端2月19日 14:06
Puppeteer 中有哪些等待机制?如何正确使用它们来处理异步操作?## 核心答案
Puppeteer 提供了 8 种等待机制,按场景分为四类:
- **导航等待**:`waitForNavigation()` — 等待页面跳转完成
- **元素等待**:`waitForSelector()`、`waitForXPath()` — 等待 DOM 元素出现
- **网络等待**:`waitForResponse()`、`waitForRequest()` — 等待网络请求或响应
- **自定义等待**:`waitForFunction()`、`waitForFrame()`、`waitForTimeout()`(已废弃)
选择原则:导航操作用 `wa...前端2月19日 14:08
Puppeteer 和 Selenium 有什么区别?## 核心结论
Puppeteer 和 Selenium 的根本区别在于通信协议:Puppeteer 基于 Chrome DevTools Protocol (CDP) 直接与浏览器内核通信,而 Selenium 基于 WebDriver 协议通过中间驱动层间接控制浏览器。这决定了两者在性能、能力和适用场景上的所有差异。
**简单选择标准:** 只需要操作 Chrome 且追求性能 → Puppeteer;需要跨浏览器或企业级测试 → Selenium。
## 通信协议的本质差异
这是理解两者所有区别的钥匙。
**CDP(Puppeteer):** 通过 WebSocket 直...