如何在Puppeteer无头模式下模拟有头浏览器行为?
Puppeteer无头模式模拟有头浏览器的解决方案
针对无头模式被网站检测的问题,可以通过以下几种方式伪装成有头浏览器的行为:
启用新版无头模式
Chrome 112+推出的--headless=new模式更接近真实有头浏览器的行为,替代旧版--headless=true能大幅降低被检测概率。启动示例:const browser = await puppeteer.launch({ headless: 'new', args: ['--window-size=1920,1080'] });禁用自动化控制标识
网站常通过navigator.webdriver判断是否为自动化浏览器,可通过启动参数和页面注入脚本清除该标识:const browser = await puppeteer.launch({ args: [ '--disable-blink-features=AutomationControlled', '--no-sandbox' ] }); const page = await browser.newPage(); // 注入脚本覆盖webdriver属性 await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined }); });补充浏览器环境特征
无头模式下部分浏览器对象属性缺失,可手动添加模拟真实环境:await page.evaluateOnNewDocument(() => { // 模拟window.chrome对象 window.chrome = { runtime: {}, app: { isInstalled: false }, webstore: { onInstallStageChanged: {}, onDownloadProgress: {} } }; // 修复plugins数组 Object.defineProperty(navigator, 'plugins', { get: () => [1, 2, 3, 4] }); // 修复languages数组 Object.defineProperty(navigator, 'languages', { get: () => ['zh-CN', 'zh', 'en-US', 'en'] }); });模拟真实用户交互
避免机械性的快速操作,添加随机延迟、鼠标移动、滚动等行为:// 随机延迟 await page.waitForTimeout(Math.random() * 1000 + 500); // 模拟鼠标移动到页面元素 const element = await page.$('selector'); const box = await element.boundingBox(); await page.mouse.move(box.x + box.width / 2, box.y + box.height / 2); // 模拟滚动 await page.evaluate(() => window.scrollTo(0, document.body.scrollHeight));统一User-Agent
确保无头模式使用和有头模式完全一致的User-Agent,可先在有头模式下获取UA,再设置:// 有头模式下获取UA:console.log(navigator.userAgent) const userAgent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'; await page.setUserAgent(userAgent);
内容的提问来源于stack exchange,提问作者Exorcismus
相关产品推荐
相关产品推荐

