Node.js开发实战 实现知乎模拟登陆并获取用户关注主题解析
沉沙 2018-07-26 来源 : 阅读 1457 评论 0

摘要:本篇Node.js教程探讨了Node.js实现知乎模拟登陆并获取用户关注主题,希望阅读本篇文章以后大家有所收获,帮助大家对Node.js的理解更加深入。

     有很多网站有登陆权限设置,如若用户未登陆,将会跳转至首页提醒用户登陆,无法浏览部分页面。

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

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

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

在登陆成功后,服务器将会通过 Set-Cookie 指令向客户端写入 Cookie 。之后,一般网站即会进行跳转至登陆前页面
(所以,需要在页面跳转前获取 Cookie 值进行保存)。

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

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

      一 首先,分析权限页面所需 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 参数及值进行修改,因而,可进一步分析此参数,可否随意填写。

    通过,对于登陆页面 Dom 结构分析,可明显示发现 id 为 _xsrf 标签信息,而后,本人尝试修改其 value 值,而后点击提交,发现其在 JS 中应该有做相关处理,而并非本人修改后的值。而该值获取,亦可采取最为简捷的 Superagent 模块获取页面全部字符串,之后,即可采用 cheerio 获取 id 为_xsrf 标签,从而获取其值。

// 引入 superagent、cheerio
var superagent= require("superagent");
var cheerio=require("cheerio");
// 登陆 url 、目标 url
var  url={
    url:"//www.zhihu.com/",
    login_url:"//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();
                });
            }
        }
    });
    }

本文由职坐标整理并发布,了解更多内容,请关注职坐标WEB前端Node.js频道!

本文由 @沉沙 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程