Puppeteer page.cookies()无法获取Chrome开发者工具显示的全部Cookie
我之前也踩过这个坑!你现在只拿到2个Cookie,主要是自动化浏览器和真实Chrome的行为差异,加上Google的Cookie同意机制限制,下面给你一步步解决:
问题根源
- 旧版Headless模式的差异:你用的
headless: true是Chrome的旧版无头模式,它和常规浏览器的Cookie加载策略有不少区别。 - 被识别为自动化工具:Puppeteer默认的User-Agent会被Google检测到,导致部分功能(包括Cookie设置)被限制。
- 未处理Cookie同意弹窗:Google现在强制要求用户同意隐私政策,没点击同意的话,大部分功能性Cookie不会被设置。
- 页面等待不充分:
networkidle2可能不足以等待所有动态加载的Cookie完成配置。
修复后的代码
下面是整合了所有修复点的代码,直接就能用:
const puppeteer = require('puppeteer'); (async () => { // 使用新版Headless模式,行为和真实Chrome几乎一致 const browser = await puppeteer.launch({ headless: 'new', args: [ '--disable-dev-shm-usage', '--no-sandbox', // 可选,解决部分环境的权限问题 '--disable-blink-features=AutomationControlled' // 隐藏自动化标识,避免被反爬检测 ] }); const page = await browser.newPage(); // 设置真实的Chrome User-Agent(可以替换成你自己浏览器的UA) 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'); // 访问Google首页,等待页面完全加载 await page.goto('https://google.com', { waitUntil: 'load' }); // 处理Google的Cookie同意弹窗(英文界面选择器,中文界面可换成`button[aria-label="同意"]`) try { await page.waitForSelector('button#L2AGLb', { timeout: 5000 }); await page.click('button#L2AGLb'); // 点击后等待1秒,确保Cookie完成设置 await page.waitForTimeout(1000); } catch (err) { console.log('未检测到Cookie同意弹窗,跳过此步骤'); } // 获取所有Cookie const cookies = await page.cookies(); console.log(`共获取到${cookies.length}个Cookie:`); console.log(cookies); await browser.close(); })();
关键修改说明
headless: 'new':新版无头模式是Chrome官方推荐的,彻底解决了旧版无头模式和常规浏览器的行为差异问题。- 隐藏自动化标识:
--disable-blink-features=AutomationControlled能让网站无法识别你在用自动化工具,避免Cookie设置被限制。 - 真实User-Agent:模拟真实用户的浏览器标识,进一步降低被拦截的概率。
- 处理同意弹窗:这是核心!只有点击同意按钮,Google才会下发完整的功能Cookie(比如
AEC、SID这类)。 - 优化等待逻辑:
waitUntil: 'load'确保页面资源完全加载,加上弹窗点击后的等待时间,给Cookie设置留足缓冲。
如果还是有部分Cookie没获取到,可能是某些Cookie需要特定交互(比如执行一次搜索操作),你可以在同意弹窗后模拟搜索,再获取Cookie试试。
内容的提问来源于stack exchange,提问作者Pierrick
相关产品推荐
相关产品推荐

