如何通过无头chrome管理登录会话?

Ant*_*tin 23 javascript cookies headless web-scraping puppeteer

我需要刮刀:

打开无头浏览器,转到网址,登录(有蒸汽oauth),填写一些输入,点击2按钮

问题是无头浏览器的每个新实例都清除我的登录会话,然后我需要一次又一次地登录...如何通过实例保存它?例如使用带无头镀铬的木偶操纵者

或者我如何打开已登录的chrome无头实例?如果我已经登录了我的主要Chrome窗口

mea*_*rly 49

userDataDir启动puppeteer时,可以使用选项保存用户数据.这将存储会话以及与启动chrome相关的其他事项.

puppeteer.launch({
  userDataDir: "./user_data"
});
Run Code Online (Sandbox Code Playgroud)

它没有详细介绍,但这里有一个指向它的文档的链接:https://pptr.dev/#?product = Puppeteer&version = v1.6.1&show = api-puppeteerlaunchoptions

  • 我很高兴我向下滚动,谢谢! (5认同)
  • 这是一个更好的解决方案,保留cookie和本地存储 (3认同)
  • 这是与版本无关的 Puppeteer 文档链接,用于启动选项,因为版本更新已删除旧链接:https://pptr.dev/#?product=Puppeteer&show=api-puppeteerlaunchoptions (3认同)
  • 这是保持会话的最简单方法,尽管您最终可能会存储比您需要的更多的数据。只需使用此配置启动浏览器即可创建一个包含 ~3mb 数据的文件夹。如果存储是一个问题,您可能需要考虑@Ecovirtual 解决方案。否则,这是完美的。 (2认同)

Ram*_*iro 23

在puppeter中,您可以访问会话cookie page.cookies()

因此,一旦您登录,您可以使用jsonfile获取每个cookie并将其保存在json文件中:

// Save Session Cookies
const cookiesObject = await page.cookies()
// Write cookies to temp file to be used in other profile pages
jsonfile.writeFile(cookiesFilePath, cookiesObject, { spaces: 2 },
 function(err) { 
  if (err) {
  console.log('The file could not be written.', err)
  }
  console.log('Session has been successfully saved')
})
Run Code Online (Sandbox Code Playgroud)

然后在下一次迭代之前,在page.goto()用于加载URL 之前,您可以用来page.setCookie()逐个加载文件中的cookie:

const previousSession = fileExistSync(cookiesFilePath)
if (previousSession) {
  // If file exist load the cookies
  const cookiesArr = require(`.${cookiesFilePath}`)
  if (cookiesArr.length !== 0) {
    for (let cookie of cookiesArr) {
      await page.setCookie(cookie)
    }
    console.log('Session has been loaded in the browser')
    return true
  }
}
Run Code Online (Sandbox Code Playgroud)

查看文档:

  • fileExistSync 不是一个有效的函数......需要使用:/sf/ask/313788051/ (2认同)

Dan*_*ous 13

对于上述解决方案的一个实际可行且不依赖jsonfile(而不是使用更标准的fs)的版本,请查看以下内容:

设定:

const fs = require('fs');
const cookiesPath = "cookies.txt";
Run Code Online (Sandbox Code Playgroud)

读取cookie(首先输入此代码):

// If the cookies file exists, read the cookies.
const previousSession = fs.existsSync(cookiesPath)
if (previousSession) {
  const content = fs.readFileSync(cookiesPath);
  const cookiesArr = JSON.parse(content);
  if (cookiesArr.length !== 0) {
    for (let cookie of cookiesArr) {
      await page.setCookie(cookie)
    }
    console.log('Session has been loaded in the browser')
  }
}
Run Code Online (Sandbox Code Playgroud)

编写cookie:

// Write Cookies
const cookiesObject = await page.cookies()
fs.writeFileSync(cookiesPath, JSON.stringify(cookiesObject));
console.log('Session has been saved to ' + cookiesPath);
Run Code Online (Sandbox Code Playgroud)