msp*_*spl 11 javascript cookies request node.js cheerio
最近我试图使用Nodejs,请求模块和cheerio 从网站(kicktipp)抓取信息.由于此站点需要身份验证才能查看其大部分站点,因此我尝试通过发布请求登录并检查用户是否使用以下代码登录(我使用虚拟数据替换了凭据但我在实际脚本中使用了真实数据):
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);
});
});
Run Code Online (Sandbox Code Playgroud)
html-form(通过浏览器检查)发送的参数如下所示:
kennung=test@example.com&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden
Run Code Online (Sandbox Code Playgroud)
使用该脚本,我cookie jar看起来像这样:
[ Cookie="JSESSIONID=F650D7F5CD6AF4F6B0944B2190EE2D29.kt213; Path=/; hostOnly=true; aAge=1ms; cAge=179ms" ]
Run Code Online (Sandbox Code Playgroud)
在JSESSIONID保存成功,但服务器不会因为被记录在console.log(text)印刷品Login,但它应该打印Logout,如果用户正常登录.
在使用浏览器检查登录请求后,我发现浏览器每次set-cookie在响应头中请求此域上的页面时都会收到一个新cookie,如下所示:
Set-Cookie: login=bS5zcGxpZXRob2V2ZXJAZ21haWwuY29tOjE0NzU0MDA3MjAxMjA6Mzg1NTI4OGY3ODgzN2FkMzllNTA0NWNkY2ZjMjBjZGM; Domain=.kicktipp.de; Expires=Sun, 02-Oct-2016 09:32:00 GMT; Path=/; HttpOnly
Run Code Online (Sandbox Code Playgroud)
但是我无法(或者根本不知道如何)将此cookie放入我的请求jar中,因此以登录用户身份访问该页面.
这里有什么我想要保持登录(或者根本登录页面)吗?提前致谢.
问题是这个页面似乎需要你在第一页访问时获得的特定cookie(在这种情况下,它似乎是一个时区cookie).要获得此cookie,您只需在向服务器发送登录(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
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6812 次 |
| 最近记录: |