2015-10-03 15 views
7

Ultimamente sto provando a raschiare informazioni da un sito Web (kicktipp) utilizzando Nodejs, request module e cheerio. Poiché questo sito richiede un'autenticazione per visualizzare la maggior parte dei siti, ho provato ad accedere tramite una richiesta di posta e controllare se l'utente è connesso con il seguente codice (ho sostituito le credenziali con dati fittizi ma utilizzo i dati reali nel mio script effettivo):Nodejs scraping della pagina Web con cookie di autenticazione

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

i parametri da inviare dal html-form (ad ispezione con il browser) simile a questo:

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

con lo script, il mio cookie jar assomiglia a questo:

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

Il JSESSIONID viene salvato correttamente ma il server non verrà registrato dal console.log(text) stampe Login ma dovrebbe stampare Logout se l'utente ha eseguito l'accesso correttamente.

Dopo aver ispezionato la richiesta di accesso con il browser ho riconosciuto che il browser riceve un nuovo cookie ogni volta che una pagina su questo dominio è richiesto tramite set-cookie nell'intestazione di risposta in questo modo:

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

Comunque non sono in grado (o semplicemente non so come) per ottenere questo cookie nel mio jar di richiesta e quindi visitare la pagina come utente registrato.

C'è qualcosa che mi manca qui per rimanere loggato (o accedere alla pagina)? Grazie in anticipo.

risposta

4

Il problema è che questa pagina sembra aver bisogno di un cookie specifico che si ottiene durante la visita della prima pagina (in questo caso sembra un cookie di fuso orario). Per ottenere questo cookie è sufficiente visitare la pagina (utilizzando una richiesta GET) prima di inviare la richiesta di accesso (POST) al server. In questo caso è facile come avvolgere un'altra richiesta GET attorno al codice sopra:

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