如何在Puppeteer的headless:true模式下保留浏览器数据与扩展
我编写了一个Puppeteer脚本,在headless:false模式下搭配Google Chrome配置文件与executablePath参数使用时运行正常,能够保留所有会话及浏览器数据,且脚本对应的浏览器配置文件中的Chrome扩展也可正常工作。
但仅将模式改为headless:true后,脚本无法正常运行:既无法保留浏览器会话数据,也无法识别我的Chrome扩展。
以下是脚本代码:
const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth') puppeteer.use(StealthPlugin()) const browser = await puppeteer.launch({ headless: true, ignoreHTTPSErrors: true, executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', args: [ '--user-data-dir=/Users/x/Library/Application Support/Google/Chrome/Profile 2', '--window-size=1920,1080', "--no-sandbox", //"--disable-setuid-sandbox", "--disable-dev-shm-usage", "--disable-gpu", "--disable-extensions", "--disable-dev-tools", "--disable-infobars", "--ignore-certificate-errors", "--enable-logging", "--v=1", '--disable-setuid-sandbox', '--disable-infobars', '--window-position=0,0', '--ignore-certifcate-errors', '--ignore-certifcate-errors-spki-list', '--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' ] }); const page = await browser.newPage();
请问是否有办法让脚本在headless:true模式下正常运行?还是我必须在VDS机器上一直保持浏览器开启状态?
你不需要一直保持浏览器开启,通过以下调整可以让脚本在无头模式下正常工作:
移除禁用扩展的参数
你的启动参数里包含--disable-extensions,这会直接禁用所有扩展,无论是否为无头模式。把这个参数从args数组中删除,才能让配置文件里的Chrome扩展正常加载。使用Chrome新无头模式
旧版Chrome无头模式(headless:true)在会话数据读取和扩展支持上存在局限,从Chrome 96开始,官方推出了更接近正常浏览器的新无头模式,你可以将headless设为"new",或者在args中添加"--headless=new"。新无头模式会更完整地加载用户数据目录中的会话和扩展,行为和正常浏览器更一致。确认用户数据目录的正确性
确保--user-data-dir的路径准确,且运行脚本的用户对该目录有读写权限。无头模式下如果路径错误或权限不足,会无法读取会话数据,甚至自动创建临时数据目录。清理重复参数
你的args数组里存在重复参数(比如--disable-infobars、--ignore-certificate-errors),虽然不影响功能,但建议清理,避免潜在冲突。
调整后的示例代码:
const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth') puppeteer.use(StealthPlugin()) const browser = await puppeteer.launch({ headless: "new", // 使用新无头模式 ignoreHTTPSErrors: true, executablePath: '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', args: [ '--user-data-dir=/Users/x/Library/Application Support/Google Chrome/Profile 2', '--window-size=1920,1080', "--no-sandbox", "--disable-dev-shm-usage", "--disable-gpu", "--disable-dev-tools", "--disable-infobars", "--ignore-certificate-errors", "--enable-logging", "--v=1", '--disable-setuid-sandbox', '--window-position=0,0', '--ignore-certifcate-errors-spki-list', '--user-agent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36' ] }); const page = await browser.newPage();
内容的提问来源于stack exchange,提问作者blueway

