Nodejs网页抓取与authenticationcookie

最近我试图从网站( kicktipp )使用Nodejs, 请求模块和cheerio刮取信息。 由于本网站需要身份validation才能查看其大部分网站,我尝试通过发布请求login,并检查用户是否使用以下代码login(我用虚拟数据replace了凭据,但在实际脚本中使用了真实数据):

var request = require('request'); var jar = request.jar(); var request = request.defaults({ jar: jar, followAllRedirects: true }); var jar = request.jar(); var cheerio = require('cheerio'); request.post({ url: 'http://www.kicktipp.de/info/profil/loginaction', headers: { 'content-type': 'application/x-www-form-urlencoded' }, method: 'post', jar: jar, body: 'kennung=test@example.com&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden' }, function(err, res, body){ if(err) { return console.error(err); }; request.get({ url: 'http://www.kicktipp.de/', method: 'get', jar: jar }, function(err, res, body) { if(err) { return console.error(err); }; var $ = cheerio.load(body); var text = $('.dropdownbox > li > a').text(); console.log(text); var error = $('#kicktipp-content > div.messagebox.errors > p').text(); console.log(error); var cookies = jar.getCookies('http://www.kicktipp.de/'); console.log(cookies); }); }); 

通过html表单(通过浏览器检查)发送的参数如下所示:

 kennung=test@example.com&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden 

用这个脚本,我的cookie jar看起来像这样:

 [ Cookie="JSESSIONID=F650D7F5CD6AF4F6B0944B2190EE2D29.kt213; Path=/; hostOnly=true; aAge=1ms; cAge=179ms" ] 

JSESSIONID已成功保存,但服务器将不会login,因为console.log(text)打印Login但如果用户login正确,它应该打印Logout

在使用浏览器检查login请求之后,我认识到浏览器每次在响应头中通过set-cookie请求该域上的页面时都会收到一个新set-cookie ,如下所示:

 Set-Cookie: login=bS5zcGxpZXRob2V2ZXJAZ21haWwuY29tOjE0NzU0MDA3MjAxMjA6Mzg1NTI4OGY3ODgzN2FkMzllNTA0NWNkY2ZjMjBjZGM; Domain=.kicktipp.de; Expires=Sun, 02-Oct-2016 09:32:00 GMT; Path=/; HttpOnly 

然而,我不能(或只是不知道如何)将这个cookie到我的请求jar,因此作为login用户访问该页面。

有什么我在这里失踪保持login(或login到页面)? 提前致谢。

问题是,这个页面似乎需要一个特定的cookie,你在第一次访问页面(在这种情况下,它似乎是一个时区cookie)。 要获取这个cookie,只需要在发送login(POST)请求到服务器之前访问该页面(使用GET请求)。 在这种情况下,就像在上面的代码中包装另一个GET请求一样简单:

 var loginLink = 'http://www.kicktipp.de/info/profil/login'; // creating a clean jar var j = request.jar(); request.get({url: loginLink, jar: j}, function(err, httpResponse, html) { // place POST request and rest of the code here });