基于Node.js的模拟登录操作

时间:2024-03-26 15:38:37

      在一次比较久远的课程设计中,我和小组成员做了一个本校大学生二手市场交易平台网站,其中有一个功能是学生用户注册账号之后必须经过学生身份验证才能获取发布二手商品和交易等一系列权限,否则你注册的账号只能是属于“僵尸号”,只可观看别人发布的商品信息,其他基本上什么都干不了。那时候我想到的是通过模拟登录学生信息管理系统的方式来验证学生身份,即学生用户通过输入自己的学生账号和密码,然后服务端将这些信息进行学院学生信息管理系统的登录操作,通过验证之后(登录成功)再进行爬虫抓取对应的学生个人信息数据(姓名、学号、专业等),然后存进数据库,完成账号的身份验证操作。其实本质上这个操作就是爬虫,只不过爬取的是有登录权限的网页。下面我来介绍一下基本的操作,技术上当然是基于Node.js平台啦。

      首先,需要用到的模块有:(安装模块就不用说了吧,直接npm install xxx --save)

  • http模块:这个想必用过Node.js的都很熟悉吧,这里http模块很重要,主要是获取页面的数据信息(html。。。);
  • cheerio模块:这个主要将http请求获得的数据进行对应抓取,语法上类似JQuery的DOM操作,后面放代码会有解释,很简单;
  • iconv模块:这个是为了防止抓取到的页面信息乱码,其实乱码问题主要原因是学校那套网站太老旧了,不得不用iconv处理一下;

     现在我来说一下实现过程:

  • 首先,必须要有学生信息管理系统的网址,例如我学校的是 http://class.sise.com.cn:7001/sise/。然后我们通过http模块向该系统发起请求获取页面数据信息,如图:

 基于Node.js的模拟登录操作

      这里通过http的get方法抓取页面信息,控制台输出html看看有什么:(页面代码太多截一部分)

基于Node.js的模拟登录操作

     其实就是你通过浏览器打开网址后查看网页源代码获取到的这些数据。

  • 抓取到页面代码之后,我们可以获得学生系统登录所需要提交的信息,就如上面我截取的图,登录提交的数据除了学号、密码之外,还有三个input提交值,即一个id为token的input、一个id为random的input以及一个名字贼长的input三个,画一下吧:

基于Node.js的模拟登录操作

     因此,当我们进行模拟登录时这些数据必须一起提交。

  • 接下来我们看看,因为除了学号密码之外那三个提交值都是系统自己提供的,而且第一个input连name值都包括进去了,所以,我们要获取系统提供的这些数据,就要用到cheerio模块来抓取了,如图:

基于Node.js的模拟登录操作

      这里,cheerio模块就是这么简单,语法简直和Jquery没什么区别,依次抓取这三个input的相应值。

  • 抓取完之后就要开始进行模拟登录了,在这个操作之前我先解释一下登录原理,这样后续的操作也就好理解了,首先打开浏览器,打开这个我们要进行登录的网址,输入学号密码之后打开浏览器控制台的network,点击登录,响应结果如图:

基于Node.js的模拟登录操作

     当点击登录之后,响应第一个是login_check_login.jsp,光看名字就知道它是处理登录请求的入口,点击打开,如图:

基于Node.js的模拟登录操作

       这里包含请求头信息Request Headers,其中最重要的是提交内容长度(content_length)和cookie,FormData之前说了,就是登录所需要提交的数据。因此,这里告诉我们,我们在模拟登录时必须要包含正确的请求头信息和表单数据信息,否则登录失败。

  • 现在,我们开始将之前抓取的表单数据拿过来,然后伪造请求头信息进行模拟登录,代码如图:

基于Node.js的模拟登录操作

       postData是表单提交值,有人看了这个字符串可能会发疯:你就不会用JSON格式定义再通过querystring模块转化为这种格式的字符串吗?抱歉,有点草率先凑合着吧。。。。然后options就是伪造的请求头,大概格式就是这样。最后,就可以开始登录操作了,如图:

基于Node.js的模拟登录操作

       在这里,又一次用到了http模块向登录接口发起请求,这里就用到了iconv模块了,如果没用到的话后续的抓取数据全是乱码。然后在发起请求后根据实际情况进行简单正则判断,判断你输进去的密码是否有误,以及学号是否存在,如果无误则控制台输出“通过认证”。

  • 做到这,其实模拟登录这块已经完成了,后续我们要继续抓取里面的数据。因为是学生身份验证,模拟登录进去学生系统就是为了获取个人信息,所以,继续操作。

基于Node.js的模拟登录操作

       代码和上面大同小异,就是再次抓取数据,将你需要抓取的页面地址放进去,然后得到页面内容之后就又是cheerio的抓取了。这里我抓取的是课程表上面的个人信息(反正只是个人信息,有出现就抓,你也可以在其他地方爬取,都没问题)。最后控制台输出信息。