web-dev-qa-db-ja.com

node.jsを使用して認証が必要なサイトをスクレイピングするにはどうすればよいですか?

Node.jsを使用して、多数の 認証/ログインを必要としない公開Webサイトをスクレイピングする方法を説明するチュートリアル に遭遇しました。

Node.jsを使用してログインが必要なサイトをスクレイピングする方法を誰かが説明できますか?

21
ekanna

Mikeal's Request ライブラリを使用します。次のようにCookieサポートを有効にする必要があります。

var request = request.defaults({jar: true})

したがって、まずそのサイトで(手動で)ユーザー名を作成し、POSTリクエストをそのサイトに要求するときに、ユーザー名とパスワードをparamsとして渡します。その後、サーバーはCookieで応答します。リクエストは記憶されるので、そのサイトにログインする必要があるページにアクセスできます。

注:この方法は、ログインページでreCaptchaなどが使用されている場合は機能しません。

24
alessioalex

または superagent を使用:

_var superagent = require('superagent')
var agent = superagent.agent();
_

agent永続的なブラウザー であり、Cookieやリファラーなどの取得と設定を処理します。通常どおり_agent.get_、agent.post()だけを処理します。

9
mikemaccana

私は2年以上NodeJsスクレーパーを使用してきました

ログインと認証を処理する際の最良の選択は、直接リクエストを使用しないことです。

これは、手動リクエストの作成に時間を費やしているだけで、処理速度が非常に遅いためです。

代わりに、 Puppeteer または NightmareJs のようなAPIを介して制御する高レベルのブラウザを使用してください。

私は Puppeteerでスクレイピングを開始する方法 についての良いスターターと詳細ガイドを持っています、それが役立つと確信しています!

6
Fabian

認証が必要なサイトからデータをスクレイピングcsrf tokenのようにできます。

次のように、リクエストごとにcookiesを使用します。

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;
2
Usman Yousaf