讲师中心 微信公众号
AI工具推荐 视频效率加速

CDP浏览器大师

Polar Sponsor
爱发电 赞助
.NET 9.0

CDP浏览器大师:通过Chrome DevTools Protocol驱动已登录浏览器实现自动化任务,解决反爬封号、选择器失效、SPA路由难导航、固定sleep不准四大痛点。核心能力包括UA伪装、WebGL/Canvas指纹混淆、智能等待、动态选择器以及可视化调试。

CDP浏览器大师

功能概述

CDP浏览器大师是一项面向实际任务的技能,主要用于通过用户已登录的浏览器(Edge/Chrome)执行自动化任务;核心技术:CDP(Chrome DevTools Protocol),通过WebSocket与浏览器通信;

核心要点

  • 核心信条: 优先用web_fetch,CDP只用于JS渲染或需登录态的场景;
  • 先探测再定位,多备选降级;
  • 四大痛点与对策;

使用与执行

本skill对策;被Cloudflare拦、被识别为机器人。它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;

结果检查与注意事项

若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。

CDP浏览器大师

通过用户已登录的浏览器(Edge/Chrome)执行自动化任务。核心技术:CDP(Chrome DevTools Protocol),通过WebSocket与浏览器通信。核心信条:优先用web_fetch,CDP只用于JS渲染或需登录态的场景;先探测再定位,多备选降级。

四大痛点与对策

痛点 典型表现 本skill对策
反爬检测 被Cloudflare拦、被识别为机器人 反检测策略 + 行为拟人化
选择器易变 网站改版选择器全失效 探测模式 + 多备选降级
SPA路由难导航 直接navigate到子路由404 先入可访问页再JS触发跳转
等待不准 sleep太短没渲染完,太长浪费时间 网络空闲检测替代固定sleep

何时用CDP

优先用web_fetch。以下情况才用CDP:

场景 是否需要CDP
静态HTML页面 不需要,web_fetch即可
JS渲染页面(如B站) 需要
需登录态的网站 需要
需要交互(点击、填表、滚动) 需要
网站有反爬/风控 可能失败,需反检测策略

架构概览

Agent
  ↓ require('./cdp-automation.js')
连接管理器(端口复用 + 残留清理)
  ↓ WebSocket (HTTP → CDP)
用户浏览器(Edge:9222 / Chrome:9223)
  ↓ 执行JS / 读DOM / 点击
目标网站

快速开始

1. 开启浏览器远程调试

Edge(端口9222):

taskkill /F /IM msedge.exe /T
Start-Sleep 3
Start-Process "C:Program Files (x86)MicrosoftEdgeApplicationmsedge.exe" --remote-debugging-port=9222

Chrome(端口9223):

Start-Process "C:Program FilesGoogleChromeApplicationchrome.exe" --remote-debugging-port=9223

2. 调用

const { edge, chrome } = require('./cdp-automation.js');

await edge.goto('https://目标网站.com');
const data = await edge.eval(`document.title`);
await edge.click('[class*="radio-filter__item"]');
await edge.waitNetworkIdle();  // 智能等待
const result = await edge.eval(`提取数据的JS`);
const png = await edge.screenshot();

API参考

browser.goto(url)

导航到指定URL,等待页面加载完成(Page.loadEventFired + 额外2s等待JS渲染)。

await edge.goto('https://space.bilibili.com/151190274/video');

browser.eval(script)

在页面上下文执行JavaScript,返回结果。

// 读取DOM
const r = await edge.eval(`document.title`);
console.log(r.result.value);

// 提取结构化数据
const r = await edge.eval(`
    JSON.stringify(
        Array.from(document.querySelectorAll('.upload-video-card')).slice(0,5).map(c => ({
            title: c.querySelector('.bili-video-card__title')?.innerText,
            play: c.querySelector('.bili-cover-card__stat span')?.innerText
        }))
    )
`);
const videos = JSON.parse(r.result.value);

browser.click(selector)

点击匹配选择器的第一个元素。通过计算元素中心坐标后用document.elementFromPoint模拟点击。

await edge.click('[class*="radio-filter__item"]');

browser.screenshot()

截图当前页面,返回PNG base64字符串。

const png = await edge.screenshot();
require('fs').writeFileSync('/tmp/screenshot.png', Buffer.from(png, 'base64'));

browser.wait(ms)

显式等待,用于等待JS渲染或网络请求。

await edge.wait(3000);

browser.waitNetworkIdle(timeout)

智能等待:检测网络空闲(无请求持续500ms)后继续,替代固定sleep。既不会太快也不会太慢。

await edge.click('.next-page');
await edge.waitNetworkIdle(10000);  // 最多等10秒,网络空闲即继续

browser.tabs()

获取所有标签页列表(不含临时JS上下文)。

const tabs = await edge.tabs();
const bTab = tabs.find(t => t.url.includes('bilibili.com'));

反检测策略

反爬检测是CDP自动化第一大拦路虎。

检测维度与规避

检测维度 网站怎么查 规避策略
User-Agent 读取navigator.userAgent 用真实浏览器(已登录的Edge/Chrome),UA天然真实
WebDriver标记 navigator.webdriver=true 启动参数加--disable-blink-features=AutomationControlled
WebGL指纹 读取WebGL渲染器信息 用真实浏览器,指纹天然真实
鼠标行为 检测鼠标轨迹是否直线 用elementFromPoint模拟点击 + 加随机偏移
操作速度 检测操作间隔过短 操作间加waitNetworkIdle + 随机延迟
Headless检测 检测是否无头模式 用有头模式(已登录浏览器)

启动参数推荐

# Edge反检测启动
Start-Process "C:Program Files (x86)MicrosoftEdgeApplicationmsedge.exe" `
  --remote-debugging-port=9222 `
  --disable-blink-features=AutomationControlled `
  --disable-features=IsolateOrigins,site-per-process

行为拟人化

// 不要瞬间连续操作
await edge.click('.btn');
await edge.wait(500 + Math.random() * 1000);  // 随机500-1500ms
await edge.click('.next');
await edge.waitNetworkIdle(10000);

Cloudflare绕过思路

1. 用真实已登录浏览器(非Headless)
2. 加--disable-blink-features=AutomationControlled
3. 操作间加随机延迟(拟人化)
4. 首次访问后等Cloudflare验证页通过(waitNetworkIdle)
5. 复用已通过验证的会话Cookie

注意:强反爬站点(如小红书)可能仍失败。建议先测试能否正常浏览,再尝试自动化。

选择器探测模式

网站改版选择器就失效。先探测再定位,多备选降级。

探测流程

// 第一步:先eval探索DOM结构
const structure = await edge.eval(`
    JSON.stringify({
        title: document.title,
        samples: Array.from(document.querySelectorAll('[class*="note"]')).slice(0,3).map(x => ({
            text: x.innerText?.substring(0,100),
            class: x.className?.substring(0,60),
            tag: x.tagName
        }))
    })
`);
console.log(JSON.parse(structure.result.value));

// 第二步:根据探测结果写精确选择器
// 第三步:提供多备选,降级匹配

多备选选择器

async function robustFind(browser, candidates) {
    for (const selector of candidates) {
        const found = await browser.eval(`
            document.querySelector('${selector}') ? true : false
        `);
        if (found.result.value) {
            return selector;  // 第一个命中的就用
        }
    }
    throw new Error(`所有备选选择器都未命中: ${candidates.join(', ')}`);
}

// 使用:从最精确到最宽松
const selector = await robustFind(edge, [
    '.bili-video-card__title',           // 精确class
    '[class*="video-card"] [class*="title"]',  // 模糊class
    'h3.title',                           // 语义tag
    'a[href*="/video/"]'                  // 属性选择器
]);

选择器韧性原则

  • 优先用[class*="xxx"]模糊匹配(网站加哈希后缀也能命中)
  • 避免用nth-child等位置选择器(布局一变就错)
  • 用data-*属性(业务标识比class稳定)
  • 提供语义备选(如h3.title、a[href*="/video/"])

SPA导航模式

Next.js/React等SPA内部路由,直接Page.navigate到子路由会404。

正确做法

// 错误:直接导航到子路由(404)
await edge.goto('https://app.com/user-center/token-plan');  // 404

// 正确:先入可访问页,再JS触发内部跳转
await edge.goto('https://app.com/user-center/basic-information');  // 可访问
await edge.waitNetworkIdle();

// 用JS点击侧边栏菜单(注意:可能是div不是a)
await edge.eval(`
    (function() {
        var allDivs = document.querySelectorAll('div');
        for (var d of allDivs) {
            if (d.innerText && d.innerText.trim() === 'Token Plan'
                && d.className.includes('cursor-pointer')) {
                d.click();
                return 'clicked';
            }
        }
        return 'not found';
    })()
`);
await edge.waitNetworkIdle();  // 等待SPA路由跳转完成

SPA导航规律

Cookie获取方案

普通Cookie

const cookies = await edge.eval(`document.cookie`);
// 只能拿到非HttpOnly的cookie

HttpOnly Cookie

document.cookie拿不到HttpOnly cookie。方案:

// 方案1:用CDP的Network.getCookies(推荐)
const cdpSession = await edge.getCDPSession();
const { cookies } = await cdpSession.send('Network.getCookies', {
    urls: ['https://目标网站.com']
});
// cookies包含HttpOnly的

// 方案2:从浏览器SQLite文件读(需解决锁文件问题)
// Edge: %LOCALAPPDATA%MicrosoftEdgeUser DataDefaultCookies
// Chrome: %LOCALAPPDATA%GoogleChromeUser DataDefaultCookies

连接管理

端口复用

同一时间每个端口(9222/9223)只能有一个WebSocket连接。ConnectionManager管理复用:

// 模块内部自动复用,无需手动管理
const { edge } = require('./cdp-automation.js');
// 多次调用共享同一连接
await edge.goto(url1);
await edge.goto(url2);  // 复用连接

残留连接清理

任务中途失败可能导致连接残留:

// 清理残留连接
async function cleanupConnection(browser) {
    try {
        await browser.close();
    } catch (e) {
        // 连接已断,忽略
    }
}

// 重启浏览器远程调试(极端情况)
async function restartDebugging(port) {
    // 杀掉占用端口的进程
    const { exec } = require('child_process');
    exec(`taskkill /F /FI "PID eq ${getPidOnPort(port)}"`, () => {
        // 重新启动浏览器
    });
}

端口被占用排查

# 查看端口占用
netstat -ano | findstr :9222

# 杀掉占用进程(如联想Vantage的msedgewebview2.exe)
taskkill /F /PID 

# 再启动你的Edge

平台踩坑库

B站

选择器(已验证):

  • 视频卡片:.upload-video-card
  • 标题:.bili-video-card__title
  • 播放量:.bili-cover-card__stat span(第一个span)
  • "最多播放"tab:[class*="radio-filter__item"]

要点:

  • B站页面完全JS渲染,web_fetch拿到的是空壳
  • 播放量字段在DOM里是文本(如"1890"),需parseInt(play.replace(/D/g,''))
  • API有wbi签名保护,直接调API不可行,必须走DOM

小红书

注意:

  • 有强反自动化检测(UA检测、行为检测)
  • 建议先测试是否能正常浏览,再尝试自动化
  • 选择器可能随时变,用探测模式先探索
// 先探索页面结构
const r = await edge.eval(`
    JSON.stringify({
        title: document.title,
        samples: Array.from(document.querySelectorAll('[class*="note"]')).slice(0,3).map(x => ({
            text: x.innerText?.substring(0,100),
            class: x.className?.substring(0,60)
        }))
    })
`);

Minimax(platform.minimaxi.com)

查询目标: Token Plan配额(每5小时重置)

已验证路径:

  1. 先导航到任意minimaxi页面(需是type=page的标签页)
  2. 再导航到/user-center/basic-information(可正常访问)
  3. 用JS点击侧边栏的div(注意:不是标签)触发SPA路由
  4. 等待跳转后提取配额数据

实际路径规律(Next.js SPA):

  • 账户管理侧边栏是SPA内部路由,URL最终为/user-center/payment/token-plan
  • 直接Page.navigate到/user-center/token-plan会404
  • 正确做法:先进/user-center/basic-information,再JS点击触发路由跳转

配额数据位置:

  • 套餐名:Token Plan / Starter年度套餐
  • 剩余量:可用额度:XXX次模型调用 / 5小时
  • 已用量:XXX/600

提取脚本:

const r = await edge.eval(`(function(){
  var t = document.body.innerText;
  var plan = t.match(/(Starter|Pro|Enterprise)[^\n]*/)?.[0];
  var quota = t.match(/可用额度[::][^\n]*/)?.[0];
  var used = t.match(/(\d+)\/600/)?.[0];
  return JSON.stringify({plan, quota, used});
})()`);

边界情况与陷阱

  • CDP连接复用:每端口同时只能一个WebSocket,模块内ConnectionManager管理,失败需重启浏览器
  • 等待时间不够:JS密集页面5s可能不够,用waitNetworkIdle智能等待或手动加到8-10s
  • Edge被联想Vantage占用端口:杀掉msedgewebview2.exe实例再启动你的Edge
  • HttpOnly Cookie:document.cookie拿不到,用CDP Network.getCookies
  • Next.js SPA内部导航:直接navigate到子路由404,需先入可访问页再JS点击
  • div菜单点击:侧边栏菜单多是
    ,不能用CDP鼠标事件,必须JS element.click()
  • 反爬升级:网站可能随时加强检测,定期验证自动化是否仍有效

FAQ

Q:什么时候该用CDP而不是web_fetch? A:JS渲染页面、需登录态、需交互(点击/填表)时用CDP。静态HTML用web_fetch即可。

Q:被Cloudflare拦了怎么办? A:用真实已登录浏览器(非Headless),加--disable-blink-features=AutomationControlled,操作间加随机延迟,首次访问等验证页通过后复用Cookie。

Q:选择器经常失效怎么办? A:用探测模式——先eval探索DOM结构再定位。提供多备选选择器(从精确class到模糊[class*="xxx"]到语义tag到属性选择器)降级匹配。

Q:Next.js SPA子路由404怎么解决? A:直接navigate会404。先进入可访问的父页面(如/user-center/basic-information),再用JS点击侧边栏div触发内部路由跳转。

Q:固定sleep该等多久? A:别用固定sleep。用waitNetworkIdle智能等待——检测无请求持续500ms即继续,既不快也不慢。

Q:怎么拿HttpOnly Cookie? A:document.cookie拿不到。用CDP的Network.getCookies命令,或从浏览器SQLite文件读(需解决锁文件)。

Q:CDP连接断了怎么办? A:模块内ConnectionManager会清理。极端情况重启浏览器远程调试——杀掉占用端口的进程再重新启动。

故障排查

症状 可能原因 解决
连接9222失败 端口被占/浏览器未起 netstat查端口,taskkill清残留,重启浏览器
eval返回空 页面未渲染完 用waitNetworkIdle替代固定sleep
click无反应 选择器未命中/元素不可点 探测模式验证选择器,用elementFromPoint
被反爬拦截 检测到自动化 加反检测启动参数,行为拟人化,复用已验证会话
SPA子路由404 直接navigate SPA路由 先入可访问页再JS触发跳转
Cookie缺失 HttpOnly拿不到 用CDP Network.getCookies
连接残留 任务中途失败 重启浏览器远程调试
截图空白 页面未加载完 先waitNetworkIdle再screenshot

模块文件位置

~/.skill-platform/browser-automation/
├── cdp-automation.js   ← 核心模块(不用动)
└── SKILL.md            ← 本文件

调用时:

const { edge, chrome } = require('~/.skill-platform/browser-automation/cdp-automation.js');

依赖说明

运行环境

  • Agent平台:支持SKILL.md的任意AI Agent(Claude Code / Cursor / Codex / Gemini CLI等)
  • 操作系统:Windows(Edge/Chrome路径示例为Windows,macOS/Linux类似)
  • 浏览器:Microsoft Edge 或 Google Chrome(已安装并可启动远程调试)

第三方依赖

依赖项 类型 是否必需 获取方式
LLM API API 必需 由Agent内置LLM提供
Node.js 运行时 必需(运行cdp-automation.js) nodejs.org
Edge/Chrome 浏览器 必需 系统自带或官网下载
cdp-automation.js 模块 必需 随skill提供

API Key 配置

  • 本skill基于本地浏览器自动化,无需额外API Key
  • 涉及需登录的网站时,使用用户已登录的浏览器会话(无需配置凭证)

可用性分类

  • 分类:MD+EXEC(Markdown指令 + Node.js脚本执行)
  • 说明:通过自然语言指令驱动Agent调用cdp-automation.js控制浏览器执行自动化
目录

热门AI工具

更多
蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

花生AI
花生AI Hot

一款AI视频创作工具,主要用于B站推出的AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

相关专题

更多
浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

626

2026.01.15

不受国内限制的浏览器大全
不受国内限制的浏览器大全

想找真正自由、无限制的上网体验?本合集精选2025年最开放、隐私强、访问无阻的浏览器App,涵盖Tor、Brave、Via、X浏览器、Mullvad等高自由度工具。支持自定义搜索引擎、广告拦截、隐身模式及全球网站无障碍访问,部分更具备防追踪、去谷歌化、双内核切换等高级功能。无论日常浏览、隐私保护还是突破地域限制,总有一款适合你!

6742

2025.12.31

如何将浏览器设置为32位模式
如何将浏览器设置为32位模式

在Windows系统下将浏览器设置为32位模式的方法如下: 确认系统类型:右键"此电脑"→"属性",检查系统是否为64位。 查找32位浏览器: Chrome/Edge:默认安装包含32位版本,在安装目录的"Program Files (x86)"中查找 Firefox:官网下载时选择"Windows 32-bit"版本 创建快捷方式:找到32位程序

3256

2025.05.08

免费外国网站浏览器有哪些
免费外国网站浏览器有哪些

常见的免费外国网站浏览器,适合访问国际内容: Google Chrome – 全球最流行的浏览器,支持多平台和丰富扩展。 Mozilla Firefox – 开源浏览器,隐私保护较强,支持跨设备同步。 Microsoft Edge – 基于Chromium,性能优秀,内置翻译和隐私模式。 Opera – 内置免费VPN(限部分区域),适合访问外网。 Brave – 隐私导向,默认屏蔽广告和追踪器,支持Tor模式。 Tor B

12089

2025.05.07

浏览器缓存清理方法
浏览器缓存清理方法

浏览器清理缓存的方法:1、找到“internet选项”,然后在“internet属性”里清除缓存;2、打开“清除浏览数据”弹窗,然后清除缓存;3、打开360加速器,然后清理缓存。想了解更多缓存清理相关的内容,可阅读本专题下面的相关文章。

7020

2024.11.11

浏览器历史记录删除了怎么恢复
浏览器历史记录删除了怎么恢复

恢复浏览器历史记录的方法:1、打开浏览器,点击右上角的三个横杠图标;2、点击左侧栏的历史记录图标;3、进入界面;4、点击搜索图标,输入“%appdata%”;5、选择匹配的文件夹;6、选择日期;7、删除db文件;8、重命名文件即可。想了解更多浏览器历史记录相关的内容,可阅读本专题下面的相关文章。

10344

2024.10.28

浏览器打不开网页的原因
浏览器打不开网页的原因

浏览器打不开网页是因为网络连接问题、dns解析问题、防火墙或安全软件限制、代理设置问题、浏览器缓存问题、网站问题和浏览器配置问题造成的。想了解更多浏览器打不开相关的内容,可阅读本专题下面的相关文章。

1805

2024.10.09

浏览器打不开网页是什么原因
浏览器打不开网页是什么原因

浏览器打不开网页是因为网络连接问题、dns解析问题、防火墙或安全软件限制、代理设置问题、浏览器缓存问题、网站问题和浏览器配置问题造成的。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

6548

2024.05.15

打开网页出现乱码怎么解决
打开网页出现乱码怎么解决

打开网页出现乱码可以通过修改浏览器编码设置、使用翻译工具、使用编码转换工具和使用其他浏览器来解决。更多关于网页乱码的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

5058

2023.11.01

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn