Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题
前一段时间,在瞎看看 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)模拟登陆,获取用户关注主题的更多相关文章
- Koa与Node.js开发实战(2)——使用Koa中间件获取响应时间(视频演示)
学习架构: 在实战项目中,经常需要记录下服务器的响应时间,也就是从服务器接收到HTTP请求,到最终返回给客户端之间所耗时长.在Koa应用中,利用中间件机制可以很方便的实现这一功能.代码如下所示: 01 ...
- Node.js 应用全链路追踪技术——[全链路信息获取]
全链路追踪技术的两个核心要素分别是 全链路信息获取 和 全链路信息存储展示. Node.js 应用也不例外,这里将分成两篇文章进行介绍:第一篇介绍 Node.js 应用全链路信息获取, 第二篇介绍 N ...
- Node.js:上传文件,服务端如何获取文件上传进度
内容概述 multer是常用的Express文件上传中间件.服务端如何获取文件上传的进度,是使用的过程中,很常见的一个问题.在SF上也有同学问了类似问题<nodejs multer有没有查看文件 ...
- Python爬虫 —— 知乎之selenium模拟登陆获取cookies+requests.Session()访问+session序列化
代码如下: # coding:utf-8 from selenium import webdriver import requests import sys import time from lxml ...
- 基于Hexo+Node.js+github+coding搭建个人博客——基础篇
附上个人教程:http://www.ookamiantd.top/2017/build-blog-hexo-base/ 搭建此博客的动机以及好处在此就不多谈了,之前已经表达过,详情请看Start My ...
- 用node-inspector调试Node.js(转自NOANYLOVE'S BLOG)
原文地址:http://www.noanylove.com/2011/12/node-the-inspector-debugging-node-js/ 用node-inspector调试Node.js ...
- LESS-Middleware:Node.js 和 LESS 的完美搭配
LESS 是一个编写 CSS 的很好的方式 ,让你可以使用变量,嵌套规则,混入以及其它许多有用的功能,它可以帮助您更好地组织你的 CSS 代码. 最近我一直在研究 Node.js ,并想用 less- ...
- NODE.JS之我见
NODE.JS之我见 先说说为什么有这篇文章,关注NODE.JS 也有一段时间了,不敢说大彻大悟,但是对于NODE.JS能干什么,还是有一定的了解,笔者多年以前就研究过JavaScript引擎V8,可 ...
- 24个很赞的 Node.js 免费教程和在线指南
JavaScript 最初是用来创建动态网站效果的的前端语言.而如今,这门脚本语言也可以用作后端开发,用于搭建 Web 服务器,开发接口,甚至创建博客.在下面这个列表中包括24个 Node.js 教程 ...
随机推荐
- POJ 2584 T-Shirt Gumbo (二分图多重最大匹配)
题意 现在要将5种型号的衣服分发给n个参赛者,然后给出每个参赛者所需要的衣服的尺码的大小范围,在该尺码范围内的衣服该选手可以接受,再给出这5种型号衣服各自的数量,问是否存在一种分配方案使得每个选手都能 ...
- 在delphi中, reintroduce作用
在delphi中, reintroduce作用 当在子类中重载或者重新声明父类的虚方法时,使用 reintroduce 关键字告知编译器,可以消除警告信息.如: TPar ...
- 五分钟solr4.5教程(搭建、运行)
环境要求 jdk1.6及以上版本 solr发布版本 下载地址 http://lucene.apache.org/solr/mirrors-solr-latest-redir.html? 启动solr ...
- group by调优的一些测试
表结构信息: mysql> show create table tb\G*************************** 1. row ************************** ...
- Java SE 6 新特性: Java DB 和 JDBC 4.0
http://www.ibm.com/developerworks/cn/java/j-lo-jse65/index.html 长久以来,由于大量(甚至几乎所有)的 Java 应用都依赖于数据库,如何 ...
- SDUT 3571 Password 暴力搜索
这个题如果裸搜肯定超时了 但是我们可以枚举,用初始串的哪一位数字去填目标串的那一位数字 这样就是暴力6!,复杂度很低,然后需要解决过程中经过的点的问题, 因为是从左向右走,所以记录当前光标, 和当前达 ...
- Selenium - IDE模式匹配
Selenium - IDE模式匹配 在Selenium IDE中,如定位器,模式是selenium中经常使用的一种类型的参数.它允许用户描述特殊字符的模式.很多时候,我们想核实文字是动态的,在这种情 ...
- OpenGL超级宝典第5版&&GLSL法线变换
在GLSL中,有一些情况需要把局部坐标系下的向量或点转换到视点坐标系下,如光照计算时,需要把法向转化到视点坐标系.如果是模型上一点p 转化到视点坐标系下,直接(model-view matrix )* ...
- switchomega配置
- BSON与JSON的区别
BSON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式.BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schem ...