01 - F12 开发者工具全景概览
文档信息
- 系列:F12 开发者工具工程化落地实战
- 适用读者:前端工程师 / 爬虫工程师 / 后端工程师 / 测试工程师 / 运维工程师
- 阅读时长:约 45 分钟
- 实践案例:CSDN 博客
https://blog.csdn.net/A1063348628- 配套文档:02-Network面板深度拆解、03-Cookie机制与Application面板、04-请求模拟与数据抓取、05-过滤器与断点调试
项目定位: 本文档是 F12 开发者工具系列的第 1 篇,以 CSDN 博客https://blog.csdn.net/A1063348628为贯穿案例,带你从零认识浏览器开发者工具的全貌。后续文档(02-Network面板深度拆解、03-Cookie机制与Application面板、04-请求模拟与数据抓取、05-过滤器与断点调试)会分别深入各个面板的进阶用法。
本文档采用"四问框架" :对每个新出现的技术概念,都会系统回答 是什么 / 为什么 / 有什么用 / 怎么用 四个维度。其中 "有什么用" 是重点,会从前端、后端、爬虫、测试、运维五个工程视角展开。学习目标: 读完本文后,你可以独立完成以下操作:
- 打开任意网站的 F12 开发者工具,准确识别六个核心面板
- 使用 Elements 面板定位页面中任意元素的 HTML 结构
- 使用 Console 面板执行 JS 命令,提取页面 Cookie、UserAgent 等关键信息
- 使用 Network 面板区分页面文档、API 请求、静态资源,并找到 API 返回的 JSON 数据
- 使用 Application 面板查看和管理 Cookie、LocalStorage
一、F12 开发者工具是什么?
1.1 概念:浏览器内置的"解剖台"
是什么: F12 开发者工具(DevTools)是 Chrome / Edge / Firefox 等主流浏览器内置的一套网页调试工具集。按下键盘上的 F12 键即可打开。它不是第三方插件,而是浏览器原生自带的"透视镜"------让你看到用户视角下不可见的网页底层运作细节。
一句话概括: 如果把网页比作一辆车,普通用户只能看到车身外观和内饰,而 F12 开发者工具让你打开引擎盖,看到引擎(HTML/CSS/JS)、油路(网络请求)、行车记录(Cookie/Storage)的全部细节。

图片:浏览器打开 F12 后的全屏截图------左侧是 CSDN 博客页面正常展示效果,右侧/底部是开发者工具面板,清晰标注出 Elements、Console、Sources、Network、Application 等 Tab 标签
1.2 六个核心面板一句话定位
| 面板 | 一句话定位 | 类比 |
|---|---|---|
| Elements | 查看和修改当前页面的 HTML/CSS | 网页的"骨架和皮肤" |
| Console | JS 命令行 + 日志输出窗口 | 网页的"终端" |
| Sources | 查看网页加载的所有源文件,设置断点 | 网页的"源码仓库" |
| Network | 监控所有网络请求的完整生命周期 | 网页的"通信记录仪" |
| Application | 查看和管理 Cookie、LocalStorage、SessionStorage | 网页的"本地储物间" |
| Performance | 录制和分析页面运行时性能 | 网页的"体检报告" |

图片:F12 开发者工具顶部 Tab 栏截图,六个核心面板标签清晰可见,用红色箭头标注每个 Tab 对应的名称
1.3 面板选择速查表(场景化决策)
不同调试任务对应不同面板,下表帮你 10 秒内做出正确选择:
| 你遇到的问题 | 推荐面板 | 推荐操作 | CSDN 实战举例 |
|---|---|---|---|
| 页面样式不对 / 想改字体颜色 | Elements | 选择元素 → Styles 修改 | 改 CSDN 文章正文字号 |
| 想执行一段 JS 代码看结果 | Console | 直接输入命令回车 | 提取 CSDN Cookie |
| 想找某个 JS 函数的源码 | Sources | 文件树 + Ctrl+Shift+F 全文搜索 | 找 CSDN 登录逻辑函数 |
| 想知道页面发了哪些请求 | Network | Fetch/XHR 过滤 | 找 CSDN 文章列表 API |
| 想看登录态 / Cookie | Application | Cookies → 域名节点 | 查 CSDN 的 UserName Token |
| 页面加载慢 / 卡顿 | Performance | 录制 → 分析火焰图 | 分析 CSDN 首屏加载耗时 |
| 移动端样式适配 | Device Toggle | 切换设备型号 | 测试 CSDN 手机版布局 |
| 想本地修改 JS 测试逻辑 | Sources → Overrides | 启用 Local Overrides | 替换 CSDN 推荐算法 JS |
1.4 场景化决策树(什么问题用什么面板)
遇到问题,按以下决策树定位面板:
【问题类型】
│
├─ 页面"长得不对"(样式/布局问题)
│ └─→ Elements 面板(选择元素 → Styles 调试)
│
├─ 页面"行为不对"(按钮无响应/JS 报错)
│ ├─→ Console 面板(看报错信息)
│ └─→ Sources 面板(设置断点单步调试)
│
├─ 页面"数据不对"(接口数据缺失/错误)
│ └─→ Network 面板(Fetch/XHR → 看 Response)
│
├─ 页面"状态不对"(登录态丢失/未登录)
│ └─→ Application 面板(Cookies / LocalStorage)
│
├─ 页面"性能不对"(加载慢/卡顿)
│ ├─→ Network 面板(看请求耗时瀑布图)
│ └─→ Performance 面板(录制火焰图找瓶颈)
│
└─ 页面"环境不对"(移动端/不同分辨率)
└─→ Device Toggle(设备模拟切换)
决策原则: 样式问题选 Elements,行为问题选 Console+Sources,数据问题选 Network,状态问题选 Application,性能问题选 Performance。记不住时回到这张决策树。
二、为什么要学 F12 开发者工具?
2.1 问题:没有 F12 时你什么也看不到
真实问题 ①: 你在浏览器里看到一个漂亮的 CSDN 博客页面,想知道背后加载了多少数据、每个请求花了多长时间、登录态存在哪里------但这些信息在页面上完全不可见。没有 F12,你就像在黑暗中摸索。
真实问题 ②: 程序员写了一个 Python 爬虫去请求 CSDN 的 API,结果返回 403 Forbidden。他不知道浏览器凭什么能正常访问,而爬虫不行------因为浏览器自动携带了 Cookie、Referer、UserAgent 等关键请求头,而这些信息只有 F12 能看到。
真实问题 ③: 前端工程师改了一个 CSS 样式,刷新页面后没有生效。她不知道是缓存问题还是选择器优先级问题------F12 的 Elements 面板直接告诉你哪个 CSS 属性被覆盖了,以及被哪条规则覆盖的。
2.2 价值:从"猜"到"看"的质变
为什么学: F12 开发者工具把你从"猜测网页如何运作"的困境中解放出来。你不再依赖直觉和试错,而是直接看到客观事实:
| 你想知道的事 | 没有 F12 的做法(猜) | 有 F12 的做法(看) |
|---|---|---|
| CSDN 博客发了多少个请求? | 猜:大概几十个吧 | Network 面板直接数:明确的总数 |
| API 返回了什么数据? | 猜:可能是 JSON 格式 | Response 标签直接看:完整 JSON |
| Cookie 里存了什么? | 猜:可能有登录信息 | Application 面板直接读:UserName=aw... |
| 某个按钮的 CSS 样式是什么? | 猜:大概是 blue 色 | Elements → Styles 直接看:color: #1890ff |
| 页面加载哪里慢了? | 猜:可能是图片太大 | Network → Timing 精确到毫秒 |
结论: F12 开发者工具是任何涉及"理解网页行为"的工作(爬虫开发、数据分析、前后端联调、逆向工程、安全测试)的 第一工具。没有它,你的工作效率至少降低 80%。
2.3 五大工程视角价值矩阵(重点:有什么用)
不同岗位的工程师从 F12 中获得的价值截然不同。下表帮助你从自身岗位快速定位学习重点:
| 工程视角 | 核心诉求 | 主要使用面板 | 典型场景(以 CSDN 为例) |
|---|---|---|---|
| 前端开发 | 调试样式、定位 Bug、性能优化 | Elements / Console / Sources / Performance | 修复 CSDN 评论框样式错位;调试文章列表渲染逻辑;分析首屏白屏原因 |
| 后端开发 | 接口联调、参数验证、响应分析 | Network / Console | 验证 CSDN 文章详情接口返回的 JSON 字段;排查 401 鉴权失败;定位跨域问题 |
| 爬虫开发 | 分析请求、提取数据、模拟登录 | Network / Application / Console | 找到 CSDN 文章列表 API;提取登录 Cookie 模拟请求;分析反爬指纹 |
| 测试工程 | 自动化测试、性能测试、兼容性测试 | Network / Performance / Device Toggle | 录制 CSDN 接口回归测试用例;压测首屏加载性能;测试不同设备布局 |
| 运维排障 | 监控告警、线上排障、CDN 优化 | Network / Application / Performance | 排查 CSDN 静态资源 404;分析 Cookie 域配置;优化缓存策略 |
岗位学习建议:
- 前端工程师:六个面板全部要熟练,重点 Elements / Sources / Performance
- 后端工程师:重点 Network / Console,其他了解即可
- 爬虫工程师:重点 Network / Application / Console,这是本系列核心读者
- 测试工程师:重点 Network / Performance / Device Toggle
- 运维工程师:重点 Network / Application,关注资源加载与缓存
三、如何打开 F12 开发者工具?
3.1 三种打开方式
| 方式 | 操作步骤 | 适用场景 |
|---|---|---|
| 快捷键(推荐) | 按 F12 或 Ctrl + Shift + I(Mac: Cmd + Opt + I) |
最常用,一秒打开 |
| 右键菜单 | 页面任意位置右键 → "检查" 或 "Inspect" | 想直接定位到某元素时使用 |
| 浏览器菜单 | Chrome 右上角 ⋮ → 更多工具 → 开发者工具 | 不熟悉快捷键时兜底 |
怎么做(实操): 打开浏览器,访问 https://blog.csdn.net/A1063348628,按 F12。你会看到浏览器底部或右侧弹出一个面板------这就是开发者工具。
3.2 面板位置的调整
默认情况下,开发者工具可能出现在窗口底部(横排)或右侧(竖排)。你可以点击右上角的 ⋮ 菜单 → 选择 Dock side 图标来切换:
| 布局 | 图标 | 优点 |
|---|---|---|
| 底部横排 | ⫟ |
高度充足,适合查看 Network 长列表 |
| 右侧竖排 | ⫠ |
宽度充足,适合调试 CSS 样式 |
| 独立窗口 | ⊞ |
双屏工作时使用,不遮挡主页面 |

图片:F12 开发者工具的 Dock side 切换按钮截图,标注出三种布局选项的图标
为什么这样设计: 不同的调试任务需要不同的空间分配。查看 Network 面板时,请求列表纵向长、横向字段少,适合底部横排;查看 Elements 面板时,DOM 树横向嵌套深,适合右侧竖排。独立窗口则留给有多显示器的专业开发者。
四、六大核心面板详解:是什么 → 为什么 → 怎么做
4.1 Elements 面板:网页的骨架与皮肤
是什么
Elements 面板展示当前页面的 DOM 树(HTML 结构)和 CSS 样式规则。左边是 HTML 层级树,右边是选中元素对应的 CSS 样式面板。
技术概念:DOM(Document Object Model)
- 是什么:DOM 是浏览器把 HTML 解析后生成的"树形对象结构"。HTML 是文本,DOM 是内存中的对象树,每个节点都是一个 JS 对象,拥有属性和方法。
- 为什么需要它 :浏览器渲染引擎和 JS 引擎都需要一个统一的结构来操作页面。没有 DOM,JS 就无法通过
document.getElementById这种 API 操作元素。 - 有什么用:前端用 DOM API 动态修改页面(增删改查节点);爬虫用 DOM 选择器提取数据(BeautifulSoup、lxml 本质上就是在解析 DOM);测试用 DOM 验证元素是否正确渲染。
- 怎么用 :在 Elements 面板中点击任意节点 → 右键 → "Store as global variable" → Console 中用
temp1引用该节点进行操作。
技术概念:CSSOM(CSS Object Model)
- 是什么:CSSOM 是浏览器把 CSS 解析后生成的样式规则树,与 DOM 配合形成渲染树(Render Tree),最终决定元素的可见外观。
- 为什么需要它:CSS 选择器有优先级(inline > id > class > tag),CSSOM 负责计算每个 DOM 节点最终生效的样式值。
- 有什么用:Elements 面板的 Styles 标签就是 CSSOM 的可视化呈现------你能看到哪条规则生效、哪条被覆盖、被谁覆盖,并支持实时修改验证。
- 怎么用:选中元素 → 右侧 Styles 面板 → 找到被划掉的属性(表示被覆盖)→ 双击修改值实时查看效果。
图片:Elements 面板截图------左侧展示 CSDN 博客页面的 DOM 树结构,右侧展示选中元素的 CSS 样式规则面板,标注出 Styles 中被覆盖属性的删除线效果
为什么需要它
真实问题 ④: 爬虫工程师想要提取 CSDN 博客的文章标题,但他不知道标题在 HTML 中对应哪个标签(是
<h1>还是<div class="title">还是别的)。如果直接看网页源代码(Ctrl+U),得到的是压缩混淆后的原始 HTML,根本没法定位。
Elements 面板解决的核心问题:把网页的 HTML 结构以一棵"可视化的树"呈现出来,让你能像在文件管理器里浏览文件夹一样浏览 DOM 结构。
怎么做(CSDN 案例实操)
步骤:
1. 打开 https://blog.csdn.net/A1063348628
2. 按 F12 → 点击 Elements 标签
3. 点击面板左上角的"选择元素"按钮(快捷键 Ctrl+Shift+C)
4. 将鼠标移动到 CSDN 页面的文章标题上
5. 点击------Elements 面板自动定位到对应的 HTML 元素
你会看到类似这样的结构(简化):
html
<h1 class="title-article" id="articleContentId">
文章标题内容
</h1>
<div class="article-info-box">
<span class="time">2024-01-15</span>
<span class="read-count">阅读 1.2k</span>
</div>
反向操作(修改样式验证): 在右侧 Styles 面板中,找到 color 属性,双击修改为 red,页面上的标题立刻变红------这是浏览器本地的临时修改,刷新后就会恢复。
如果是其他网站怎么办?
CSDN 的文章标题可能用 <h1 class="title-article">,但知乎的文章可能用 <h1 class="Post-Title">,GitHub 的 README 标题可能用 <article class="markdown-body">。核心能力不是记住特定网站的选择器,而是掌握"选择元素 → 定位 DOM → 查看 CSS 规则"这个通用流程。 任何网站的任意元素,你都能用同样的方法在 30 秒内找到它的 HTML 结构和 CSS 样式。
有什么用(重点:五视角实战)
| 工程视角 | Elements 面板能解决什么问题 | CSDN 实战案例 |
|---|---|---|
| 前端开发 | 实时调试 CSS 样式、查看元素盒模型、定位样式覆盖问题 | 调试 CSDN 评论框边距错位:选中评论框 → Computed 标签查看实际 margin/padding |
| 后端开发 | 验证后端返回的 HTML 结构是否正确渲染、确认 SSR 输出 | 检查 CSDN 服务端渲染的文章 HTML 是否包含正确的 Schema.org 微数据 |
| 爬虫开发 | 提取 CSS 选择器、分析动态渲染的 DOM 节点 | 提取 CSDN 文章列表的 div.article-item-box 选择器供 BeautifulSoup 使用 |
| 测试工程 | 验证元素是否正确渲染、检查 ARIA 无障碍属性 | 验证 CSDN 登录按钮是否带 aria-label 属性,符合无障碍标准 |
| 运维排障 | 排查静态资源加载失败导致的样式错乱 | CSDN 首页样式丢失时,检查 <link> 标签的 href 是否指向有效的 CDN 路径 |
踩坑案例(新手常见误区)
踩坑 ①:修改的样式刷新后丢失
现象:在 Elements → Styles 中修改了
color: red,刷新页面后样式恢复原样。原因:Elements 面板的修改只存在于浏览器内存,不会写回服务器。
解决:需要持久化修改时,使用 Sources → Overrides 启用本地覆盖,或将修改同步到源码。
踩坑 ②:选中元素后 Styles 面板空白现象:选中一个
<div>但右侧 Styles 面板什么都没显示。原因:可能选中的是父元素的伪元素或注释节点;也可能是元素被
display: none隐藏导致 Computed 不渲染。解决:切换到 Computed 标签查看最终计算样式;或在 Elements 树中确认选中的是真实元素节点。
踩坑 ③:把 Elements 的 DOM 当成原始 HTML现象:爬虫用 requests 拿到的 HTML 和 Elements 看到的不一致。
原因:Elements 显示的是 JS 执行后的 DOM,而 requests 拿到的是服务器原始返回的 HTML(未经 JS 渲染)。
解决:动态内容需要用 Network 找 AJAX 接口,或用 Selenium/Playwright 渲染后再提取。

图片:Elements 面板右键菜单截图------标注出 "Store as global variable"、"Copy selector"、"Copy XPath"、"Force state" 等常用菜单项
4.2 Console 面板:网页的"终端"
是什么
Console 面板是一个 JavaScript 交互式命令行,也是一切日志输出(console.log、报错信息、网络警告)的汇总窗口。你可以在上面执行任意 JS 代码,代码运行在当前页面的上下文中,意味着你能访问页面上所有的全局变量、DOM 对象、Cookie、LocalStorage 等。

图片:Console 面板截图------在 CSDN 页面打开 Console,输入 `document.cookie` 后回车,下方显示返回的 Cookie 字符串
为什么需要它
真实问题 ⑤: 爬虫开发者想知道目标网站是否检测了 Selenium/Puppeteer 等自动化工具。他可以用
navigator.webdriver来判断------这个属性在正常浏览器中是false,在被 Selenium 控制的浏览器中是true。但怎么在目标网站上执行这个检查?直接在地址栏输入没有用,需要一个 JS 运行环境------Console 就是答案。
Console 面板的三个核心价值:
| 价值 | 说明 | 典型场景 |
|---|---|---|
| 快速验证 | 写一行 JS 立即看结果 | 测试 CSS 选择器是否选中了目标元素 |
| 信息提取 | 读取页面上下文中的敏感信息 | 提取 Cookie、UserAgent、全局 JS 变量 |
| 逆向分析 | 查看报错和自定义日志 | 判断网站反爬逻辑是否触发了错误 |
怎么做(CSDN 案例实操)
在 CSDN 页面打开 Console 面板,输入以下命令并观察结果:
javascript
// 1. 查看当前登录 Cookie
document.cookie
// 输出:UserName=aw; UserToken=xxxx; uuid_tt_dd=10_123456789...
// 2. 查看当前浏览器 UserAgent
navigator.userAgent
// 输出:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/...
// 3. 验证 CSS 选择器是否有效
document.querySelector('h1.title-article')
// 输出:<h1 class="title-article" id="articleContentId">...</h1>
// 4. 提取所有文章链接
document.querySelectorAll('a[href*="article/details"]')
// 输出:NodeList 包含所有文章链接元素
// 5. 判断是否为自动化浏览器
navigator.webdriver
// 输出:false(正常浏览器);true(被 Selenium 控制)
为什么 document.cookie 能直接读到 Cookie: 这是浏览器 JS 引擎提供的标准 API,document 对象代表当前页面,.cookie 属性返回该域名下所有非 HttpOnly 的 Cookie 拼接成的字符串。只要 JS 运行在 CSDN 的域名上下文中,就能读取 CSDN 设置的 Cookie。
如果是其他网站怎么办?
CSDN 的 Cookie 字段名是 UserName、UserToken,但淘宝的 Cookie 可能用 _tb_token_、京东的用 TrackID、知乎的用 z_c0。不要记字段名,记方法: document.cookie 对任何网站都有效,拿到字符串后用 ; 分割即可解析。同样,navigator.userAgent 在任何网站都能告诉你当前的浏览器指纹。

图片:Console 面板截图------展示输入 `navigator.webdriver` 后返回 `false` 的结果,以及输入 `document.querySelectorAll('a')` 后返回 NodeList 的结果
有什么用(重点:五视角实战)
| 工程视角 | Console 面板能解决什么问题 | CSDN 实战案例 |
|---|---|---|
| 前端开发 | 快速验证 JS 逻辑、调试变量值、临时注入代码测试 | 在 CSDN 文章页执行 document.title 确认标题是否正确传给分享 SDK |
| 后端开发 | 验证接口返回的 JSON 在前端是否能正常解析、检查跨域 | 在 Console 中 fetch('/api/article/detail') 验证 CSDN 接口可用性 |
| 爬虫开发 | 提取 Cookie / Token / UA、验证 CSS 选择器、判断反爬 | copy(document.cookie) 复制 CSDN 登录 Cookie 给 Python requests 使用 |
| 测试工程 | 注入测试数据、模拟用户操作、断言验证 | 在 Console 执行 document.querySelector('.login-btn').click() 触发 CSDN 登录弹窗 |
| 运维排障 | 检查前端 JS 报错、验证资源加载状态 | 在 CSDN 报错页面查看 Console 红色错误,定位是哪个 JS 文件抛出异常 |
踩坑案例(新手常见误区)
踩坑 ①:跨域限制导致 fetch 失败
现象:在 CSDN 页面 Console 中执行
fetch('https://api.github.com')报 CORS 错误。原因:浏览器同源策略限制,JS 默认不能跨域请求。
解决:使用 Network 面板观察真实请求;或后端配置 CORS 头;或使用 Console 的
copy as fetch配合 mode: 'no-cors'。
踩坑 ②:把 Console 当 Node.js 用现象:在 Console 中执行
require('fs')或process.exit()报错。原因:Console 运行的是浏览器 JS 环境,没有 Node.js 的全局对象(require、process、Buffer 等)。
解决:浏览器环境使用浏览器 API(fetch 替代 http 模块、localStorage 替代 fs 简单存储)。
踩坑 ③:忽略 Console 上下文切换现象:在 iframe 嵌套页面中,
document.cookie返回的不是预期的域名 Cookie。原因:Console 默认在 top 上下文执行,但页面可能有多个 iframe,每个 iframe 有独立上下文。
解决:Console 顶部有下拉框切换执行上下文,选择目标 iframe 后再执行命令。
图片:Console 面板顶部上下文切换下拉框截图------标注出 top context 和各个 iframe 选项,说明切换后执行的命令作用于对应 frame
4.3 Sources 面板:网页的源码仓库
是什么
Sources 面板展示当前页面加载的所有源文件------HTML、JS、CSS、图片、字体等,按域名和目录组织成文件树。同时支持设置断点(Breakpoint)进行 JS 代码的单步调试。
技术概念:断点调试(Breakpoint Debugging)
- 是什么:断点调试是让 JS 引擎在执行到指定代码行时暂停运行的机制。暂停时可以查看当前所有变量的值、调用栈、作用域链,并支持单步执行(Step Over / Step Into / Step Out)。
- 为什么需要它 :纯靠
console.log调试效率低下------每次修改都要重新刷新;而断点调试能精确捕获程序运行的瞬间状态,无需修改源码。 - 有什么用:前端定位复杂业务逻辑 Bug;逆向工程师分析反爬虫算法;安全研究员追踪加密函数的输入输出;测试人员验证边界条件下的代码行为。
- 怎么用:打开 JS 文件 → 点击行号左侧空白处设置蓝色断点 → 触发对应逻辑 → 程序暂停 → 右侧 Scope 面板查看变量 → F10 单步跳过 / F11 单步进入 / F8 继续执行。
技术概念:Source Map(源映射)
- 是什么:Source Map 是一个 JSON 文件,记录"压缩混淆后的代码"与"原始源码"之间的位置映射关系。
- 为什么需要它 :现代前端工程普遍使用 Webpack/Vite 打包,线上代码是混淆压缩的,出错时栈追踪只能定位到
app.min.js:1:23456,毫无意义。Source Map 让浏览器能还原出原始文件名和行号。 - 有什么用:线上错误监控(Sentry、Bugsnag)依赖 Source Map 还原用户报错堆栈;调试第三方库时能直接看到 TS 源码而非编译后的 JS。
- 怎么用 :在 Sources 面板 → 右侧 "Sources" 树 → 查找
webpack://节点,里面是还原后的源码;或在 Settings → Sources 中启用 "Enable JavaScript source maps"。
为什么需要它
真实问题 ⑥: 一个前端项目上线后,用户反馈某个按钮点击没反应。开发者打开 Sources 面板,在怀疑的 JS 文件里设置断点,点击按钮触发断点,然后一步步跟踪代码执行路径,发现是一个 if 条件永远不成立------因为后端返回的数据格式变了。
Sources 面板的两大核心用途:
| 用途 | 场景 |
|---|---|
| 文件查看 | 快速找到某个 JS 文件,查看其完整源码(包括压缩混淆后的代码) |
| 断点调试 | 在某行 JS 代码上暂停执行,查看当前变量值、调用栈 |
怎么做(CSDN 案例实操)
步骤:
1. 打开 https://blog.csdn.net/A1063348628
2. 按 F12 → 点击 Sources 标签
3. 左侧文件树中展开 blog.csdn.net → js 目录
4. 双击任意 .js 文件,右侧展示源码
5. 点击源码行号左侧的空白处 → 设置断点(蓝色标记出现)
6. 刷新页面 → 代码执行到断点处暂停
实用技巧: 按 Ctrl+Shift+F 可以在所有已加载的源文件中全文搜索 。比如搜索 UserName,能快速定位到哪些 JS 文件处理了登录逻辑。
如果是其他网站怎么办?
现代网站的 JS 代码大多经过压缩和混淆(变量名变成 a、b、c,代码挤在一行),直接阅读意义不大。Sources 面板的真正价值在于断点调试 和全文搜索定位关键逻辑 ------这些能力对任何网站都通用。对于混淆严重的代码,可以先点击下方的 {} 按钮(Pretty Print)格式化,让代码恢复缩进,虽然变量名还是混淆的,但至少能看清逻辑结构。
有什么用(重点:五视角实战)
| 工程视角 | Sources 面板能解决什么问题 | CSDN 实战案例 |
|---|---|---|
| 前端开发 | 断点调试业务逻辑、本地覆盖线上 JS 验证修复 | 在 CSDN 推荐列表的 JS 中打断点,跟踪"猜你喜欢"算法执行流程 |
| 后端开发 | 验证前端调用接口的入参、查看 JS 拼接的请求 URL | 在 CSDN 评论提交 JS 中断点,确认 POST 请求体格式 |
| 爬虫开发 | 逆向分析加密参数(如 sign、token 生成逻辑) | 搜索 UserName 找到 CSDN 登录态校验函数,分析签名算法 |
| 测试工程 | 验证边界条件下的 JS 行为、检查异常处理 | 在 CSDN 搜索框 JS 中断点,输入超长字符串观察是否触发长度校验 |
| 运维排障 | 排查 JS 加载失败、检查 Source Map 是否泄露生产源码 | CSDN 改版后某 JS 404,用 Sources 文件树确认资源路径变更 |
踩坑案例(新手常见误区)
踩坑 ①:断点不生效
现象:在 Sources 设置了断点,触发对应操作但程序没暂停。
原因:可能断点设置在被异步加载的代码上但代码尚未执行;或被 Web Worker 执行;或代码被压缩到一行导致断点定位失败。
解决:先 Pretty Print 格式化代码再设置断点;确认 Sources 顶部没有 "Deactivate breakpoints" 按钮(蓝色斜杠图标)。
踩坑 ②:误把 Source Map 上传到生产环境现象:访问 CSDN 时 Sources 面板能看到完整的 TS 源码甚至注释,包含业务逻辑。
原因:构建配置失误,把
.map文件也发布到了 CDN。解决:生产构建关闭 source map 生成;或用
.map文件不公开访问的策略;或使用 hidden-source-map 仅在内部监控系统中使用。
踩坑 ③:忽略 Local Overrides 的覆盖范围现象:用 Local Overrides 修改了 JS 文件,但部分逻辑没生效。
原因:Overrides 只覆盖通过
<script src>加载的文件,不覆盖 inline 脚本和动态import()的模块。解决:检查目标 JS 是否为外部资源;动态模块需要用其他方式拦截(如 Service Worker)。

图片:Sources 面板截图------左侧文件树展开 blog.csdn.net 节点,中间显示格式化后的 JS 代码并标注蓝色断点,右侧 Call Stack 和 Scope 面板展示调试状态
4.4 Network 面板:通信记录仪(核心)
是什么
Network 面板监控并记录页面从打开到关闭之间的所有网络请求------包括请求的 URL、方法(GET/POST)、状态码(200/404/500)、请求头和响应头、请求体和响应体、耗时、发起者等完整信息。
技术概念:瀑布图(Waterfall)
- 是什么:瀑布图是 Network 面板中每条请求右侧的水平条形图,按时间轴横向排列,展示请求从发起到完成的完整时间分布。
- 为什么需要它:单纯的"总耗时"无法定位瓶颈------是网络慢还是服务器慢?是 DNS 解析慢还是 TLS 握手慢?瀑布图把每个阶段拆开可视化。
- 有什么用:前端优化首屏加载性能(找出最慢的请求);后端排查接口响应时间分布;运维诊断 CDN 命中率和 TLS 配置;爬虫判断接口超时是网络抖动还是限流。
- 怎么用 :点击任意请求 → 切到 Timing 标签 → 查看 Queueing(排队)/ Stalled(停滞)/ DNS Lookup / Initial Connection / SSL / Request Sent / Waiting (TTFB) / Content Download 各阶段耗时。TTFB(Time To First Byte) 是评估后端响应速度的关键指标。
技术概念:TTFB(Time To First Byte)
- 是什么:TTFB 指从发起请求到接收到服务器返回的第一个字节的时间间隔。
- 为什么需要它:TTFB 反映了"网络往返 + 服务器处理"的综合速度,是 Google Core Web Vitals 的重要参考指标。
- 有什么用:TTFB > 500ms 通常意味着后端慢或网络差,需要优化数据库查询、增加缓存、使用 CDN 加速。
- 怎么用:Network → Timing → Waiting (TTFB) 字段直接显示数值;或在 Lighthouse 报告中查看。
为什么需要它(核心价值)
真实问题 ⑦(本系列的核心场景): 你打开 CSDN 博客页面,看到 20 篇文章列表。你需要用 Python 程序自动获取这些文章数据。问题是:数据是"嵌在 HTML 里返回的"还是"页面加载后通过 AJAX 动态请求的"?如果是 AJAX,请求的 URL 是什么?需要什么参数?返回什么格式?
这些问题在 Network 面板里全部有答案。 这就是 Network 面板是整个系列核心的原因------它是连接"浏览器里看到的网页"和"程序里发出的 HTTP 请求"之间的桥梁。
| 你要做的事 | Network 面板给你的答案 |
|---|---|
| Python 模拟请求获取数据 | 找到 API 的完整 URL、方法、请求头、参数、返回格式 |
| 排查接口调用失败 | 查看状态码和响应体中的错误信息 |
| 分析页面加载性能 | 查看每个请求的耗时和瀑布图 |
| 确认缓存是否生效 | 查看状态码是 200(实际请求)还是 304(使用缓存) |
| 验证登录态 | 查看请求头中 Cookie 是否被正确携带 |
怎么做(CSDN 案例实操------完整流程)
步骤:
1. 打开 https://blog.csdn.net/A1063348628
2. 按 F12 → 点击 Network 标签
3. 重要:确保左上角的录制按钮是红色(默认就是录制状态)
4. 勾选 "Preserve log"(保留日志------页面跳转时不清空记录)
5. 刷新页面(F5)→ 观察请求列表瞬间填满
6. 点击顶部的 "Fetch/XHR" 过滤按钮(只看 AJAX 请求)

图片:Network 面板截图------展示 CSDN 博客页面刷新后的完整请求列表,标注出 Type 列、Name 列、Status 列,以及顶部的 Fetch/XHR 过滤按钮
Network 面板请求分类速查表
在 CSDN 博客页面刷新后,你会看到不同类型的请求:
| Type 列显示 | 含义 | CSDN 页面中的实例 |
|---|---|---|
document |
HTML 页面文档 | A1063348628?spm=1011.2124.3001.5343(博客主页) |
xhr / fetch |
AJAX 异步数据请求 | get-business-list、article/detail 等 API 接口 |
script |
JavaScript 脚本 | recommend.js、highlight.pack.js、jquery.min.js |
stylesheet |
CSS 样式文件 | csdn_blog_detail.min.css、iconfont.css |
png / jpeg / svg / webp |
图片资源 | 用户头像、封面图、图标 |
font |
字体文件 | iconfont.woff2(图标字体) |
media |
音视频文件 | 页面中嵌入的视频 |
关键技巧: 点击 Fetch/XHR 过滤按钮,瞬间从上百条请求中筛选出 10-20 条 API 调用------这些才是数据抓取的目标。
点击一条请求能看到什么
在过滤后的列表中,点击一条 API 请求(如 get-business-list),右侧出现详细面板,包含 7 个子标签:
| 子标签 | 内容 | 对应 HTTP 协议概念 |
|---|---|---|
| Headers | 请求 URL、方法、状态码、请求头、响应头 | 请求行 + 请求头 + 响应行 + 响应头 |
| Payload | 请求体参数(GET 的 Query String 或 POST 的 Form Data) | 请求体 |
| Preview | 格式化预览响应体(JSON 自动树形展开) | 响应体 |
| Response | 原始响应体文本 | 响应体 |
| Initiator | 谁发起了这个请求(JS 调用栈) | --- |
| Timing | 请求各阶段耗时分解 | --- |
| Cookies | 该请求携带和设置的 Cookie | --- |

图片:Network 面板点击一条 API 请求后的详情视图截图------展示 Headers 标签的 General、Request Headers、Response Headers 区域
在 CSDN 上找到第一个 API
以 CSDN 博客页面为例,找到文章相关的 API:
1. Network 面板 → 点击 Fetch/XHR 过滤
2. 在请求列表中逐个点击,直到右侧 Response 标签显示 JSON 数据
3. 典型 API 名称:get-business-list、article/detail、list-article
当你看到类似这样的响应时,说明找到了数据接口:
json
{
"code": 200,
"data": {
"list": [
{
"articleId": "1xxxxxxxxx",
"title": "Python 爬虫入门教程",
"description": "...",
"nickName": "A1063348628",
"viewCount": "1200",
"commentCount": "15"
}
]
}
}
这个 JSON 比解析 HTML 高效 10 倍以上。 后续文档会教你如何用 Python 代码精确模拟这个请求,以程序方式获取同样的数据。
如果是其他网站怎么办?
CSDN 的 API 路径可能是 get-business-list,但其他网站的 API 路径千差万别:
- 知乎可能是
/api/v4/members/xxx/articles - GitHub 可能是
/users/xxx/repos - 淘宝可能是
/h5/mtop.xxx.xxx/1.0/
不要记具体的 API 路径,记发现方法:
- 打开 Network 面板
- 点击 Fetch/XHR 过滤
- 逐个点击请求,查看 Response 是否为 JSON
- 对比 JSON 内容与页面显示内容是否一致
- 一致 = 找到了
这 5 步流程适用于所有网站,无论它的 API 路径、参数、认证方式如何不同。
有什么用(重点:五视角实战)
| 工程视角 | Network 面板能解决什么问题 | CSDN 实战案例 |
|---|---|---|
| 前端开发 | 排查接口 4xx/5xx 错误、分析请求瀑布图优化首屏 | CSDN 首屏白屏:用 Network 瀑布图发现某个第三方 SDK 阻塞了 3 秒 |
| 后端开发 | 验证接口入参出参、定位跨域问题、分析请求频率 | CSDN 评论接口 400:查看 Payload 确认是 articleId 字段缺失 |
| 爬虫开发 | 提取 API URL/参数/请求头/Cookie、分析反爬策略 | 找到 CSDN 文章列表 API,复制 Cookie 和 UA 给 Python 模拟请求 |
| 测试工程 | 录制接口回归用例、压测瓶颈接口、验证缓存策略 | CSDN 改版后回归测试:录制旧版接口请求,对比新版返回字段差异 |
| 运维排障 | CDN 命中率分析、缓存策略验证、限流排查 | CSDN 静态资源 502:Network 看到 CDN 节点回源失败,切换备用节点 |
踩坑案例(新手常见误区)
踩坑 ①:未勾选 Preserve log 导致跳转后记录消失
现象:在 CSDN 登录流程中,提交后页面跳转,Network 列表被清空,看不到登录请求。
原因:默认 Network 在页面跳转时会清空记录。
解决:勾选顶部的 "Preserve log" 复选框,跨页面跳转保留所有请求记录。
踩坑 ②:忽略请求顺序导致漏看关键请求现象:找半天没看到登录 API,结果发现是被前面的请求触发的二级请求。
原因:现代网站常用 OAuth/SSO 流程,一次登录可能涉及多个重定向和 token 交换请求。
解决:用 Initiator 列追溯请求发起者;或按时间顺序从上到下逐个分析。
踩坑 ③:把浏览器的预检请求当成业务请求现象:看到一条 OPTIONS 方法的请求,以为是接口设计错误。
原因:跨域请求时浏览器会自动发送 OPTIONS 预检请求,确认服务器允许的方法和头。
解决:识别 OPTIONS 请求为预检请求,关注后续的 POST/GET 请求才是真实业务请求。
踩坑 ④:Cache 影响性能分析现象:第二次刷新页面加载时间明显变短,但代码没改。
原因:浏览器缓存命中,从磁盘读取资源而非重新请求。
解决:分析性能时勾选 "Disable cache" 复选框,强制走真实网络请求。

图片:Network 面板顶部工具栏截图------标注出 Preserve log、Disable cache、Fetch/XHR 过滤器、Throttling 网络限速等关键按钮的位置和作用
4.5 Application 面板:本地储物间
是什么
Application 面板管理浏览器为当前域名存储的所有本地数据------Cookie、LocalStorage、SessionStorage、IndexedDB、Service Worker、缓存等。
技术概念:Cookie
- 是什么 :Cookie 是浏览器为某个域名存储的小型键值对(单条 ≤ 4KB),由服务器通过
Set-Cookie响应头设置,之后浏览器对该域名的每次请求都会自动通过Cookie请求头携带。 - 为什么需要它:HTTP 是无状态协议,服务器无法区分两次请求是否来自同一用户。Cookie 是最早的会话保持机制,让服务器能识别"这是登录用户 A"。
- 有什么用 :维持登录态(CSDN 的
UserName/UserToken);跟踪用户行为(埋点 Cookie);记录用户偏好(语言、主题);爬虫模拟登录的必备凭证。 - 怎么用:在 Application → Cookies → 选中域名 → 表格中查看 Name / Value / Domain / Path / Expires / HttpOnly / Secure / SameSite 各列。
技术概念:LocalStorage
- 是什么:HTML5 引入的持久化本地存储 API,单条数据可达 5MB,键值对形式,关闭浏览器后仍然保留。
- 为什么需要它:Cookie 容量小且每次请求都携带,浪费带宽;LocalStorage 容量大且不随请求发送,适合存储不需要发到服务器的数据。
- 有什么用:存储 JWT Token(CSDN 的 UserToken 备份);缓存用户偏好(暗黑模式、字号);存储离线数据;前端 SDK 配置。
- 怎么用 :Application → Local Storage → 选中域名 → 查看键值对;或 Console 中
localStorage.setItem('k', 'v')/localStorage.getItem('k')。
技术概念:SessionStorage
- 是什么:会话级本地存储,API 与 LocalStorage 完全一致,区别在于关闭标签页后自动清除。
- 为什么需要它:某些临时数据(如表单草稿、临时Token)不应跨会话保留,SessionStorage 提供了"用完即焚"的存储方式。
- 有什么用:多步骤表单中间状态保存;SPA 路由切换间的临时数据;防刷新丢失的输入内容。
- 怎么用 :Application → Session Storage → 选中域名 → 查看;或 Console 中
sessionStorage.setItem('k', 'v')。
技术概念:IndexedDB
- 是什么:浏览器内置的 NoSQL 数据库,支持事务、索引、游标,容量可达数百 MB 甚至更多,可存储对象、文件、Blob 等结构化数据。
- 为什么需要它:LocalStorage 只能存字符串且有 5MB 限制;IndexedDB 解决了"浏览器端需要存储大量结构化数据"的问题,是 PWA 离线应用的基础。
- 有什么用:离线 Web 应用(Gmail 离线模式);大量数据缓存(CSDN 收藏夹本地缓存);Web 端的富客户端应用数据存储。
- 怎么用 :Application → IndexedDB → 展开数据库 → 查看 Object Store 和记录;或 JS 中通过
indexedDB.open()API 操作。
四种存储对比速查表
| 维度 | Cookie | LocalStorage | SessionStorage | IndexedDB |
|---|---|---|---|---|
| 容量 | ≤ 4KB / 条 | ~ 5MB / 域 | ~ 5MB / 域 | 数百 MB+ |
| 生命周期 | 按 Expires 设定 | 永久(手动清除) | 标签页关闭清除 | 永久(手动清除) |
| 随请求发送 | 是(自动) | 否 | 否 | 否 |
| 数据类型 | 字符串 | 字符串 | 字符串 | 任意结构化数据 |
| API 风格 | 字符串拼接 | 同步键值对 | 同步键值对 | 异步事务 |
| 典型用途 | 登录态 | Token 缓存 | 表单草稿 | 离线数据 |
| CSDN 实例 | UserName | UserToken 备份 | 临时页面状态 | 收藏夹离线缓存 |
为什么需要它
真实问题 ⑧: 爬虫在请求 CSDN 时返回 403,检查后发现浏览器请求时自动携带了一个
UserNameCookie,而 Python 的 requests 库没有带。你怎么知道这个 Cookie 的名字和值?Application 面板告诉你。
| 存储类型 | 特点 | 在爬虫中的作用 |
|---|---|---|
| Cookies | 随每个请求自动发送到服务器,有过期时间 | 维持登录态的关键 |
| LocalStorage | 持久存储,不随请求发送 | 网站偏好设置、Token 备份 |
| SessionStorage | 会话级存储,关标签页即清除 | 临时状态保存 |
怎么做(CSDN 案例实操)
步骤:
1. 打开 https://blog.csdn.net/A1063348628 → F12 → Application
2. 左侧 Storage → Cookies → 点击 blog.csdn.net
3. 右侧表格展示该域名下的所有 Cookie
你会看到类似这样的 Cookie 列表:
| Name | Value | Domain | Expires | HttpOnly |
|---|---|---|---|---|
UserName |
A1063348628 |
.csdn.net | 2025-01-15 | false |
UserToken |
eyJhbG... |
.csdn.net | 2025-01-15 | false |
uuid_tt_dd |
10_XXXXXXXXX |
.csdn.net | Session | false |
dc_sid |
xxxxx |
.csdn.net | Session | false |
图片:Application 面板的 Cookies 视图截图------左侧选择 blog.csdn.net,右侧表格展示 Name、Value、Domain、Path、Expires、HttpOnly 各列
为什么 HttpOnly 的 Cookie 在 Console 的 document.cookie 中看不到: HttpOnly 是 Cookie 的一个安全标志。设置了 HttpOnly=true 的 Cookie,JS 代码无法通过 document.cookie 读取,只能在 Network 面板的请求头中看到,或者在 Application 面板中直接查看。这是浏览器防止 XSS 攻击窃取 Cookie 的安全机制。F12 作为调试工具可以绕过这个限制,但你的 JS 代码不能。
如何手动清空 Cookie(测试登录状态)
在 Application → Cookies → 右键 blog.csdn.net → Clear → 刷新页面 → 退出登录状态。这等价于浏览器"清除浏览数据"操作,但颗粒度更细------只清 CSDN 的 Cookie,不影响其他网站。
如果是其他网站怎么办?
所有网站的 Cookie 都在同一个位置查看。区别在于:
- 电商网站(淘宝/京东)的 Cookie 数量可能上百个,需要滚动查找关键字段
- 单页应用(Vue/React 写的网站)可能主要使用 LocalStorage 存 Token,Cookie 反而很少
- 有些网站用 Session Storage 存储临时 Token,关掉标签页就消失------这意味着你的爬虫如果模拟"新标签页打开",需要从头走登录流程
通用方法: 搜索框输入关键字段名(如 token、auth、session)快速定位。多数网站的认证相关字段会包含 token、auth、sid、session 等关键字。
有什么用(重点:五视角实战)
| 工程视角 | Application 面板能解决什么问题 | CSDN 实战案例 |
|---|---|---|
| 前端开发 | 调试 LocalStorage 读写、检查 Service Worker 缓存、清空测试数据 | CSDN 暗黑模式切换无效:检查 LocalStorage 中 theme 字段是否被正确写入 |
| 后端开发 | 验证 Cookie 设置的 Domain/Path/SameSite 是否符合预期 | CSDN 跨子域共享登录态:确认 Cookie 的 Domain 是 .csdn.net 而非 blog.csdn.net |
| 爬虫开发 | 提取登录 Cookie/Token、清空 Cookie 测试登录流程 | 复制 CSDN 的 UserToken 给 Python requests 模拟登录请求 |
| 测试工程 | 清空存储验证首次访问体验、检查 Cookie 过期机制 | 清空 CSDN Cookie 后访问,验证未登录状态下的页面降级策略 |
| 运维排障 | 排查 Cookie 配置错误、监控 Storage 配额超限 | CSDN 用户反馈"无法登录":让用户提供 Application 截图查看 Cookie 是否被异常清除 |
踩坑案例(新手常见误区)
踩坑 ①:HttpOnly Cookie 在 Console 中读不到
现象:在 Console 执行
document.cookie看不到某些 Cookie,但 Network 请求头里有。原因:这些 Cookie 设置了
HttpOnly=true标志,JS 无法读取,是防 XSS 的安全机制。解决:用 Application 面板查看(F12 是调试工具可以绕过此限制);或用 Network 面板的 Cookies 标签查看请求中携带的 Cookie。
踩坑 ②:Cookie 的 Domain 写错导致跨子域失效现象:CSDN 主域登录后访问
blog.csdn.net子域又显示未登录。原因:Cookie 的 Domain 设成了
www.csdn.net而非.csdn.net,子域无法共享。解决:服务器设置 Cookie 时 Domain 应为
.csdn.net(带前导点表示子域共享)。
踩坑 ③:LocalStorage 跨域不可访问现象:在
blog.csdn.net写入的 LocalStorage,在bbs.csdn.net读不到。原因:LocalStorage 严格遵循同源策略(协议+域名+端口必须完全一致)。
解决:跨域共享数据需通过 postMessage API 或后端中转;或使用 Cookie 共享登录态。
踩坑 ④:清空 Cookie 后仍显示登录态现象:在 Application 中清空了 CSDN 的所有 Cookie,刷新后页面仍显示已登录。
原因:CSDN 可能将 Token 同时存在 LocalStorage 或 IndexedDB 中,刷新时 JS 重新写入 Cookie。
解决:同时清空 Cookie、LocalStorage、SessionStorage、IndexedDB;或使用浏览器"清除浏览数据"功能彻底清理。
图片:Application 面板左侧 Storage 树截图------展开 Cookies / Local Storage / Session Storage / IndexedDB / Service Workers 各节点,标注出每个节点的作用和清空操作入口
4.6 Performance 面板:体检报告
是什么
Performance 面板用于录制页面运行时的一段"行为快照",然后以火焰图、饼图、瀑布图等形式展示 CPU 使用、网络请求、JS 执行、页面渲染的精确时间线。
技术概念:FPS(Frames Per Second)
- 是什么:FPS 指页面每秒渲染的帧数,60 FPS 是浏览器流畅运行的黄金标准(每帧 16.67ms 内完成)。
- 为什么需要它:人眼对低于 30 FPS 的画面会感知到卡顿,低于 60 FPS 的滚动和动画会感觉不流畅。FPS 是用户体验的直观量化指标。
- 有什么用:评估动画流畅度;诊断滚动卡顿;优化交互响应;监控低端设备体验。
- 怎么用 :在 Performance 录制结果中查看右上角 FPS 折线图;或 Console 中执行
requestAnimationFrame计数法自测;或安装 FPS Monitor 扩展实时监控。
技术概念:CPU 占用率(CPU Usage)
- 是什么:CPU 占用率指 JS 引擎、渲染引擎、合成线程等占用 CPU 时间的比例,Performance 面板按类别(Scripting / Rendering / Painting / System / Idle)分别统计。
- 为什么需要它:高 CPU 占用会导致设备发热、电池消耗快、其他标签页卡顿,是性能优化的核心指标。
- 有什么用:定位长任务(Long Task > 50ms);分析 JS 执行瓶颈;优化渲染流水线;评估电池友好性。
- 怎么用:Performance 录制 → 查看 Summary 饼图按类别分布 → 找出占比最高的类别深入分析 → Main 火焰图中定位宽火焰条(长任务)。
技术概念:火焰图(Flame Chart)
- 是什么:火焰图是 Performance 面板的核心可视化形式,横轴是时间,纵轴是调用栈深度,每个矩形代表一次函数调用,宽度代表执行时长。
- 为什么需要它:传统的性能数据是文本表格难以阅读,火焰图把"谁调用了谁、耗时多长"以图形方式直观呈现,宽火焰条立即定位性能瓶颈。
- 有什么用:定位 JS 长任务;分析渲染瓶颈;追踪函数调用链;评估第三方库性能开销。
- 怎么用:Performance → Main 区域 → 横向放大查看火焰图 → 点击最宽的矩形 → 底部 Summary 显示该函数的执行时间和调用栈。
为什么需要它
真实问题 ⑨: 产品经理说"我们的页面加载太慢了"。美工说是因为图片太大,后端说是因为接口慢,前端说是因为页面 JS 太多。到底是谁的问题?Performance 面板用数据说话。
怎么做(概要)
步骤:
1. F12 → Performance 标签
2. 点击 ● 录制按钮 → 刷新页面 → 等待加载完成 → 点击 Stop
3. 分析生成的火焰图和饼图
4. 查看 JS 执行时间占比、网络请求耗时、渲染瓶颈
为什么本系列不重点讲 Performance: 性能分析属于前端工程优化的范畴,与爬虫/数据抓取的核心目标(理解网络通信、模拟请求)关联度较低。但当你遇到"爬虫请求特别慢"时,可以回顾这个面板排查。
有什么用(重点:五视角实战)
| 工程视角 | Performance 面板能解决什么问题 | CSDN 实战案例 |
|---|---|---|
| 前端开发 | 定位首屏白屏原因、优化长任务、分析 FPS 掉帧 | CSDN 文章列表滚动卡顿:录制发现第三方广告 SDK 占用 200ms 长任务 |
| 后端开发 | 分析接口耗时占比、定位 TTFB 瓶颈 | CSDN 接口慢:录制发现 TTFB 占 800ms,定位是数据库慢查询 |
| 爬虫开发 | 评估爬虫对页面性能的影响、优化请求间隔 | CSDN 爬虫触发风控:分析请求瀑布图发现请求过密被限流 |
| 测试工程 | 性能回归测试、低端设备体验测试、压测瓶颈分析 | CSDN 改版后性能回归:对比新旧版本 Lighthouse 分数 |
| 运维排障 | 监控生产环境性能、分析 CDN 加速效果 | CSDN 移动端首屏慢:Performance 发现图片未做懒加载,CDN 未启用 WebP |
踩坑案例(新手常见误区)
踩坑 ①:录制时长过长导致数据爆炸
现象:录制 5 分钟后浏览器卡死,Performance 面板无法加载。
原因:Performance 记录每一帧的详细信息,5 分钟可能产生数百 MB 数据。
解决:录制控制在 10-30 秒内,先触发问题再开始录制,问题复现后立即停止。
踩坑 ②:开发环境性能不代表生产环境现象:本地开发测试 60 FPS 流畅,上线后用户反馈卡顿。
原因:开发环境未压缩、有 Source Map、Vue/React 开发模式开启校验,性能损耗大。
解决:在生产环境(或 staging 环境)用 Performance 录制;或使用 Lighthouse CI 集成到部署流程。
踩坑 ③:忽略长任务对交互的影响现象:用户点击按钮后 500ms 才响应,但 Performance 看不到明显异常。
原因:长任务(> 50ms)会阻塞主线程,但要看 Main 火焰图的红色三角形标记,不能只看 Summary 饼图。
解决:勾选 Performance 顶部的 "Capture screenshots" 和查看 Main 区的红色 Long Task 标记。

图片:Performance 面板录制结果截图------顶部 FPS 折线图、中部 Main 火焰图(标注一个红色三角形的长任务)、底部 Summary 饼图按类别展示 CPU 占用
五、Console 控制台实用命令速查(Problem → Solution → Why)
接下来的每一个命令都遵循:解决什么问题 → 怎么执行 → 为什么有效。
5.1 提取 Cookie
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你需要知道 CSDN(或任意网站)的登录 Cookie 是什么,以便在 Python 中设置到请求头里 |
| 怎么做 | Console 中输入 document.cookie,回车 |
| 为什么有效 | document 是浏览器暴露给 JS 的标准全局对象,.cookie 属性返回当前域名下所有非 HttpOnly 的 Cookie 键值对拼接串 |
5.2 查看当前 URL
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你在某个子页面,想确认当前完整 URL(包括 ? 后面的查询参数和 # 后面的 hash) |
| 怎么做 | Console 中输入 location.href,回车 |
| 为什么有效 | location 是全局对象,代表当前窗口的 URL 信息,.href 返回完整 URL 字符串 |
5.3 查看浏览器指纹(UserAgent)
| 维度 | 内容 |
|---|---|
| 解决的问题 | 网站通过 UserAgent 判断你是浏览器还是爬虫,你需要知道自己的请求头长什么样 |
| 怎么做 | Console 中输入 navigator.userAgent,回车 |
| 为什么有效 | navigator 是浏览器信息对象,.userAgent 是 HTTP User-Agent 请求头的 JS 镜像 |
5.4 验证 CSS 选择器
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你想用 Python 的 BeautifulSoup 解析 HTML,但不确定 div.article > h1 这个选择器是否匹配到目标元素 |
| 怎么做 | Console 中输入 document.querySelector('div.article > h1'),回车------返回 null 表示不匹配,返回元素则表示匹配 |
| 为什么有效 | querySelector 和 BeautifulSoup 的 select_one 使用相同的 CSS 选择器语法------Console 里验证通过的,Python 里一定也通 |
5.5 提取当前页面所有图片 URL
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你需要批量下载当前页面的所有图片(如 CSDN 文章的配图) |
| 怎么做 | Array.from(document.querySelectorAll('img')).map(i => i.src) |
| 为什么有效 | querySelectorAll('img') 选中所有 <img> 标签,.src 属性返回图片的完整 URL |
5.6 复制内容到剪贴板
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你想把这个很长的 Cookie 字符串复制出来,但手动选中+复制容易漏字 |
| 怎么做 | copy(document.cookie),回车------Cookie 内容已自动在剪贴板里 |
| 为什么有效 | copy() 是 DevTools 特有的快捷方法(不是标准 JS API),仅在 Console 中可用 |
5.7 提取所有文章链接(CSDN 实战)
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你需要批量获取 CSDN 博客主页所有文章的 URL,用于后续爬取 |
| 怎么做 | Array.from(document.querySelectorAll('a[href*="article/details"]')).map(a => a.href) |
| 为什么有效 | querySelectorAll 选中所有匹配选择器的 <a> 元素,Array.from 把 NodeList 转数组,.map(a => a.href) 提取每个链接的 href 属性 |
5.8 监听所有 AJAX 请求(爬虫调试利器)
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你想知道页面在某个操作后发了哪些 AJAX 请求,但不想一直盯着 Network 面板 |
| 怎么做 | 见下方代码------覆盖原 fetch 和 XMLHttpRequest 拦截所有请求 |
| 为什么有效 | JS 允许重写全局对象方法,在原方法前后插入日志逻辑即可拦截所有调用 |
javascript
// 拦截 fetch 请求
const originalFetch = window.fetch;
window.fetch = function(...args) {
console.log('[Fetch]', args[0], args[1]?.body);
return originalFetch.apply(this, args);
};
// 拦截 XMLHttpRequest
const originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url) {
console.log('[XHR]', method, url);
return originalOpen.apply(this, arguments);
};
5.9 性能监测:实时 FPS
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你想实时查看页面 FPS,确认动画是否流畅 |
| 怎么做 | 见下方代码------使用 requestAnimationFrame 计数 |
| 为什么有效 | requestAnimationFrame 每帧调用一次,统计 1 秒内调用次数即为 FPS |
javascript
// 实时 FPS 监测(粘贴到 Console 后回车)
let lastTime = performance.now();
let frames = 0;
function fpsLoop() {
frames++;
const now = performance.now();
if (now - lastTime >= 1000) {
console.log(`FPS: ${frames}`);
frames = 0;
lastTime = now;
}
requestAnimationFrame(fpsLoop);
}
requestAnimationFrame(fpsLoop);
5.10 一键清理所有存储(测试用)
| 维度 | 内容 |
|---|---|
| 解决的问题 | 你需要快速清空当前网站的所有本地存储,回到"首次访问"状态 |
| 怎么做 | 见下方代码------一次性清空 Cookie / LocalStorage / SessionStorage / Cache |
| 为什么有效 | 各 Storage API 都提供了 clear() 方法,组合调用即可 |
javascript
// 一键清理(注意:会退出登录状态)
document.cookie.split(';').forEach(c => {
const eq = c.indexOf('=');
const name = eq > -1 ? c.substr(0, eq).trim() : c.trim();
document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/';
});
localStorage.clear();
sessionStorage.clear();
console.log('已清空所有本地存储');
location.reload();
六、从 CSDN 到所有网站:通用方法论(Point → Line → Surface)
6.1 提炼:你在 CSDN 上学到的是一套通用流程
本文以 CSDN 为切入点,但你学到的不只是"CSDN 的 F12 怎么用",而是:
| 在 CSDN 上学的具体动作 | 提炼出的通用能力 |
|---|---|
| 在 CSDN 刷新页面、观察 Network 请求列表 | 刷新 → 观察:适用于任何需要分析页面加载行为的网站 |
| 点击 Fetch/XHR 过滤按钮 | 过滤 API:任何网站都分页面文档和异步请求,过滤后只剩数据接口 |
| 找到 get-business-list 并查看 Response | 逐个点开看返回:不记 API 名称,只记"点开 → 看 Response 是不是 JSON → 和页面内容对照" |
| 提取 UserName、UserToken Cookie | 关键字段搜索法 :不记 Cookie 名,记 token、auth、session 等关键字 |
用 document.querySelector 验证选择器 |
Console 先行验证:先验证再写到代码里,避免无效的 Python 调试 |
6.2 从点→线→面的扩展
【点】CSDN 博客主页的具体操作
│
▼
【线】"打开任意网站 → F12 → Network → 找到 API → 复制请求信息" 这条工作流
│
├──→ 知乎文章列表 → 同样的流程找到 /api/v4/members/xxx/articles
├──→ 微信公众号后台 → 同样的流程找到 /cgi-bin/appmsg
├──→ GitHub Trending → 同样的流程找到 /search?q=xxx 的 API
├──→ 淘宝商品搜索 → 同样的流程找到 /h5/mtop.taobao.wsearch/1.0/
└──→ 任意现代网站 → 同样的流程 100% 有效
│
▼
【面】掌握了浏览器与服务器通信的底层机制------这个能力适用于所有 Web 端的交互场景
结论: 你在 CSDN 上学会的不是"CSDN 的 API 叫什么名字",而是"如何在任何网站上找到它的数据接口"。前者只对一个网站有效,后者对你职业生涯中的所有 Web 项目都有效。
七、本文档知识清单
学完本文档后,你应该能回答以下问题(自查清单):
- F12 开发者工具是哪六个核心面板?每个面板的作用是什么?
- 如何在 Elements 面板中快速定位到页面上的任意元素?
- Console 面板能执行什么类型的命令?
document.cookie返回什么? - Network 面板中,Type 列的
document、xhr、script、stylesheet分别代表什么? - 如何过滤 Network 面板只显示 API 请求(Fetch/XHR)?
- 点击一条请求后,Headers、Payload、Preview、Response 分别对应 HTTP 协议的哪个部分?
- Application 面板的 Cookies 视图中,Name、Value、Domain、HttpOnly 各是什么意思?
- 如果网站 A 用的是 JWT Token 存在 LocalStorage 而非 Cookie,你该怎么找到它?
-
copy(document.cookie)为什么能把内容复制到剪贴板?这个命令在 Node.js 环境下能用吗? - 从 CSDN 学到的 F12 使用流程,能否直接套用到知乎/GitHub/淘宝?为什么?
- DOM 和 HTML 的区别是什么?为什么爬虫用 requests 拿到的 HTML 和 Elements 看到的不一致?
- Cookie、LocalStorage、SessionStorage、IndexedDB 各自的容量限制和典型用途?
- 什么是 TTFB?如何通过 Network 面板排查接口慢的问题?
- HttpOnly Cookie 为什么在 Console 中读不到?这有什么安全意义?
- Performance 面板的火焰图中,宽火焰条代表什么?如何定位长任务?
八、知识体系图与实战检查清单
8.1 F12 知识体系全景图
┌──────────────────────┐
│ F12 开发者工具 │
└──────────┬───────────┘
│
┌───────────────┬─────────────┼─────────────┬───────────────┬───────────────┐
▼ ▼ ▼ ▼ ▼ ▼
┌────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────┐
│Elements│ │ Console │ │ Sources │ │ Network │ │ Application │ │Performance│
└───┬────┘ └────┬─────┘ └────┬─────┘ └────┬─────┘ └──────┬───────┘ └────┬─────┘
│ │ │ │ │ │
▼ ▼ ▼ ▼ ▼ ▼
DOM 树 命令执行 文件树 请求列表 Cookie 火焰图
CSS 样式 日志输出 断点调试 Headers LocalStorage FPS
盒模型 变量查看 Source Map Payload SessionStorage CPU 占用
Computed 错误追踪 Local Overrides Timing IndexedDB 长任务
Service Worker
8.2 实战检查清单(按工程角色)
前端工程师检查清单
- 能在 30 秒内用 Elements 定位任意元素并查看其 CSS 规则
- 能在 Console 中执行任意 JS 命令验证假设
- 能在 Sources 中设置断点并单步调试
- 能用 Performance 录制并定位长任务
- 能用 Network 排查接口 4xx/5xx 错误
- 能用 Application 检查 Cookie / LocalStorage 状态
爬虫工程师检查清单
- 能在 Network 中用 Fetch/XHR 过滤找到目标 API
- 能从 Network 复制 Cookie / UA / Referer 给 Python requests
- 能用 Application 查看和管理 Cookie
- 能在 Console 中执行
document.cookie提取登录态 - 能识别
navigator.webdriver等反爬指纹 - 能用 Sources 全文搜索定位加密函数
后端工程师检查清单
- 能用 Network 验证接口入参出参
- 能用 Console 中
fetch测试接口可用性 - 能识别 CORS 预检请求(OPTIONS)
- 能用 Network Timing 排查 TTFB 慢的问题
- 能用 Application 检查 Cookie 的 Domain/Path 配置
8.3 CSDN 实战案例汇总
本文档共包含以下 CSDN 实战案例,覆盖六大面板:
| 序号 | 面板 | 实战案例 |
|---|---|---|
| 1 | Elements | 调试 CSDN 文章标题样式,定位 h1.title-article 元素 |
| 2 | Elements | 修复 CSDN 评论框边距错位(Computed 标签) |
| 3 | Console | 提取 CSDN 登录 Cookie(document.cookie) |
| 4 | Console | 验证 CSDN 反爬指纹(navigator.webdriver) |
| 5 | Console | 批量提取 CSDN 文章链接 |
| 6 | Sources | 在 CSDN 推荐列表 JS 中断点跟踪算法 |
| 7 | Sources | 搜索 UserName 定位 CSDN 登录逻辑 |
| 8 | Network | 找到 CSDN 文章列表 API(get-business-list) |
| 9 | Network | 分析 CSDN 首屏加载瀑布图找性能瓶颈 |
| 10 | Application | 查看 CSDN 的 UserName / UserToken Cookie |
| 11 | Application | 清空 Cookie 测试未登录状态下的页面降级 |
| 12 | Performance | 分析 CSDN 文章列表滚动卡顿原因 |
8.4 思考题(巩固理解)
-
场景题: 假设你要写一个 Python 爬虫抓取 CSDN 某博主的所有文章列表,请描述你会用到哪几个面板,分别在每一步做什么?
-
对比题: Cookie、LocalStorage、SessionStorage 三者都可以存数据,为什么登录态通常用 Cookie 而不是 LocalStorage?请从"是否随请求发送"的角度分析。
-
调试题: 你在 CSDN 发布文章后页面跳转,但发现文章没保存成功。你会如何用 Network 面板排查这个问题?需要关注哪些信息?
-
优化题: CSDN 文章页首屏加载需要 5 秒,你会如何用 Performance 面板定位瓶颈?至少说出 3 个可能的优化方向。
-
安全题: 为什么 HttpOnly Cookie 能防 XSS 攻击?请解释攻击者窃取 Cookie 的两种途径(JS 读取 vs 网络嗅探),以及 HttpOnly 各自能防哪种。
-
迁移题: 你在 CSDN 学会了用 Fetch/XHR 过滤找 API。请描述如果换成知乎、GitHub、淘宝,这个流程有什么不同?什么是不变的?
九、延伸阅读
本文档聚焦于 F12 开发者工具的全景概览,让你在 45 分钟内建立对各面板的整体认知。如果你想深入某个特定面板,可以参考:
- Network 面板深度拆解: 涵盖 Headers 的逐字段解读、Query String Parameters 的编码规则、Preview vs Response 的区别、Timing 各阶段的含义------适合需要精确模拟请求、排查接口异常的读者
- Cookie 机制与 Application 面板: 涵盖 Cookie 的 Domain/Path/Expires/SameSite 详细解释、LocalStorage 和 SessionStorage 的使用场景、IndexedDB 入门------适合需要维护登录态、管理多会话的读者
- 请求模拟与数据抓取: 涵盖从 Network 面板复制请求到 Python/curl 脚本的完整流程、Copy as cURL 与 Copy as fetch 的使用、常见 403/401 错误排查------适合需要写爬虫、做自动化数据采集的读者
- 过滤器与断点调试: 涵盖 Network 面板的高级过滤语法、XHR 断点、DOM 断点、Event Listener 断点------适合需要逆向分析复杂网站 JS 逻辑的读者
9.1 官方文档与权威资源
- Chrome DevTools 官方文档: https://developer.chrome.com/docs/devtools/ ------ Google 官方维护,覆盖所有面板的详细说明
- MDN Web Docs - HTTP Cookies: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Cookies ------ Cookie 协议规范的权威解释
- web.dev 性能优化指南: https://web.dev/performance/ ------ Google 出品的 Web 性能优化最佳实践
- Chrome DevTools 命令行 API: https://developer.chrome.com/docs/devtools/console/utilities/ ------ Console 中可用的所有快捷方法(如
copy、$0、$$、monitor等)
9.2 推荐学习路径
入门(本文档)
│
├─→ 进阶 1:Network 面板深度拆解(适合爬虫/后端)
│
├─→ 进阶 2:Cookie 机制与 Application 面板(适合爬虫/运维)
│
├─→ 进阶 3:请求模拟与数据抓取(适合爬虫工程师)
│
└─→ 进阶 4:过滤器与断点调试(适合逆向工程师)
│
└─→ 高级:Lighthouse 性能审计 / Puppeteer 自动化 / CDP 协议
说明: 根据你的项目需求,可以直接跳转到对应的深入文档,不必按顺序阅读。建议先完成本文档的实践操作,再选择最贴合工作场景的进阶方向。
十、小结
F12 开发者工具是所有 Web 工程师的"透视镜"------它把网页背后的 DOM 结构、网络通信、本地存储、运行性能全部可视化呈现。本文以 CSDN 博客为贯穿案例,从"是什么 / 为什么 / 有什么用 / 怎么用"四问框架系统讲解了六大核心面板:
- Elements ------ 调试 HTML/CSS 的骨架与皮肤
- Console ------ 执行 JS 命令的终端
- Sources ------ 查看源码与断点调试的仓库
- Network ------ 监控所有请求的通信记录仪(爬虫核心)
- Application ------ 管理 Cookie/Storage 的本地储物间
- Performance ------ 分析运行时性能的体检报告
核心方法论: 不要记具体网站的 API 名称或 Cookie 字段名,而要记"打开 F12 → 找到对应面板 → 观察数据 → 提取信息"这套通用流程。这个流程对 CSDN 有效,对知乎、GitHub、淘宝同样有效------这是工程化思维与"记住特定技巧"的本质区别。
下一步行动建议:
- 立即打开
https://blog.csdn.net/A1063348628按 F12 实践本文档的所有操作 - 对照"实战检查清单"逐项打勾验证掌握程度
- 选择最贴合你工作场景的进阶文档继续深入学习
本文档为 F12 开发者工具项目系列第 1 篇,独立成文,可在 45 分钟内完成阅读和实践。后续文档将分别深入各个面板的进阶用法,敬请关注。
最后更新:2026-07-13
实践案例基于 Chrome 120+ 版本,不同浏览器版本界面可能略有差异。

