如何使用node.js刮取需要身份验证的网站?

时间:2012-01-04 11:28:15

标签: javascript node.js authentication web-scraping

我使用node.js遇到了很多tutorials explaining how to scrape public websites that don't require authentication/login

有人可以解释如何使用node.js抓取需要登录的网站吗?

4 个答案:

答案 0 :(得分:25)

使用Mikeal's Request库,您需要启用以下Cookie支持:

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

因此,您首先应该在该站点上创建一个用户名(手动),并在向该站点发出POST请求时将用户名和密码作为params传递。之后,服务器将使用请求记住的cookie进行响应,这样您就可以访问要求您登录该站点的页面。

注意:如果在登录页面上使用了类似reCaptcha的内容,则此方法不起作用。

答案 1 :(得分:8)

或使用superagent

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

agent然后是persistent browser,它将处理获取和设置Cookie,引用等等。agent.getagent.post()正常。

答案 2 :(得分:3)

我已经与NodeJs Scrapers合作超过2年了

我可以告诉您,处理登录和身份验证的最佳选择是不使用直接请求

那是因为您浪费时间在建立手动请求上,而且速度慢得多,

相反,请使用通过PuppeteerNightmareJs这样的API控制的高级浏览器

我对How to start scraping with Puppeteer有很好的入门和深入指南,我相信它会有所帮助!

答案 3 :(得分:1)

您可以从需要身份验证的站点中刮除数据,例如 csrf令牌

对每个请求使用 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;