Как я могу очистить сайты, которые требуют аутентификации, используя 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;
Другие вопросы по тегам