使用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
相关产品推荐
相关产品推荐

