如何保存 cookie 并将其加载到另一个 puppeteer 会话中?

use*_*739 24 cookies puppeteer

我必须两次请求相同的网页才能在第一个请求中获取 cookie,并在以下示例的第二个请求中使用它。

有人能告诉我在一个 puppeteer 会话中保存 cookie 并在另一个会话中加载它的代码,这样就不需要在第二个会话中两次请求相同的网页吗?谢谢。

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.genecards.org/cgi-bin/carddisp.pl?gene=BSCL2');
    await page.goto('https://www.genecards.org/cgi-bin/carddisp.pl?gene=BSCL2');

    const linkHandlers = await page.$x("//div[@id='enhancers']//a[@data-track-event='Table See-All']");

    if (linkHandlers.length > 0) {
        const [response] = await Promise.all([
            page.waitForResponse(response => response.url().includes('/gene/api/data/Enhancers')),
            linkHandlers[0].click()
        ]);
        const resp_text = await response.text();
        console.log(resp_text);
    } else {
        throw new Error("Link not found");
    }
    await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

Tho*_*orf 38

要保存 cookie,您可以使用功能page.cookies要重复使用 cookie,您可以使用该page.setCookies功能。

将 cookie 保存到磁盘

const fs = require('fs').promises;

// ... puppeteer code
const cookies = await page.cookies();
await fs.writeFile('./cookies.json', JSON.stringify(cookies, null, 2));
Run Code Online (Sandbox Code Playgroud)

这将读取当前 URL 的 cookie 并通过JSON.stringify和将它们保存到磁盘fs.writeFile

重复使用 cookie

const fs = require('fs').promises;

// ... puppeteer code
const cookiesString = await fs.readFile('./cookies.json');
const cookies = JSON.parse(cookiesString);
await page.setCookie(...cookies);
Run Code Online (Sandbox Code Playgroud)

要重复使用 cookie,请通过fs.readFile. 然后通过JSON.parse. 之后,您必须调用该page.setCookie函数。由于该函数将 cookie 作为参数(而不是作为 cookie 的一个数组参数),因此我们依赖扩展运算符,它允许setCookie使用给定的cookies数组作为单个参数调用该函数。

  • 这不会保存或恢复 HttpOnly cookie,因此它不是保持会话等的完整解决方案。 (3认同)
  • 这个例子完全有效,确认。它保存 httpOnly cookie。谢谢。 (2认同)

小智 6

您可以按照下面的代码示例进行操作:

const puppeteer = require('puppeteer');
const fs = require('fs').promises; //for working with files

//save cookie function
const saveCookie = async (page) => {
    const cookies = await page.cookies();
    const cookieJson = JSON.stringify(cookies, null, 2);
    await fs.writeFile('cookies.json', cookieJson);
}

//load cookie function
const loadCookie = async (page) => {
    const cookieJson = await fs.readFile('cookies.json');
    const cookies = JSON.parse(cookieJson);
    await page.setCookie(...cookies);
}

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await loadCookie(page); //load cookie
  await page.goto('https://example.com');
  await saveCookie(page); //save cookie
  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)