如何永久保存网站会话并在Puppeteer爬虫中复用
完全可以通过手动登录后保存Cookie的方式维持登录状态,下面给你一套可行的Puppeteer实现方案,解决你之前会话丢失、无头模式失效的问题:
一、手动登录并保存Cookie到本地
先启动有头浏览器完成手动登录,然后将登录后的Cookie导出到本地文件:
const puppeteer = require('puppeteer'); const fs = require('fs').promises; (async () => { // 启动有头浏览器,方便手动登录 const browser = await puppeteer.launch({ headless: false }); const page = await browser.newPage(); await page.goto('你的目标网站登录页URL'); // 暂停执行,等待你手动完成登录操作 console.log('请在浏览器中完成登录,登录后按任意键继续...'); process.stdin.once('data', async () => { // 获取当前页面的所有Cookie const cookies = await page.cookies(); // 将Cookie保存到本地JSON文件 await fs.writeFile('./cookies.json', JSON.stringify(cookies, null, 2)); console.log('Cookie已保存,关闭浏览器即可'); await browser.close(); }); })();
运行这段代码,会弹出浏览器,你手动登录目标网站,登录完成后在终端按任意键,Cookie就会被保存到cookies.json文件里。
二、加载Cookie实现自动登录
每次启动爬虫时,先加载本地保存的Cookie,再访问目标网站即可维持登录状态,无头模式也能正常运行:
const puppeteer = require('puppeteer'); const fs = require('fs').promises; (async () => { // 启动无头浏览器,添加必要参数避免被检测 const browser = await puppeteer.launch({ headless: 'new', // 新版无头模式,更接近真实浏览器 args: [ '--no-sandbox', '--disable-setuid-sandbox', '--disable-blink-features=AutomationControlled' // 避免被网站检测到自动化工具 ] }); const page = await browser.newPage(); // 先加载保存的Cookie const cookiesString = await fs.readFile('./cookies.json'); const cookies = JSON.parse(cookiesString); // 设置Cookie到当前页面 await page.setCookie(...cookies); // 访问目标网站的登录后页面,此时应该已经处于登录状态 await page.goto('你的目标网站登录后页面URL'); // 这里执行你的每日任务,比如点击按钮、获取数据等 console.log('已自动登录,开始执行任务...'); // 示例:获取页面标题 const pageTitle = await page.title(); console.log('当前页面标题:', pageTitle); // 任务完成后关闭浏览器 await browser.close(); })();
三、解决无头模式被检测的问题
有些网站会检测无头浏览器,你可以通过以下方式优化:
- 设置真实的User-Agent:在
page.setUserAgent()里传入常用浏览器的UA字符串,比如Chrome的UA - 禁用自动化特征:除了上面的
--disable-blink-features=AutomationControlled,还可以在页面加载前执行:await page.evaluateOnNewDocument(() => { Object.defineProperty(navigator, 'webdriver', { get: () => undefined, }); }); - 模拟真实操作:比如添加随机延迟、模拟鼠标移动等,避免操作过于机械
四、其他可选方案
如果觉得Puppeteer配置麻烦,可以试试Playwright(微软出品的浏览器自动化工具),它的Cookie保存和加载更简洁,且对无头模式的兼容性更好:
- 保存Cookie:
await context.storageState({ path: 'storageState.json' }) - 加载Cookie:
await browser.newContext({ storageState: 'storageState.json' })
另外,如果目标网站的接口没有复杂的加密,也可以直接用axios或fetch带上保存的Cookie发送请求,但这种方式只适合静态接口,动态渲染的页面还是得用浏览器自动化工具。
注意事项
- Cookie有有效期,有些网站的Cookie会定期过期,你需要定期重新保存最新的Cookie
- 部署到服务器时,首次可以在本地生成Cookie文件后上传到服务器,或者用VNC连接服务器启动有头浏览器完成手动登录
- 不要频繁执行任务,避免被网站封禁IP
内容的提问来源于stack exchange,提问作者martiorio
相关产品推荐
相关产品推荐

