Node.js:实现知乎(www.zhihu.com)模拟登录,获取用户关注主题

     

 

      前一段时间,在瞎看看 Node.js,便研究经过 Node.js 实现知乎模拟登录。相信,有不少网站有登录权限设置,如若用户未登录,将会跳转至首页提醒用户登录,没法浏览部分页面。node

     如如果 b/s 架构,确定是离不开 http(s) 协议,而 http(s) 协议又为无状态,为了实现状态保存,出现了 cookie/session,所以,登录后,保存用户登录状态,无非不就是利用 cookie/session 实现以上功能。cookie 与 session 有所不一样,其中 cookie 保存在客户端,而 session 则保存在服务器端,不过,session 其中的 sessionid 将会保存中 cookie 中。api

      终上所述,实现模拟登录,获取用户关注主题,将分为如下几步。数组

首先,进行模拟登录,不过,在登录过程当中,要将提交至服务器参数填充完整(通常包括用户名、密码、随机数等)。浏览器

在登录成功后,服务器将会经过 Set-Cookie 指令向客户端写入 Cookie 。以后,通常网站即会进行跳转至登录前页面
(因此,须要在页面跳转前获取 Cookie 值进行保存)。服务器

向目标 URL 发送请求,此时,该目标 URL 在请求报文头中的 cookie 信息加入前一步获取的登录 cookie 信息。cookie

 

    而实现以上功能,确定离不开 Chrome F12 开发者工具分析,而在 Node.js 中,则利用到了 Superagent、Cheerio 模块,其中 Superagent 可模拟浏览器请求,而 Cheerio 模块则相似于服务器端 jQuery ,常常 DOM 操做增删查改的同窗,确定不会陌生,同时,其 API 也与浏览器端的 jQuery 类库极其类似。session

 

      一 首先,分析权限页面所需 Cookie 信息,打开 Chrome F12 开发者工具,选择 Sources --- Cookies ,可查看页面 Cookie 信息,可点击 Cookie 值进行删除操做,后再刷新页面,看是否会跳转至登录页面。经过重重排除可知,该页面须要名为 z_co 的 cookie 信息,方可打开目标权限页面,从而,在模拟登录,保存 set-cookie 指令中名为 z_c0 的 cookie 信息。架构

 

     

     二  接下来,一样采用 F12 开发者工具分析,在登录过程,Post 请求中传递的参数信息,包括 _xsrf、email、password、remeber_me 四个参数,除 _xsrf 外,至关于都为已知参数。再经过 ctrl+shift+f 全局搜索 _xsrf 可知,其值为一个隐藏 input type='hidden' 标签 value 属性,对 Dom 参数及值进行修改,于是,可进一步分析此参数,能否随意填写。app

 

      

 

    经过,对于登录页面 Dom 结构分析,可明显示发现 id 为 _xsrf 标签信息,然后,本人尝试修改其 value 值,然后点击提交,发现其在 JS 中应该有作相关处理,而并不是本人修改后的值。而该值获取,亦可采起最为简捷的 Superagent 模块获取页面所有字符串,以后,便可采用 cheerio 获取 id 为_xsrf 标签,从而获取其值。工具

 

 

// 引入 superagent、cheerio
var superagent= require("superagent");
var cheerio=require("cheerio");

// 登录 url 、目标 url
var url={
url:"http://www.zhihu.com/",
login_url:"http://www.zhihu.com/login/email",
target_url:"https://www.zhihu.com/collections"
};


// 浏览器请求报文头部部分信息
var browserMsg={
"User-Agent":"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36",
'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8'
};



var cookie;


// post 参数信息,其中,还差先前分析的 _xsrf 信息
var loginMsg=
{
password:"xxxx ",
remember_me:true,
email:"xxxxx"
};


// 获取 _xrsf 值
function getXrsf(){

superagent.get(url.url).end(function(err,res){
if(!err){
var $=cheerio.load(res.text);
loginMsg._xsrf=$('[name=_xsrf]').attr('value');
}else
console.dir(err);

});
}


// 发送登录请求,获取 cookie 信息
function getLoginCookie() {
// 首先,需在 set 方法中设置请求报文中参数,以性器官免服务器端有针对非浏览器请求作相关处理
// send 方法中设置 post 请求中需提交的参数
// redirects 方法调用,其中参数为 0 ,为了不在用户登录成功后,引发的页面从新刷新,从而没法获取 cookie
superagent.post(url.login_url).set(browserMsg).send(loginMsg).redirects(0).end(function (err, response) {
if (!err) {
cookie = response.headers["set-cookie"];
console.dir(cookie);
} else

console.dir(err);
});
}

// 根据 cookie ,获取 target 页面关注信息
// 经过分析可知,仅取出 z_c0 的 cookie 便可,而 getLoginCookie 方法返回为一个 cookie 数组,稍作处理便可
function getFollower(){
superagent.get(url.target_url).set("Cookie",cookie).set(browserMsg).end(function(err,response){
if (err) {
console.log(err);
} else {

var $ = cheerio.load(response.text);

// 此处,一样利用 F12 开发者工具,分析页面 Dom 结构,利用 cheerio 模块匹配元素
var array = $('#zh-favlist-following-wrap .zm-item');
console.log(" 收藏夹标题 " + " " + " 收藏人数");
if (array && array.length > 0) {
array.each(function () {
console.log($(this).find('.zm-item-title>a').text() + " " + ($(this).find('.zg-num').text() ? $(this).find('.zg-num').text() : "0"));
//$(this).find('.zm-item-title>a').text();
//$(this).find('.zg-num').text();

});
}

}
});


}
  

 

        最近,身体一每天比一天差了,楼主养分跟不上了。(Node.js 新手,代码太渣,勿喷!!!)关于 Superagent、cheerio 模块使用可查看 api 文档。

参考资料:

           https://cnodejs.org/topic/5203a71844e76d216a727d2e

           https://cnodejs.org/topic/5378720ed6e2d16149fa16bd

相关文章
相关标签/搜索