改进于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?¤t.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)