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

时间:2018-02-04 14:15:54

标签: javascript cookies web-scraping headless puppeteer

我需要制作刮刀:

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

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

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

4 个答案:

答案 0 :(得分:24)

在启动操纵p时,可以使用userDataDir选项保存用户数据。这将存储会话和与启动chrome相关的其他内容。

puppeteer.launch({
  userDataDir: "./user_data"
});

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

答案 1 :(得分:16)

在puppeter中,您可以通过page.cookies()访问会话Cookie。

因此,一旦您登录,您就可以使用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')
})

然后,在使用page.goto()之前的下一次迭代中,您可以调用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
  }
}

查看文档:

答案 2 :(得分:7)

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

设置:

const fs = require('fs');
const cookiesPath = "cookies.txt";

读取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')
  }
}

编写cookie:

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

答案 3 :(得分:0)

用于编写Cookies

async function writingCookies() {
const cookieArray = require(C.cookieFile); //C.cookieFile can be replaced by ('./filename.json')
await page.setCookie(...cookieArray);
await page.cookies(C.feedUrl); //C.url can be ('https://example.com')
}

要读取Cookies,为此,您必须在项目中安装jsonfile:npm install jsonfile

async function getCookies() {
const cookiesObject = await page.cookies();
jsonfile.writeFile('linkedinCookies.json', cookiesObject, { spaces: 2 },
  function (err) {
    if (err) {
      console.log('The Cookie file could not be written.', err);
    }
    console.log("Cookie file has been successfully saved in current working Directory : '" + process.cwd() + "'");
  })
}

使用await调用这两个函数,它将对您有用。