Python实现方正教务系统爬虫过程中遇到的坑与解决方案

一些信息没有打码,请不要喷我。

教务系统网站: http://211.83.241.81/jwglxt/xtgl/login_slogin.html

感谢 https://www.v2ex.com/t/433971#reply11 几位经验丰富前辈的指点,才让我少走了些弯路。

有一些坑,主要是 Cookie 会话保持,以及密钥与时间参数的关系等等。

代码写的较丑,就不敢开源了。。。。


Python实现方正教务系统爬虫过程中遇到的坑与解决方案

66 回复

表格不错


我做过类似的爬虫,方正教务系统确实有不少坑。主要问题集中在登录验证、动态参数和Session管理上。

1. 登录验证码处理 方正系统通常有验证码,需要先获取session再识别:

import requests
from PIL import Image
import pytesseract

session = requests.Session()
# 先获取验证码图片
captcha_url = "http://jwxt.example.com/verifycode.servlet"
response = session.get(captcha_url)
with open('captcha.jpg', 'wb') as f:
    f.write(response.content)

# OCR识别(准确率不高,建议手动输入)
captcha = input("请输入验证码:")

2. 动态参数问题 登录时需要提交一堆隐藏参数,得先解析登录页:

from bs4 import BeautifulSoup

login_url = "http://jwxt.example.com/login.jsp"
resp = session.get(login_url)
soup = BeautifulSoup(resp.text, 'html.parser')

# 提取隐藏字段
hidden_inputs = soup.find_all('input', {'type': 'hidden'})
form_data = {inp['name']: inp['value'] for inp in hidden_inputs}

# 添加账号密码和验证码
form_data.update({
    'zjh': '你的学号',
    'mm': '你的密码',
    'v_yzm': captcha
})

3. Session保持 登录后要维持session,所有后续请求都要用同一个session对象:

# 登录
login_post_url = "http://jwxt.example.com/loginAction.do"
session.post(login_post_url, data=form_data)

# 后续请求都用这个session
grade_url = "http://jwxt.example.com/gradeQuery.do"
grades = session.get(grade_url)

4. 编码问题 遇到乱码时设置编码:

resp.encoding = 'gbk'  # 或'utf-8',具体看网页meta标签

5. 超时和重试 网络不稳定时加个重试机制:

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.util.retry import Retry

retry_strategy = Retry(total=3, backoff_factor=1)
adapter = HTTPAdapter(max_retries=retry_strategy)
session.mount("http://", adapter)
session.mount("https://", adapter)

总结:关键是处理好session和动态参数。

表格是用的 Texttable,IDE 中输出会导致表格错乱。后来调试半天,才去看了源代码,发现应该是全角和半角中文宽度计算的问题。

之前年轻的时候写过一篇很中二的文章 233

https://blog.scnace.me/一次爬方正教务处的成功实践 /

我们教务处正在从您这篇文章的版本迁移到新的版本,据说是 Java 写的。还有 2017 年,今年 2018,年轻的时候???? 黑人问号.jpg

是啊 工作一年感觉老了很多啊

我记得正方教务有个提权漏洞,之后上传 ashx 后就有了 webshell,可以脱裤

表名都是拼音吓尿

界面挺漂亮,,赞

#4 朋友之前在正方做项目实施经理,旧版的写的真是稀烂,在浪潮的云平台上,开 32 虚拟核机器,选课时有个后台进程会频繁挂起,最后解决方案是开 64 虚拟核的机器

(虽然很大原因是浪潮云平台之前不能绑定虚拟核到物理核

……问一下,正方的课表难道不是跟青果一样,绘制的图片吗……
青果的还故意加了躁点防 OCR …

刚迁到新版 Java 的话,那你要抓住机会,看下图片请求如果是学号做参数的话,是没有做校验的,建议爬取学校妹子多的院

顺便说下,如果学校的图书是老汇文的话,是可以直接 getshell,里面会有性别和学号,配合一下就能:D

半个校友……这个正方系统看起来好高端……

主贴就一个 terminal 截屏啊。。你们都看到的什么界面 table 的。。

我也做过相关的 不过我更偏向于抢课 post 的发送
项目中的 cookies 是怎么保存的?

已经做了权限控制,我第一件事情就是干这个。。。

requests.session(),自动管理 Cookies

再回复下,只要登陆进去,选课,查成绩都能做。

难怪旧版的教务系统,一到选课的时候就崩了。

似乎是 12 年时候的事情

我拿着个做的毕设,其中一个功能就是能从微信上查课表,查成绩,哈哈,我们系统只能校园网访问

新版教务系统是 XHR 请求数据的,返回来的结果都是 JSON 数据,没图片呀。。。

表示也做了这个新版教务系统的爬虫,登录部分的加密用 python 实现了。不过正方无论旧版新版,人多都会挂掉。

#18 哦哦 可能是需求不同 我希望将 cookie 储存下来多次使用 目前使用的方法是 pickle 将 cookie 对象直接存储下来

想想我在大学的时候用易语言去爬正方……

学校不缺机器,缺能把机器利用起来的代码…性能差一点不要紧,我们用设备来补

emmm …青果的事返回的是绘制的图…而且加了躁点…

方正下一个煎蛋

也写过类似的,不过我校教务系统选课是直接在 js 里把课表写进去的,根本没有 json 这种东西…

并且它的登陆逻辑是有问题的,填完一次验证码后就能多次尝试登陆,按照大多数人的习惯,如果还是六位数密码,那么最多跑 10**6 次就肯定能破出密码来

正方是直接输出文字不是绘制图片

突然感觉年轻真好啊…自己都苍老了好多了

那就非常简单了……

新版的直接是 json 数据了,一下子减少了很多代码量

是啊,哪跟傻 13 青果…竟然是绘图…还故意加躁点干扰……自己出的 App 也用不成…真的渣

emmmm 我毕业设计里面有部分,学生课表的获取就模拟登录方正教务系统,我当时用过的解析 html 的的方式

相当 Nice 了,俺们学校用的也是这一版本的, 感谢则个 (好像" 则个 "用的不标准)

很期待楼主的开源

如果遇到封 ip 可以使用代理 或者重启路由器 https://github.com/hizdm/dynamic_ip

不仅仅是开源,还会写文章遇到的问题以及如何解决的,对一些代码进行说明。

requests 库中也有相关方法保存与载入 Cookies 的,不需要把整个对象持久化。您可以查阅下官方文档。

最坑的应该是抢课吧,写过验证码识别和抢课的

这个系统的 Windows 客户端登陆验证是把密码发到本地验证,而不是在服务器上,你敢信?

同希望楼主开源,与楼主同教务系统,因对 JS 不懂所以不了解密码的加密方式一直模拟登录不了,只能依靠 cookies.

好的呢,晚上整理下代码就发出来。

我们学校教育系统不能直接登录,需要通过信息门户进入教务系统

哎,教务系统每一年都要被新人艹一遍。那是逝去的青春呀

作为渣渣的我 也有一个抢课的文章
https://axu0411.github.io/2017/09/16/ZhengFang-qiangke/
大佬们不要喷我

我们学校教务系统在公网 ip 上,明文传输密码,2333

同教务系统,楼主能发下处理 rsa 加密那段代码吗

我来了。。。。。。

我们有验证码

想起了我们学校正方教务系统里满满的后门。。基本都是上传 ashx 拿到的 webshell

#50 emmmmmm

晚上就整理发出来

每年都有几个搞学校爬虫的

把这个弄到 ios 上的日历上去吧。。这个算有点用了

xxl-crawle 面向对象爬虫框架

当年是青果。。。
早期是 html,后来换图片了,但是更简单了。。。

我们学校有验证码 哈哈哈哈哈哈

验证码自己手动输入就好了

以前写过爬正方教务系统成绩的,后来发现登录进去首页右下角就有成绩了 23333

#59
#60
这一版本的验证码不是必填项,至少我们学校的是这样,post 字段留空即可

老哥代码整理好了吗

看最新 APPEND 的内容呀

哦哦看到了谢谢老哥

回到顶部