【问题标题】:How can I scrape sites that require authentication using node.js?如何使用 node.js 抓取需要身份验证的网站?
【发布时间】:2019-01-28 18:17:35
【问题描述】:

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

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

【问题讨论】:

标签: javascript node.js authentication web-scraping


【解决方案1】:

使用Mikeal's Request库,你需要像这样启用cookies支持:

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

因此,您首先应该(手动)在该站点上创建一个用户名,并在向该站点发出 POST 请求时将用户名和密码作为参数传递。之后,服务器将响应请求会记住的 cookie,因此您将能够访问需要您登录到该站点的页面。

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

【讨论】:

  • @alessioalex 谢谢。我会尝试您的建议并在此处更新状态。
  • 您能否提供任何示例,说明我正在按照您所说的那样做,但没有运气,我正在尝试废弃一个 asp.net 网站。
  • 如果您在某处发布代码示例(要点或其他内容)会很有用,这样我就可以找出您做错了什么。这样会更快。
  • @alessioalex +1 请提供完整示例
  • 如果目标网站使用CSRF保护,可以试试csrf-login。
【解决方案2】:

我已经使用 NodeJs Scrapers 2 年多了

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

那是因为你只是把时间浪费在构建手动请求上,而且速度很慢,

改为使用您通过 API 控制的高级浏览器,例如 Puppeteer 或 NightmareJs

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

【讨论】:

  • 我同意你的看法。
  • 我同意你的看法
【解决方案3】:

或者使用superagent:

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

agent 是 persistent browser,它将处理获取和设置 cookie、引用等。就像平常一样,只需 agent.get、agent.post()。

【讨论】:

【解决方案4】:

您可以从需要身份验证的站点中抓取数据,例如 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;

【讨论】:

    猜你喜欢
    • 2017-01-02
    • 1970-01-01
    • 2015-04-09
    • 2016-09-13
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    相关资源
    最近更新 更多