前一段时间,在瞎看看 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:"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

Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题的更多相关文章

  1. Koa与Node.js开发实战(2)——使用Koa中间件获取响应时间(视频演示)

    学习架构: 在实战项目中,经常需要记录下服务器的响应时间,也就是从服务器接收到HTTP请求,到最终返回给客户端之间所耗时长.在Koa应用中,利用中间件机制可以很方便的实现这一功能.代码如下所示: 01 ...

  2. Node.js 应用全链路追踪技术——[全链路信息获取]

    全链路追踪技术的两个核心要素分别是 全链路信息获取 和 全链路信息存储展示. Node.js 应用也不例外,这里将分成两篇文章进行介绍:第一篇介绍 Node.js 应用全链路信息获取, 第二篇介绍 N ...

  3. Node.js:上传文件,服务端如何获取文件上传进度

    内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...

  4. Python爬虫 —— 知乎之selenium模拟登陆获取cookies+requests.Session()访问+session序列化

    代码如下: # coding:utf-8 from selenium import webdriver import requests import sys import time from lxml ...

  5. 基于Hexo+Node.js+github+coding搭建个人博客——基础篇

    附上个人教程:http://www.ookamiantd.top/2017/build-blog-hexo-base/ 搭建此博客的动机以及好处在此就不多谈了,之前已经表达过,详情请看Start My ...

  6. 用node-inspector调试Node.js(转自NOANYLOVE'S BLOG)

    原文地址:http://www.noanylove.com/2011/12/node-the-inspector-debugging-node-js/ 用node-inspector调试Node.js ...

  7. LESS-Middleware:Node.js 和 LESS 的完美搭配

    LESS 是一个编写 CSS 的很好的方式 ,让你可以使用变量,嵌套规则,混入以及其它许多有用的功能,它可以帮助您更好地组织你的 CSS 代码. 最近我一直在研究 Node.js ,并想用 less- ...

  8. NODE.JS之我见

    NODE.JS之我见 先说说为什么有这篇文章,关注NODE.JS 也有一段时间了,不敢说大彻大悟,但是对于NODE.JS能干什么,还是有一定的了解,笔者多年以前就研究过JavaScript引擎V8,可 ...

  9. 24个很赞的 Node.js 免费教程和在线指南

    JavaScript 最初是用来创建动态网站效果的的前端语言.而如今,这门脚本语言也可以用作后端开发,用于搭建 Web 服务器,开发接口,甚至创建博客.在下面这个列表中包括24个 Node.js 教程 ...

随机推荐

  1. BZOJ3850: ZCC Loves Codefires

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3850 题解:类似于国王游戏,推一下相邻两个元素交换的条件然后排个序就可以了. 代码: #inc ...

  2. Asp.Net时间戳与时间互转

    /// <summary> /// 时间戳转成时间类型 /// </summary> /// <param name="timeStamp">& ...

  3. fancybox 在打开窗口前 先执行 js脚本,fancybox设置只能通过右上角关闭,fancybox遮罩层关闭

    在默认情况下,fancybox点击之后弹出窗口,右上角带有一个XX,但是点击窗口的其他遮罩层或者是其他地方,都是可以关闭fancybox的,有些时候,我们不希望这样关闭,而是只能点击右上角关闭,那么设 ...

  4. [转:CSS3-前端] CSS3发光和多种图片处理

    原文链接:http://www.qianduan.net/css3-image-styles.html 一些上流的CSS3图片样式 神飞 发表于 24. Sep, 2011, 分类: CSS , 46 ...

  5. HTTP请求头host解析

    Host: 域名 Host表示请求的服务器网址:   request headers中的host字段 例如有user.xiaoqiang.com,hotel.xiaoqiang.com 现在需要登录后 ...

  6. (转)TCP协议那些事

    (上) TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面.所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获.关于TCP这个协议的细节,我还是 ...

  7. zoj 2588 Burning Bridges

    题目描述:Ferry王国是一个漂亮的岛国,一共有N个岛国.M座桥,通过这些桥可以从每个小岛都能到达任何一个小岛.很不幸的是,最近Ferry王国被Jordan征服了.Jordan决定烧毁所有的桥.这是个 ...

  8. jvm内部现成运行

    hi,all 最近抽时间把JVM运行过程中产生的一些线程进行了整理,主要是围绕着我们系统jstack生成的文件为参照依据.  前段时间因为系统代码问题,造成性能瓶颈,于是就dump了一份stack出来 ...

  9. 【转】APUE习题4.6---测试lseek作用

    原文网址:http://m.blog.csdn.net/blog/u014488381/42556509 原题:如果使用追加标志打开一个文件以便读.写,能否仍用 lseek 在任一为止开始读?能否用 ...

  10. LXD 2.0 系列(二):安装与配置

    导读 简单来说,LXD是一个守护进程,为LXC容器的管理提供一组REST API.主要目标是提供一种类虚拟机的用户体验,是一种第三方的容器管理工具.下面呢,我们来介绍LXD 2.0 的安装与配置 安装 ...