2015-10-03 6 views
7

In letzter Zeit versuche ich Informationen von einer Website (kicktipp) mit Nodejs, die request module und cheerio zu kratzen. Da diese Site eine Authentifizierung erfordert, um die meisten Sites anzuzeigen, habe ich versucht, mich über eine Postanforderung anzumelden und zu überprüfen, ob der Benutzer mit dem folgenden Code angemeldet ist (Ich ersetzte die Anmeldeinformationen durch Dummydaten, aber ich verwende echte Daten in meinem eigentlichen Skript):Nodejs Webseite Scraping mit Authentifizierung Cookie

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: '[email protected]&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); 
    }); 
}); 

die Parameter des hTML-Formular senden (wie mit dem Browser überprüft) wie folgt aussehen:

[email protected]&passwort=1234567890&_charset_=UTF-8&submitbutton=Anmelden 

mit diesem Skript, mein cookie jar sieht wie folgt aus:

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

Die JSESSIONID wurde erfolgreich gespeichert, aber der Server ist nicht eingeloggt seit console.log(text) druckt Login aber es sollte Logout drucken, wenn der Benutzer ordnungsgemäß angemeldet ist.

Nach der Login-Anfrage mit dem Browser Inspektion erkennen ich, dass der Browser jedes Mal eine Seite auf dieser Domain ein neues Cookie empfängt über set-cookie in den Antwort-Header wie folgt angefordert wird:

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

aber ich nicht bin kann (oder weiß einfach nicht wie), um diesen Cookie in meine Anfrage Jar und damit die Seite als angemeldeter Benutzer zu besuchen.

Gibt es irgendetwas, was mir hier fehlt, um eingeloggt zu bleiben (oder sich überhaupt auf der Seite einzuloggen)? Danke im Voraus.

Antwort

4

Das Problem ist, dass diese Seite einen bestimmten Cookie zu benötigen scheint, den Sie bei Ihrem ersten Seitenbesuch erhalten (in diesem Fall scheint es ein Zeitzonen-Cookie zu sein). Um dieses Cookie zu erhalten, müssen Sie nur die Seite besuchen (mit einer GET-Anfrage), bevor Sie die Login-Anfrage (POST) an den Server senden. In diesem Fall ist es so einfach wie das Umhüllen einer anderen GET-Anfrage um den obigen Code herum:

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 
}); 
Verwandte Themen