Puppeteer 访问 HTTP 页面报 net::ERR_BLOCKED_BY_CLIENT 怎么解决
【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer
用 Puppeteer 驱动的 Chrome 执行page.goto('http://...')访问一个远程 HTTP 站点时,导航会抛出net::ERR_BLOCKED_BY_CLIENT,而不是正常加载页面。这不是网络故障,也不是 Puppeteer 的 bug:Puppeteer 默认下载的 Chrome for Testing 构建中启用了 Chrome 的HttpsFirstBalancedModeAutoEnable特性,它会对访问 HTTP 站点的导航显示警告页,并让这次导航请求以net::ERR_BLOCKED_BY_CLIENT报错结束(该错误可以被捕获并从警告页恢复)。本地 HTTP 主机不会触发警告,远程主机才可能触发,所以同一个脚本在访问localhost时正常、访问线上 HTTP 地址时报错,是文档明确描述的典型现象。
适用条件
先确认你的环境命中以下条件,这个错误才可能由该特性引起:
- 浏览器是 Puppeteer 默认下载的Chrome for Testing(docs/supported-browsers.md:Puppeteer 自 v20.0.0 起下载并使用 Chrome for Testing,此前版本下载的是 Chromium)。
- 导航目标是HTTP(非 HTTPS)的远程地址。访问本地 HTTP 主机不会触发该警告。
- 使用
channel指定系统安装的普通 Chrome、或用executablePath指定其他浏览器时,是否命中取决于对应 Chrome 是否启用了该特性,需要按实际版本确认。
可以用browser.version()确认当前浏览器。文档给出的返回格式示例为"Chrome/61.0.3153.0"或"HeadlessChrome/61.0.3153.0"(文档示例,实际版本号以运行时输出为准),据此可以对照 支持浏览器版本表 判断当前 Puppeteer 版本对应的 Chrome 构建。
方案一:启动参数禁用该特性(推荐)
官方 troubleshooting 文档 给出的做法是在puppeteer.launch()的args选项中传入--disable-features=HttpsFirstBalancedModeAutoEnable:
const browser = await puppeteer.launch({ args: ['--disable-features=HttpsFirstBalancedModeAutoEnable'], });args是 LaunchOptions 中「Additional command line arguments to pass to the browser instance」的选项,即附加传给浏览器进程(此处为 Chrome)的命令行参数。这个参数会在启动时关闭HttpsFirstBalancedModeAutoEnable特性,之后page.goto('http://...')会按常规导航流程执行,不会再抛出net::ERR_BLOCKED_BY_CLIENT。
方案二:捕获错误并点击警告页按钮
troubleshooting 文档同时说明该错误 "can be caught and recovered from":发生错误时 Chrome 会显示一个带「继续导航」按钮的警告页,这个按钮可以通过 Puppeteer 点击。因此也可以在脚本中捕获page.goto()抛出的错误,再点击警告页上的按钮完成导航。适合不方便改启动参数、或希望保留该特性行为的场景;具体选择器需要针对当前 Chrome 版本的警告页实现自行确认,文档只说明了按钮可被 Puppeteer 点击,未给出选择器示例。
验证方式
- 使用方案一后,重新运行访问 HTTP 页面的脚本:
page.goto('http://...')正常解析、不再抛出net::ERR_BLOCKED_BY_CLIENT,页面按预期加载。 - 如果仍报错,先确认两点:目标是否为远程 HTTP 主机(本地主机本就不应触发);启动代码中是否真的带上了
--disable-features=HttpsFirstBalancedModeAutoEnable参数,且浏览器为 Puppeteer 默认下载的 Chrome for Testing。 - 其他错误码(如
net::ERR_FAILED)属于不同的导航失败原因,参见 Frame.goto() 的异常说明,不要归因到本特性。
边界与后续
- 该问题只与「Chrome for Testing + HTTP 远程导航」组合相关,与代理配置、CSP、请求拦截无关,不要把
net::ERR_BLOCKED_BY_CLIENT与代理/拦截类问题混同排查。 - 关于该特性的上游背景,troubleshooting 文档指向了 Chrome 的 bug 跟踪编号 378022921(外部链接,按官方原文保留);如需跟踪特性变化,以 Chrome 官方渠道为准。
- 完整的浏览器与 Puppeteer 版本对照见 支持浏览器列表,可用于确认当前版本默认下载的是哪个 Chrome for Testing 构建。
【免费下载链接】puppeteerJavaScript API for Chrome and Firefox项目地址: https://gitcode.com/GitHub_Trending/puppeteer1/puppeteer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考