python 爬虫 教务系统模拟登陆 并下载课表

改进于http://blog.csdn.net/sbw6788778/article/details/50799603

一、使用requests模块,通过POST提交表单的形式登陆
1、登陆南邮智慧校园,使用谷歌浏览器等工具进行抓包,查看提交给服务器的请求地址和表单信息

这里写图片描述
这里写图片描述

其中username password 为账号密码, lt 为动态变化的参数,这个参数是从登陆的页面获得的,在页面中的源码中如下

这里写图片描述
execution参数是执行的次数,每次访问这个页面时,e后面的计数会加一,不过设置成固定的值好像是没有影响的,其他两个参数是固定的。
登陆后,要保持登陆状态,使用requests.Session()的方法保持登陆的cookie

2、下载课表
点击打开或保存为EXCEL文件,发现保持下来的是.jsp的文件
这里写图片描述
发现浏览器向这个url发出了post
这里写图片描述
提交的表单是
这里写图片描述
知道表单的信息后,就可以自己构造表单来提交,并保存下来
完整代码如下

# coding:utf-8
import requests
import re

#登陆地址
url_login = 'http://ids6.njupt.edu.cn/authserver/login? service=http://my.njupt.edu.cn/login.do'

#登陆表单提交的地址
login_post = 'http://ids6.njupt.edu.cn/authserver/login?service=http%3A%2F%2Fyjs.njupt.edu.cn%2Fepstar%2Fweb%2Fswms%2Fmainframe%2Fhome.jsp'

# 保持登陆状态的cookie
z = requests.Session()
z.headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}

#----------------------构造登陆表单----------
s = z.get(url_login)
html = s.text
pattern_lt = r'name="lt" value="(.*?)"'
lt = re.findall(pattern_lt, html)  # 使用正则表达式匹配
print lt
login_data = {
    'username': '学号',
    'password': '密码',
    'lt':lt,
    'dllt':'userNamePasswordLogin',
    'execution':'e1s1',
    '_eventId':'submit',
    'rmShown':'1'
}

#-------------提交登陆表单--------------------
s1 = z.post(url=login_post, data=login_data)

# ----------------检测是否登陆成功--------------
# 登陆成功后显示的网址是http://my.njupt.edu.cn/index.do
s2 = z.get(url_login)
print s2.url  

#---------------------请求课表信息,并保存-----------------
# 请求课表post的地址
course_post = 'http://yjs.njupt.edu.cn/epstar/yjs/T_PYGL_KWGL_WSXK/T_PYGL_KWGL_WSXK_XSKB_NEW.jsp?&current.model.id=aa5u2-5qit61-ga0dny4n-1-gb0irwbr-ffc'
#表单数据
request_data = {
    'excel':'true',
    'XQDM':'31',
    'XH':'学号'
}

# 保存返回的数据
req = z.post(url=course_post, data=request_data, stream=True)
with open('test3.jsp', 'w') as f:
    f.write(req.content)


猜你喜欢

转载自blog.csdn.net/qq8677/article/details/71512469
今日推荐