苏大学的信息门户和选课系统是由方正公司完成的,发现最近和之前的选课系统有着些许的不同,好像做过一些安全加强。所以想着看能否通过Python的爬虫将学生的课程表和成绩都给爬下来,话不多说现在开始。

另外这是我第一个写爬虫,不喜勿喷

选课系统分析

登录系统

首先要完成的就是登陆系统的进入,可以通过Python模拟用户登录来实现,在整个过程中,主要是通过fiddler这个工具来实现,首先登录界面的地址是http://my.ujs.edu.cn/login.portal
UJS1
UJS2

这两个地址就是登陆界面的核心分别是http://my.ujs.edu.cn/captchaGenerate.portal?s=0.11031588373022694http://my.ujs.edu.cn//userPasswordValidate.portal

第一个地址是用来生成验证码来完成验证请求的,第二个地址可以看到方式是POST请求,所以我当时就猜测这个是用来发送用户名,密码和验证码的地址。
UJS3

可以非常请求的看到,验证了我们之前的猜想,果真向这个地址发送了我们的学号,密码和验证码,只要我们发送对应的POST请求即可完成登录操作,登录完成后服务器会返回<script type="text/javascript">(opener || parent).handleLoginSuccessed();</script>

选课系统

现在的选课系统和之前的选课系统是有不同的,不像之前拥有登录cookie即可,现在进入选课系统的同时,会根据用户名和cookie计算出一个验证值,必须在url中加上对应的验证值才能访问到数据,否则就会爬不到任何数据。关于这一点我卡了很久,最后我通过抓包发现有302重定向,那么只需要获得重定向后的Location url即可。同样这个问题也就迎刃而解

# 获取用户名字,来做二次验证
    response_name = session.get(url="http://my.ujs.edu.cn/index.portal", headers=headers_name)
    html = etree.HTML(response_name.text)
    result = html.xpath("//div[@id='topMenu']/div")
    name = result[2].text.partition(",")[0]

    response_test = session.get(url="http://xk1.ujs.edu.cn/default_zzjk.aspx", headers=headers_test)
# 获得选课系统的服务器返回的数字
    url1 = response_test.url.rpartition("/")[0]

关于课表和成绩

课表很简单,只需要get对应的url即可。唯一的验证就是之前服务器返回的一串数字

然而成绩的话需要post,通过抓包可以找到,除了需要我们之前的学号,密码,以及个人姓名的GBK编码以外。还需要一个值__VIEWSTATE,这个值暂时不得知是怎么计算的。但是在我们第一次登陆到选课系统的时候,这个值就会存在于form中,我们只需要通过XPATH匹配出来即可,然后放在post的data当中即可

response5=session.post(url3,headers=headers,data=data)
html = etree.HTML(response5.text)
result = html.xpath("//*[@id='Form1']/input[3]/@value")[0]

这里的result即是__VIEWSTATE的值

需要用到的库

PIL
requests
BeautifulSoup
datetime
urllib
os
请通过pip install自行安装即可

效果

UJS4
UJS5
UJS6

源码已经放在github上,欢迎给我start~

GitHub watchers GitHub stars

版权声明:本文为原创文章,版权归 heroyf 所有
本文链接: https://heroyf.club/2018/11/python_ujs/


“苹果是给那些为了爱选择死亡的人的奖励”