爬虫模拟登陆强智教务系统
爬虫模拟登陆强智教务系统
- 引言
- 思路分析
- 完整代码
- 总结分析
引言
面对疫情,我可以做什么呢?
面对疫情,我可以每天睡到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日 写于家中
爬虫模拟登陆强智教务系统相关推荐
- 强智教务系统API学习进度条--(以完结)
前言 想写一个基于微信公众号的课表及成绩查询系统,记录学习过程与实现. 开发环境 IDEA JDK1.8 强智教务系统API文档 API目录 登录 (以实现) 时间信息 (以实现) 课程信息 成绩信息 ...
- python3爬虫模拟登录爬取教务系统成绩单(获取cookie操作)
前言 今天来写写爬取教务系统的爬虫,此次的爬虫目的是爬取教务系统里面的成绩单,涉及到的库依旧是selenium,re,beautifulsoup,Options,今天多了个csv库用来处理爬取的数据, ...
- 每日获取强智教务系统课表,并发送短信到学生手机!爬虫真牛逼!
自从学校换了强智的教务系统后,学校的app的查课表功能基本就报废了,记不住课表的我无奈自己动手. 功能实现:如果当天有课,在当天早上6点30以短信的形式自动发送课表至手机 首先我想的是利用模拟登陆然后 ...
- 枯燥的寒假生活(一) python爬虫模拟登录whu老教务系统获取期末考试成绩(已失效 , 老教务系统增加了新的反爬, 老教务系统已停用)
python模拟登录老教务系统(2021.6.24更新) 一.写在前面 之前用爬虫爬取的都是静态网页html中的内容,但是大多数时候需要动态处理网页爬取数据.因为学校出成绩太慢了,每次都自己打开浏览器 ...
- 强智教务系统——获取课表
两个接口: 获取个人信息以及登录成功后header中的token: http://jwxt.xxx.edu.cn/app.do?method=authUser&xh={$学号}&pwd ...
- python3 + selenium 进行强智教务成绩的刷新以及通知成绩(华东理工大学 某ecust)
强智教务自动刷新教务处成绩,更新后发邮件通知,以某ECUST华理为例子.此处的ECUST华理教务系统是18年9月后的新系统 Windows端或者挂在阿里云上都可以,下文示例是在Ubuntu上运行的. ...
- 爬虫_西电研究生教务系统_技术文档
教务系统爬虫工作初步完成 关于教务系统的一系列爬取工作已经初步完成,Holi爬虫组的工作也算正式进入优化阶段. 我们需要根据后台组的需要,转换成CVS或数据库形式.需要和后台组进行商量. 实现的功能 ...
- JSoup模拟登录新版正方教务系统(内网-教务系统)获取信息过程详解
新版正方教务系统登录界面: 目录 一.需求分析 二.模拟登录内网 三.模拟登录教务系统 四.爬取成绩和课表信息 参考文章 一.需求分析 需要访问教务系统,爬取出课表成绩等信息,并在自己所写的APP ...
- 模拟登陆新版正方教务管理系统【可以获取学生基本/课表信息】
写在前面 博主登陆现在还可以正常使用,但是后面登陆成功,获取信息啥的有问题 登陆还是按照学长的来,模拟登陆新版正方教务管理系统 开始 学校教务系统改版,我直接copy博主代码获取学籍那里一直是获取到的 ...
- python实用脚本 知乎_Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的文章,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
最新文章
- 机器学习入门(06)— 输出层多元分类、softmax 归一化指数函数以及输出层的神经元数量
- JVM(Java虚拟机)优化大全和案例实战
- 电动力学每日一题 2021/10/10
- reactjs组件的生命周期
- 【微软亚洲研究院院长洪小文专访---谈大学生实习就业】
- Storm 性能优化
- 更优雅的 node.js 框架 :nestjs 5.1 发布 ,支持异步动态 modules 。
- 安卓原生系统_小米新机曝光,运行原生安卓系统;准!四川宜宾5.3级地震提前14秒预警...
- Software--IoC 依赖倒置 控制反转
- 通过HttpClient转发/调用HTTP请求
- 十行代码训练sklearn七种分类算法
- SqlDbx 个人版本使用指定的instant client
- ceph osd 批量删除
- matlab如何分解矩阵,Matlab中矩阵的分解
- 【图像去噪】基于matlab GUI中值滤波图像去噪【含Matlab源码 205期】
- 并网光伏发电系统(simulink仿真)
- 10个Web移动开发JavaScript框架
- 编程学习网站 收集于网络
- 消息队列RabbitMQ入门与PHP实战
- 地中海?修电脑的?格子衫?那些对程序员的高级黑!!!
热门文章
- Android实现九宫格图片控件
- c2s三国志java,c2s三国志1.0.0下载_c2s三国志app下载
- 郑州大学计算机考研944,2020年郑州大学944计算机技术专业基础综合考研复习资料...
- 31岁,追忆似水流年。。。
- Spring —— Spring 手册官网下载地址
- Python实现抓取CSDN热门文章列表
- 618,拼多多玩起流量没阿里、京东啥事了
- 前端自学驿站:【建议收藏】css晦涩难懂的点都在这啦
- Unity3d 给人物模型添加动画
- 服务器oemSN查询系统,查看服务器sn码命令