Quiero crear un raspador que:
Mi problema es que cada nueva instancia de navegador sin cabeza borra mi sesión de inicio de sesión, y luego necesito iniciar sesión una y otra vez...
¿Cómo guardarlo a través de instancias? (usando titiritero con cromo sin cabeza)
¿O cómo puedo abrir una instancia sin cabeza de Chrome ya registrada? (si ya he iniciado sesión en mi ventana principal de Chrome)
Hay una opción para guardar los datos del usuario usando la opción userDataDir al iniciar titiritero. Esto almacena la sesión y otras cosas relacionadas con el lanzamiento de Chrome.
puppeteer.launch({ userDataDir: "./user_data" });No entra en gran detalle, pero aquí hay un enlace a los documentos: https://pptr.dev/#?product=Puppeteer&version=v1.6.1&show=api-puppeteerlaunchoptions
En puppeter tienes acceso a las cookies de sesión a través page.cookies() .
Entonces, una vez que inicie sesión, puede obtener cada cookie y guardarla en un archivo json:
const fs = require(fs); const cookiesFilePath = 'cookies.json'; // Save Session Cookies const cookiesObject = await page.cookies() // Write cookies to temp file to be used in other profile pages fs.writeFile(cookiesFilePath, JSON.stringify(cookiesObject), function(err) { if (err) { console.log('The file could not be written.', err) } console.log('Session has been successfully saved') }) Luego, en su próxima iteración, justo antes de usar page.goto() , puede llamar a page.setCookie() para cargar las cookies del archivo una por una:
const previousSession = fs.existsSync(cookiesFilePath) if (previousSession) { // If file exist load the cookies const cookiesString = fs.readFileSync(cookiesFilePath); const parsedCookies = JSON.parse(cookiesString); if (parsedCookies.length !== 0) { for (let cookie of parsedCookies) { await page.setCookie(cookie) } console.log('Session has been loaded in the browser') } }Consulte los documentos:
Para obtener una versión de la solución anterior que realmente funciona y no depende de jsonfile (en lugar de usar el fs más estándar), consulte esto:
Configuración:
const fs = require('fs'); const cookiesPath = "cookies.txt";Leyendo las cookies (ponga este código primero):
// 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') } }Escribiendo las cookies:
// Write Cookies const cookiesObject = await page.cookies() fs.writeFileSync(cookiesPath, JSON.stringify(cookiesObject)); console.log('Session has been saved to ' + cookiesPath);