Reputation: 13735
I had to request the same webpage twice to get the cookies in the 1st request and use it in the 2nd request in the following example.
Could anybody show me the code to save the cookies in one puppeteer session and load it in another session so that there is no need to request the same webpage twice in the 2nd session? Thanks.
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();
})();
Upvotes: 53
Views: 78233
Reputation: 69
You can follow this code example below:
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();
})();
Upvotes: 6
Reputation: 3564
In 2024 with version 22.6.3 method described by Thomas using await page.cookies()
and await page.setCookie(...cookies);
is not working for me. Specifically setCookie is not setting them
I was able to fix it using CDP session.
Dumping:
const session = await page.target().createCDPSession();
const resp = await session.send('Network.getAllCookies');
await session.detach();
await fs.writeFile(`${SCRIPTDIR}/storage/cookies.json`,
JSON.stringify(resp.cookies, null, 2));
Restore:
const session = await page.target().createCDPSession();
const parsed = JSON.parse(cookiesString);
await session.send('Network.setCookies', {
cookies: parsed,
});
await session.detach();
Upvotes: 3
Reputation: 25280
To save the cookies, you can use the function page.cookies
. To reuse the cookies, you can use the page.setCookies
function.
Save cookies to disk
const fs = require('fs').promises;
// ... puppeteer code
const cookies = await page.cookies();
await fs.writeFile('./cookies.json', JSON.stringify(cookies, null, 2));
This will read the cookies for the current URL and save them to disk via JSON.stringify
and fs.writeFile
.
Reuse cookies
const fs = require('fs').promises;
// ... puppeteer code
const cookiesString = await fs.readFile('./cookies.json');
const cookies = JSON.parse(cookiesString);
await page.setCookie(...cookies);
To reuse the cookies, read the files from the disk via fs.readFile
. Then parse the file content via JSON.parse
. After that you have to call the page.setCookie
function. As the function expects the cookies as arguments (and not as one array argument with cookies), we rely on the spread operator, which allows to call the setCookie
function with the given cookies
array as individual arguments.
Upvotes: 81