You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Puppeteer时能否关闭DevTools状态?遇反检测网站无法访问求解

解决Puppeteer中DevTools检测的问题

当然有办法搞定这个问题!很多网站的DevTools检测并不是只看DevTools是否真的打开,而是通过检查浏览器环境里的特定属性、API行为或者间接特征来判断。下面是几个实用的解决方案,按优先级排序:

1. 在页面加载前注入屏蔽脚本(最关键)

用page.evaluateOnNewDocument()在页面所有脚本执行前注入代码,覆盖那些被用来检测DevTools的属性和方法,从根源上阻止检测脚本拿到相关痕迹:

const browser = await puppeteer.launch({ 
  headless: false, 
  devtools: false 
});
const page = await browser.newPage();

// 注入屏蔽脚本
await page.evaluateOnNewDocument(() => {
  // 覆盖DevTools专属属性,让检测脚本读不到有效内容
  Object.defineProperty(window, 'devtools', { get: () => undefined });
  Object.defineProperty(window, '__devtools_remote_object_id__', { get: () => undefined });
  
  // 拦截可能用于检测的console日志(根据实际场景调整过滤规则)
  const originalLog = console.log;
  console.log = function(...args) {
    if (typeof args[0] === 'string' && args[0].match(/devtools|inspect/i)) {
      return;
    }
    originalLog.apply(this, args);
  };

  // 屏蔽通过元素位置变化检测DevTools的逻辑
  const originalGetRect = Element.prototype.getBoundingClientRect;
  Element.prototype.getBoundingClientRect = function() {
    const rect = originalGetRect.call(this);
    // 确保返回的尺寸不会触发DevTools打开时的位置变化检测
    return { ...rect, width: rect.width, height: rect.height };
  };
});

await page.goto('https://jsbin.com/cecuzeb/edit?js,output');

2. 添加浏览器启动参数彻底禁用DevTools

通过args参数添加Chrome命令行参数,关闭DevTools相关功能,让浏览器环境更接近无DevTools的状态:

const browser = await puppeteer.launch({
  headless: false,
  devtools: false,
  args: [
    '--disable-devtools', // 直接禁用DevTools
    '--disable-features=DevTools', // 关闭DevTools相关特性
    '--no-default-browser-check' // 避免触发浏览器默认检查逻辑
  ]
});

3. 模拟真实浏览器环境

很多检测脚本会结合爬虫特征判断,补充以下设置让你的Puppeteer实例更像正常用户的浏览器:

await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
await page.setViewport({ width: 1920, height: 1080 });
// 明确启用JavaScript和缓存(默认已启用,但明确设置更稳妥)
await page.setJavaScriptEnabled(true);
await page.setCacheEnabled(true);

4. 尝试新的无头模式(可选)

如果你不需要可视化窗口,可以试试Puppeteer v19+引入的headless: 'new'模式,这个模式更接近真实的Chrome无头浏览器,很多检测脚本无法识别:

const browser = await puppeteer.launch({ 
  headless: 'new', 
  devtools: false 
});

这些方法组合使用,基本能绕过大多数网站的DevTools检测。你可以先试试第一种注入脚本的方法,这是解决这类问题的核心手段。

内容的提问来源于stack exchange,提问作者Muhammad Zackky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:18:08