爬虫模拟登陆强智教务系统

  • 引言
  • 思路分析
  • 完整代码
  • 总结分析

引言

面对疫情,我可以做什么呢?

面对疫情,我可以每天睡到11点
面对疫情,我可以……
好像也没有别的事情可以干了
ε=(´ο`*)))唉,看来只能呆在家中当废物了。最近,在家闲的无聊,便打起了学校教务系统的主意,没错,就是那个抢课巨慢,平时还不怎么好用的强智教务系统。今天,我就尝试一下用Python写个爬虫来模拟登陆一下强智教务系统。

思路分析

我们在用浏览器进行登陆时,需要填写用户名、密码和验证码这三项内容,而我们用爬虫进行模拟登陆的关键就是找到请求的URL,然后写代码发送请求即可。
首先,进行抓包分析

在请求的URL中,我们发现了其中一个URL以post的方式请求服务器,并且返回的状态码为302,页面被重定向了,而重定向的URL正好是登陆成功后的主页。

从发送的数据中,我们发现最后一项就是验证码,而前两项并没有什么卵用,最关键的是第三项的数据,看起来毫无规律可循,盲猜是对用户名和密码进行了加密,应该是防止别人破解吧!
回到登陆页面,查看页面的源代码,竟然发现了它的加密方法。(写这个网站的程序员意识这么低吗?)

有了加密方法,剩下的就好办了,用Python重写这个算法,生成加密字符串,再发送请求就行了。用户名和密码加密算法代码如下:

def get_code(username, password, session):str_url = 'http://jwgl.sdust.edu.cn/Logon.do?method=logon&flag=sess'headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'max-age=0','Connection': 'keep-alive','Host': 'jwgl.sdust.edu.cn','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}r = session.get(str_url, headers=headers)dataStr = r.textscode = dataStr.split("#")[0]sxh = dataStr.split("#")[1]code = username + "%%%" + passwordencode = ""# 加密算法核心代码i = 0while i < len(code):if i < 20:encode += code[i:i + 1] + scode[0:int(sxh[i:i + 1])]scode = scode[int(sxh[i:i + 1]):len(scode)]else:encode += code[i:len(code)]i = len(code)i += 1return encode

最后,就只剩下验证码没有解决了。在验证码这个地方,我被卡了好久,一开始,发送请求拿验证码图片时,忘了加cookie,虽然,拿到了验证码,但是验证码已经过期,导致好几次都因为验证码过期而无法登陆,我真是太难了。本想加上cookie就完成了,谁曾想刚从cookie的坑里出来,又掉进了验证码识别的坑里。对于验证码识别,我一开始用的是Tesseract-OCR,发现效果不好,正确率很低,接着我又用了百度AI的通用文字识别,结果效果仍然不理想,人工智能都不行了吗?最后,只能用笨办法,将验证码图片保存到本地,进行人工识别。

完整代码

# !/usr/bin/env python
# —*— coding: utf-8 —*—
# @Time:    2020/2/4 11:25
# @Author:  Martin
# @File:    强智教务系统模拟登陆.py
# @Software:PyCharm
import requests
import re
import os
from lxml import etree
from aip import AipOcr
# 参数配置
APP_ID = ''
API_KEY = ''
SECRET_KEY = ''
options = {'detect_direction': 'true','language_type': 'CHN_ENG'
}
aipOcr = AipOcr(APP_ID, API_KEY, SECRET_KEY)def main():# username = input("请输入用户名:")# password = input("请输入密码:")username = ''password = ''session = get_cookie()verify_code = get_verify_code(session)encoded = get_code(username, password, session)login(encoded, verify_code, session)def get_cookie():host = 'http://jwgl.sdust.edu.cn/'session = requests.session()session.get(host, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'})return sessiondef get_code(username, password, session):str_url = 'http://jwgl.sdust.edu.cn/Logon.do?method=logon&flag=sess'headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'max-age=0','Connection': 'keep-alive','Host': 'jwgl.sdust.edu.cn','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}r = session.get(str_url, headers=headers)dataStr = r.textscode = dataStr.split("#")[0]sxh = dataStr.split("#")[1]code = username + "%%%" + passwordencode = ""i = 0while i < len(code):if i < 20:encode += code[i:i + 1] + scode[0:int(sxh[i:i + 1])]scode = scode[int(sxh[i:i + 1]):len(scode)]else:encode += code[i:len(code)]i = len(code)i += 1return encodedef get_verify_code(session):img_url = 'http://jwgl.sdust.edu.cn/verifycode.servlet'headers = {'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9','Connection': 'keep-alive','Host': 'jwgl.sdust.edu.cn','Referer': 'http://jwgl.sdust.edu.cn/','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}r = session.get(img_url, headers=headers)# 利用百度AI识别验证码# result = aipOcr.basicGeneral(r.content, options)# try:#     text = result['words_result'][0]['words']# except :#     text = ""# 人工识别验证码if not os.path.exists('./result/'):os.makedirs('./result/')with open('./result/verify_code.png', 'wb') as f:f.write(r.content)text = input("请打开本地图片,识别图中的验证码!")return textdef login(encoded, verify_code, session):login_url = 'http://jwgl.sdust.edu.cn/Logon.do?method=logon'data = {'view': 0,'useDogCode': '','encoded': encoded,'RANDOMCODE': verify_code}headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.9','Cache-Control': 'max-age=0','Connection': 'keep-alive','Content-Length': '101','Content-Type': 'application/x-www-form-urlencoded','Host': 'jwgl.sdust.edu.cn','Origin': 'http://jwgl.sdust.edu.cn','Referer': 'http://jwgl.sdust.edu.cn/','Upgrade-Insecure-Requests': '1','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'}r = session.post(login_url, headers=headers, data=data)try:html = etree.HTML(r.text)error = html.xpath('//font[@color="red"]/text()')[0]print(error)except :print(r.text)if __name__ == '__main__':main()

总结分析

首先,来说一下cookie的问题,在爬取需要登录的网站时,一定要加上cookie,不然无法爬取登录后的页面。
对于验证码图片的识别,我们可以先将图片保存到本地,再进行一些图像的基本处理,比如说,二值化、滤波等,这样把处理后的图片交由百度AI去识别,准确率就会提高。还有一个方法就是,针对特定网站的验证码进行模型训练,训练出能够识别出特定网站验证码的AI,不过这个方法较为复杂。

虐猫人薛定谔i 2020年2月4日 写于家中

爬虫模拟登陆强智教务系统相关推荐

  1. 强智教务系统API学习进度条--(以完结)

    前言 想写一个基于微信公众号的课表及成绩查询系统,记录学习过程与实现. 开发环境 IDEA JDK1.8 强智教务系统API文档 API目录 登录 (以实现) 时间信息 (以实现) 课程信息 成绩信息 ...

  2. python3爬虫模拟登录爬取教务系统成绩单(获取cookie操作)

    前言 今天来写写爬取教务系统的爬虫,此次的爬虫目的是爬取教务系统里面的成绩单,涉及到的库依旧是selenium,re,beautifulsoup,Options,今天多了个csv库用来处理爬取的数据, ...

  3. 每日获取强智教务系统课表,并发送短信到学生手机!爬虫真牛逼!

    自从学校换了强智的教务系统后,学校的app的查课表功能基本就报废了,记不住课表的我无奈自己动手. 功能实现:如果当天有课,在当天早上6点30以短信的形式自动发送课表至手机 首先我想的是利用模拟登陆然后 ...

  4. 枯燥的寒假生活(一) python爬虫模拟登录whu老教务系统获取期末考试成绩(已失效 , 老教务系统增加了新的反爬, 老教务系统已停用)

    python模拟登录老教务系统(2021.6.24更新) 一.写在前面 之前用爬虫爬取的都是静态网页html中的内容,但是大多数时候需要动态处理网页爬取数据.因为学校出成绩太慢了,每次都自己打开浏览器 ...

  5. 强智教务系统——获取课表

    两个接口: 获取个人信息以及登录成功后header中的token: http://jwxt.xxx.edu.cn/app.do?method=authUser&xh={$学号}&pwd ...

  6. python3 + selenium 进行强智教务成绩的刷新以及通知成绩(华东理工大学 某ecust)

    强智教务自动刷新教务处成绩,更新后发邮件通知,以某ECUST华理为例子.此处的ECUST华理教务系统是18年9月后的新系统 Windows端或者挂在阿里云上都可以,下文示例是在Ubuntu上运行的. ...

  7. 爬虫_西电研究生教务系统_技术文档

    教务系统爬虫工作初步完成 关于教务系统的一系列爬取工作已经初步完成,Holi爬虫组的工作也算正式进入优化阶段. 我们需要根据后台组的需要,转换成CVS或数据库形式.需要和后台组进行商量. 实现的功能 ...

  8. JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解

    新版正方教务系统登录界面: 目录 一.需求分析 二.模拟登录内网 三.模拟登录教务系统 四.爬取成绩和课表信息 参考文章 一.需求分析   需要访问教务系统,爬取出课表成绩等信息,并在自己所写的APP ...

  9. 模拟登陆新版正方教务管理系统【可以获取学生基本/课表信息】

    写在前面 博主登陆现在还可以正常使用,但是后面登陆成功,获取信息啥的有问题 登陆还是按照学长的来,模拟登陆新版正方教务管理系统 开始 学校教务系统改版,我直接copy博主代码获取学籍那里一直是获取到的 ...

  10. python实用脚本 知乎_Python 爬虫模拟登陆知乎

    在之前写过一篇使用python爬虫爬取电影天堂资源的文章,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...

最新文章

  1. 机器学习入门(06)— 输出层多元分类、softmax 归一化指数函数以及输出层的神经元数量
  2. JVM(Java虚拟机)优化大全和案例实战
  3. 电动力学每日一题 2021/10/10
  4. reactjs组件的生命周期
  5. 【微软亚洲研究院院长洪小文专访---谈大学生实习就业】
  6. Storm 性能优化
  7. 更优雅的 node.js 框架 :nestjs 5.1 发布 ,支持异步动态 modules 。
  8. 安卓原生系统_小米新机曝光,运行原生安卓系统;准!四川宜宾5.3级地震提前14秒预警...
  9. Software--IoC 依赖倒置 控制反转
  10. 通过HttpClient转发/调用HTTP请求
  11. 十行代码训练sklearn七种分类算法
  12. SqlDbx 个人版本使用指定的instant client
  13. ceph osd 批量删除
  14. matlab如何分解矩阵,Matlab中矩阵的分解
  15. 【图像去噪】基于matlab GUI中值滤波图像去噪【含Matlab源码 205期】
  16. 并网光伏发电系统(simulink仿真)
  17. 10个Web移动开发JavaScript框架
  18. 编程学习网站 收集于网络
  19. 消息队列RabbitMQ入门与PHP实战
  20. 地中海?修电脑的?格子衫?那些对程序员的高级黑!!!

热门文章

  1. Android实现九宫格图片控件
  2. c2s三国志java,c2s三国志1.0.0下载_c2s三国志app下载
  3. 郑州大学计算机考研944,2020年郑州大学944计算机技术专业基础综合考研复习资料...
  4. 31岁,追忆似水流年。。。
  5. Spring —— Spring 手册官网下载地址
  6. Python实现抓取CSDN热门文章列表
  7. 618,拼多多玩起流量没阿里、京东啥事了
  8. 前端自学驿站:【建议收藏】css晦涩难懂的点都在这啦
  9. Unity3d 给人物模型添加动画
  10. 服务器oemSN查询系统,查看服务器sn码命令