Как я могу очистить сайты, которые требуют аутентификации, используя node.js?
Я встречал много учебных пособий, объясняющих, как очищать публичные веб-сайты, которые не требуют аутентификации / входа, используя node.js.
Может кто-нибудь объяснить, как очистить сайты, требующие входа в систему, используя node.js?
2 ответа
Используйте библиотеку запросов Mikeal, вам нужно включить поддержку файлов cookie следующим образом:
var request = request.defaults({jar: true})
Поэтому сначала вы должны создать имя пользователя на этом сайте (вручную) и передать имя пользователя и пароль в качестве параметров при выполнении запроса POST к этому сайту. После этого сервер ответит файлом cookie, который запомнит запрос, так что вы сможете получить доступ к страницам, требующим входа на этот сайт.
Примечание: этот подход не работает, если на странице входа в систему используется что-то вроде reCaptcha.
Я работаю с NodeJs Scrapers уже более 2 лет
Я могу вам сказать, что лучший выбор при работе с логинами и аутентификацией - НЕ использовать прямой запрос
Это потому, что вы просто тратите время на создание запросов вручную, и это намного медленнее,
Вместо этого используйте высокоуровневый браузер, которым вы управляете через такой API, как Puppeteer или NightmareJs
У меня есть хороший стартер и подробное руководство о том, как начать чистку с Puppeteer, я уверен, что это поможет!
Или используя суперагент:
var superagent = require('superagent')
var agent = superagent.agent();
agent
это постоянный браузер, который будет обрабатывать получение и установку файлов cookie, рефереров и т. д. Просто agent.get
, agent.post()
как обычно.
Вы можете собирать данные с сайтов, требующих аутентификации, таких как токен csrf.
Использование куки для каждого запроса, как это:
var j = request.jar(); // this is to set the jar of request for session and cookie persistence
request = request.defaults({ jar: j }); //here we are setting the default cookies of request
Вот небольшой код для дальнейшей разработки:
var express = require('express');
var bodyParser = require('body-parser');
var querystring = require('querystring');
var request = require('request'); //npm request package to send a get and post request to a url
const cheerio = require('cheerio'); //npm package used for scraping content from third party sites
var cookieParser = require('cookie-parser')
var http = require('http');
var app = express();
app.use(cookieParser());
var _csrf; //variable to store the _csrf value to be used later
app.use(bodyParser.json());
var html = '';
var j = request.jar(); // this is to set the jar of request for session and cookie persistence
request = request.defaults({ jar: j }); //here we are setting the default cookies of request
//___________________API CALL TO VERIFY THE GMS NUMBER_______________________
app.get('/check', function(req, response) {
var schemeId = null;
if (req.query.schemeId) {
schemeId = req.query.schemeId;
console.log(schemeId);
} else {
response.send('false');
response.end();
}
getCsrfValue(function(err, res) {
if (!err) {
_csrf = res;
console.log(_csrf);
request.post({
headers: {
'Authorization': '',
'Content-Type': 'application/x-www-form-urlencoded',
},
uri: 'https://www.xyz.site',
body: "schemeId=" + schemeId + "&_csrf=" + _csrf
}, function(err, res, body) {
if (err) {
console.log(err);
} else {
console.log("body of post: " + res.body);
const $ = cheerio.load(body.toString());
var txt = $('.schemeCheckResult').text();
console.log(txt);
if (txt) {
response.send('true');
} else {
response.send('false');
}
html += body;
}
});
} else {
response.send(err);
}
})
});
//______________FUNCTION TO SCRAPE THE CSRF TOKEN FROM THE SITE____________
function getCsrfValue(callback) {
request.get({
headers: {
'Authorization': '',
'Content-Type': 'application/x-www-form-urlencoded',
},
uri: 'https://www.xyz.site'
}, function(err, res, body) {
if (err) {
return callback(err);
} else {
const $ = cheerio.load(body.toString());
var txt = $('input[name=_csrf]').val();
_csrf = txt;
return callback(null, _csrf);
}
});
}
module.exports = app;