我使用node.js遇到了很多tutorials explaining how to scrape public websites that don't require authentication/login。
有人可以解释如何使用node.js抓取需要登录的网站吗?
答案 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.get
,agent.post()
正常。
答案 2 :(得分:3)
我已经与NodeJs Scrapers合作超过2年了
我可以告诉您,处理登录和身份验证的最佳选择是不使用直接请求
那是因为您浪费时间在建立手动请求上,而且速度慢得多,
相反,请使用通过Puppeteer或NightmareJs这样的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;