如何使用node.js抓取需要身份验证的站点
How can I scrape sites that require authentication using node.js?
我看到了许多教程,解释了如何使用node.js.抓取不需要身份验证/登录的公共网站
有人能解释一下如何使用node.js抓取需要登录的网站吗?
使用Mikeal的请求库,您需要启用这样的cookie支持:
var request = request.defaults({jar: true})
因此,您首先应该在该站点上创建一个用户名(手动),并在向该站点发出POST请求时将用户名和密码作为params传递。之后,服务器将使用请求会记住的cookie进行响应,这样您就可以访问需要登录该网站的页面。
注意:如果在登录页面上使用类似reCaptcha的东西,这种方法就不起作用。
我已经使用NodeJs Scrapers工作了两年多了
我可以告诉你,在处理登录和身份验证时,最好的选择是不使用直接请求
这是因为你只是在构建手动请求上浪费时间,而且速度慢得多,
相反,使用通过API控制的高级浏览器,如Puppeteer或NightmareJs
我有一个关于如何开始使用Puppeteer的良好入门和深入指南,我相信它会有所帮助!
或使用超级代理:
var superagent = require('superagent')
var agent = superagent.agent();
agent
是一个持久的浏览器,它将处理获取和设置cookie、referers等。正常情况下只有agent.get
、agent.post()
。
您可以从需要身份验证的站点抓取数据,如csrf令牌。
对每个请求使用cookie,如下所示:
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;
相关文章:
- Sencha Touch和远程服务器上的身份验证
- Javascript清除缓存以清除基本身份验证凭据
- REST的面向公众的身份验证机制
- 当需要身份验证时,ui路由器不会重定向
- 使用Facebook登录,但仍然可以获得:“;此标识池不支持未经身份验证的访问“;
- AJAX HTTP基本身份验证解决方案
- 身份验证后获取Facebook图片
- 如何对单个页面进行密码保护(这不是身份验证系统的一部分)
- Twitter应用程序专用身份验证
- Passport.js成功的身份验证根本没有调用
- 通过JavaScript访问需要身份验证的页面
- UIWebview赢得't通过基本身份验证加载动态加载的资源(通过jQuery mobile)
- 使用JavaScript捕获基本身份验证凭据
- Firebase twitter身份验证和跨站点说明
- 在节点快速站点中保留 Stormpath 身份验证和授权后的查询字符串
- 如果我的站点只有 2 或 3 个管理员,我是否应该设置 Passport.js 或类似进行身份验证
- 如何使用node.js抓取需要身份验证的站点
- 在站点页面之间切换时,请记住是经过身份验证的用户
- 使用CORS在另一个站点上处理重新身份验证
- 在从 IIS 托管站点连接的 NodeJS 上对用户进行身份验证