KOENSAN
  • 0
  • 新人请关照

nodejs爬虫模拟登录,希望使用superagent或者其他,请求同一页面时获得相同的数据值

### 题目描述

现在正在做一个爬虫,使用nodejs模拟登录正方教务系统的项目。在模拟登录的时候遇到了问题,模拟登录的时候一共需要三个参数分别是密码,用户名以及csrftoken。现在已经解决了密码加密和用户名,只剩下csrftoken无法解决。
教务系统地址:http://202.119.206.62/jwglxt/...
csrftoken存在于教务系统的登录页面之中
图片描述
只需要获取到这个在将值放入POST的参数之中即可

### 相关代码

以下为主要代码
const superagent = require('superagent')
const cheerio = require('cheerio')
var rsa = require('node-bignumber')
const base64 = require('../public/base64')
const hex2b64 = base64.hex2b64
const b64tohex = base64.b64tohex

const headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8',
'Accept-ncoding': 'gzip,deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Pragma': 'no-cache',
'Upgrad-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
var timestamp = new Date().getTime()
const loginUrl = 'http://202.119.206.62/xtgl/lo...' + timestamp
const csrfktokenUrl = 'http://202.119.206.62/xtgl/lo...' + timestamp
const getPublicKeyUrl = 'http://202.119.206.62/xtgl/lo...' + timestamp + '&_=' + timestamp

superagent.get(getPublicKeyUrl).send(headers).end((err, res) => {
  if (err) console.log(err)
  const modulus = b64tohex(JSON.parse(res.text)['modulus'])
  const exponent = b64tohex(JSON.parse(res.text)['exponent'])
  var pub = new rsa.Key()
  pub.setPublic(modulus, exponent)
  var mm = '*****'
  var encrypted = pub.encrypt(mm)
  agent.get(csrfktokenUrl).send(headers).end((err, res) => {
    if (err) console.log(err)
    const $ = cheerio.load(res.text)
    csrftoken = $('#csrftoken').val()
    console.log('csrftoken', csrftoken)
    // console.log(res.text)
    agent.post(loginUrl).send(headers).send({
      csrftoken: csrftoken,
      mm: hex2b64(encrypted),
      yhm: '******'
    }).end((err, res) => {
      if (err) console.log(err)
      const $ = cheerio.load(res.text)
      // console.log(res.text)
      csrftoken = $('#csrftoken').val()
      console.log('csrftoken1', csrftoken)
      // const tips = $('#tips').html()
      // console.log('tips', tips)
    })
  })
})

### 问题出现的环境背景及自己尝试过哪些方法

目前,我的思路是使用superagent,请求loginUrl进行登录,请求csrfktokenUrl获得csrfktoken,请求getPublicKeyUrl获取rsa公钥
同时,当使用loginUrl登陆的时候csrfktoken必须为当前loginUrl页面的csrfktoken,而不能是其他的csrfktoken,否则会无法登录成功
但是因为请求的csrfktokenUrl和loginUrl是一样的,理应获取的csrfktoken也应该是一样的
图片描述
可是输出的结果不一样
而我都一直使用csrfktokenUrl请求的csrfktoken作为登录参数进行登录,所以老是无法登录成功
但我也无法获取loginUrl的csrfktoken作为登录参数进行登录,因为要获得csrfktoken必须要在请求结束才可以获得,所以造成老是无法登录的情况

### 你期待的结果是什么?

1、我还在想,能否在同一个会话session中访问请求页面,这样请求相同的页面获得csrfktoken也应该会一样,但我没有找到使用session的方法,或者有什么保持同一会话的方法能告诉我
2、superagent可以换着法使用从而达到请求同一页面获取的csrfktoken也一样
3、或者有什么其他的办法能够告知
谢谢!

阅读 432
评论 更新于 2019-09-18
    2 个回答

    直接get这个登录页面,然后解析html拿到token不就行了?

    评论 赞赏 2019-09-19
      rife
      • 3.4k

      使用 Puppeteer

      评论 赞赏 2019-09-26
        撰写回答

        登录后参与交流、获取后续更新提醒