Как запомнить авторизацию при парсинги сайта на nodejs
Использую nightmare для парсинга сайта, но вся информация отдается только после авторизации
Я захожу на сайт и ищу форму авторизации, если нахожу, то авторизируюсь, если нет, то делаю нужные мне действия
let cookie_ = fs.readFileSync("cookies.json");//Ищу фаил с сохраненными куками
cookie = JSON.parse(cookie_);//Превращаю в json
nightmare
.goto('https://site.ru/login')//Захожу на сайт
.cookies.set(cookie)//Подставляю куки из файла
.evaluate(function () {
return document.querySelector('input[id="email"]');//Ищу поле для ввода почты
})
.then(function (page) {
if(page) {//Проверяю есть ли поле для ввода почты
f().then(function (cookies) {//Получаем результат из функции
require('fs').writeFileSync(//И записываем в фаил
'cookies.json',
JSON.stringify(cookies)
);
})
} else {
console.log('Вы авторизированы');
}
})
async function f() {//Вызываю функцию в случаи если мы не авторизированы
return new Promise((resolve, reject) => {
nightmare
.goto('https://site.ru/login')
.type('input[id="email"]', 'login')//Вводим почту
.type('input[id="password"]', 'passord')//Вводим пароль
.click('.btn.btn-danger')//Нажимаем на кнопку авторизации
.wait(2000)//Ждем 2 секунды
.cookies.get()//Получаем куки
.then(resolve)
});
}
Фаил создается, куки записываются, но при следующих попытках запуска скрипта, все равно появляется форма авторизации
Ответы (1 шт):
Автор решения: nicolaa
→ Ссылка
К сожалению решить данную задачу через nightmare не получилось
Решил с помощью puppeteer
Пример - сохранение кук в фаил
const puppeteer = require('puppeteer')
const fs = require('fs');
(async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
await page.goto('https://github.com/login')
await page.type('#login_field', process.env.GITHUB_USER)
await page.type('#password', process.env.GITHUB_PWD)
await page.waitForSelector('.js-cookie-consent-reject')
await page.click('.js-cookie-consent-reject')
await page.$eval('[name="commit"]', (elem) => elem.click())
await page.waitForNavigation()
const cookies = await page.cookies()
const cookieJson = JSON.stringify(cookies)
fs.writeFileSync('cookies.json', cookieJson)
await browser.close()
})()
Чтение кук из файла
const puppeteer = require('puppeteer')
const fs = require('fs');
(async () => {
const browser = await puppeteer.launch()
const page = await browser.newPage()
const cookies = fs.readFileSync('cookies.json', 'utf8')
const deserializedCookies = JSON.parse(cookies)
await page.setCookie(...deserializedCookies)
await page.goto(`https://github.com/${process.env.GITHUB_USER}`)
await browser.close()
})()