我正在尝试使用NodeJS
来抓取需要POST
登录的网站。
然后,当我登录后,我可以通过GET
访问单独的网页。
现在第一个问题是登录。我尝试使用request
来POST
登录信息,但我得到的回复似乎没有登录。
exports.getstats = function (req, res) {
request.post({url : requesturl, form: lform}, function(err, response, body) {
res.writeHeader(200, {"Content-Type": "text/html"});
res.write(body);
res.end();
});
};
这里我只是转发我回来的页面,但我回来的页面仍显示登录表单,如果我尝试访问另一个页面,则表示我没有登录。
我认为我需要维护客户端会话和cookie数据,但我找不到任何资源来帮助我理解如何做到这一点。
作为后续跟进,我最终使用zombiejs来获取我需要的功能
答案 0 :(得分:42)
您需要制作一个cookie jar并对所有相关请求使用相同的jar。
var cookieJar = request.jar();
request.post({url : requesturl, jar: cookieJar, form: lform}, ...
理论上,这应该允许您使用GET作为登录用户来抓取页面,但只有在您获得实际登录代码时才会这样做。根据您对登录POST的响应的描述,可能还没有真正正常工作,所以在您首先修复登录代码中的问题之前,cookie jar将无济于事。
答案 1 :(得分:12)
request.jar();
对我不起作用。所以我使用标头响应来发出这样的另一个请求:
request.post({
url: 'https://exampleurl.com/login',
form: {"login":"xxxx", "password":"xxxx"}
}, function(error, response, body){
request.get({
url:"https://exampleurl.com/logged",
header: response.headers
},function(error, response, body){
// The full html of the authenticated page
console.log(body);
});
});
Actualy这种方式工作正常。 = d
答案 2 :(得分:0)
请求(如果启用)将管理请求之间的cookie:
Cookie默认情况下处于禁用状态(否则,它们将用于 后续请求)。要启用Cookie,请将jar设置为true(在 默认值或选项)。
const request = request.defaults({jar: true})
request('http://www.google.com', function () {
request('http://images.google.com')
});