1
testpachong 2016-09-12 10:27:36 +08:00
虽然我不懂。但是你用 session
ss = requests.Session() ss.get() |
2
popok 2016-09-12 10:27:38 +08:00
那你就找到这个 sessionid 是怎么得到的,是 js 还是 set-cookie 呢,照着他的流程模拟呗
|
3
whwq2012 2016-09-12 11:13:03 +08:00 via Android
那就先找到这个 session id 是从哪里来的啊
|
4
jpyl0423 2016-09-12 11:18:21 +08:00
试试 Fiddler, 应该可以抓到这个 session id 从哪个请求返回的.
|
5
jpyl0423 2016-09-12 11:19:45 +08:00
@jpyl0423
忘了说了, 如果网站是 https 的话, Fiddler 不支持 win10, 只能装个 win7 的虚拟机抓包. |
6
killerv 2016-09-12 11:29:31 +08:00
把整个流程分析一遍,用 chrome 就可以,那个 sessionId 无非是来自 js 、 cookie 这些东西
|
7
hinkal 2016-09-12 12:13:38 +08:00
为什么每个月都有人要爬教务系统然后遇到问题来发帖的?是什么神秘组织的投名状还是什么地方看到的实战练习题吗?不大相信这么多学生不约而同要爬教务系统所以我问问
|
9
a87150 2016-09-12 12:21:37 +08:00 1
|
10
wenxw1997 OP @hinka 我是因为觉得简单啊。我就是想算个平均绩点而已。其实直接在网页上复制到 excel 就可以了,但我还是想试试能不能用 Python 写一个程序,只要输入用户密码就能拿到成绩信息。
|
11
wintercoder 2016-09-12 12:33:24 +08:00
访问一次首页就会有 302 跳转到那个 sessionid...的链接,你可以在响应的 header 里看到有个链接,通过 header 获得 sessionid....,需要在代码里禁止 302 跳转
|
12
solonF 2016-09-12 12:40:16 +08:00
@hinkal 其实我觉得不约而同爬教务系统的现象可能是正常的,比如我就一直(蓄势待发?)((其实是想做但是又不会,其实还蛮希望您所说的神秘组织存在以及完成的哥们做一个完整的 tutorial 来造福以下我这种菜鸟的 XD ))
|
13
ahjsrhj 2016-09-12 12:55:07 +08:00 via Android
我也尝试过爬过 以失败告终
|
14
kylinking 2016-09-12 13:00:27 +08:00
可以用 burp 抓包,请求信息都能列出来
另外,可以参考这个的模拟登录 https://github.com/kylingit/URP_instructional_evaluation |
15
practicer 2016-09-12 13:15:50 +08:00
如果实在搞不定登录的话,就用 selenium 大法吧,给公司刚写完一个 selenium+phantomjs 的爬虫,用来解决 ajax 网页加载和 304 的问题,楼主可以尝试一下
|
16
zonghua 2016-09-12 13:47:57 +08:00 via iPhone
那个 session 可能是安全狗的设置,需要携带 cookie 才能访问
|
18
Rememberautumn 2016-09-12 14:18:29 +08:00
是需要跨站登陆,用 Chrome 看一下登陆过程
|
20
wenxw1997 OP 没办法一个个 @了,总之感谢以上各位。
我傻逼了! 我傻逼了! 我傻逼了! 原来 sessionid 是存在 html 源码里的,我之前看了好几次源码都没发现!!!(因为没有把滚动条往右拉) 总之只要拿到这个 302 前的地址访问一次, cookie 就搞定了,就可以访问成绩页面了。 |
21
yangyanggnu 2016-09-12 15:03:49 +08:00
你描述的流程是只要登录信息门户( xinxi.xxx.edu.cn )后,再访问教务系统查成绩页面( jiaowu.xxx.edu.cn )无需再次登录,这类单点登录的模式常见于 4A 系统中,免去个人用户分别管理多个业务系统的账号 /密码的麻烦,其中,门户系统的账号称为主账号、教务系统的账号称为从账号。
门户系统为教务系统统一认证,一般有两种实现方式: 0 )(门户系统中_未存放_教务系统的密码)用户登录门户系统后,第一步,门户系统在服务端生成 token ,第二步,门户系统在服务端将 token 发给教务系统服务端,门户系统在服务端将 token 下发给用户客户端(浏览器),第三步,用户客户端拿着 token 去请求教务系统页面,第四步,教务系统服务端比对门户服务端发过来的 token 和客户端提交上来的 token 是否一致,若一至则完成教务系统鉴权并将结果 set-cookie ,反之亦然; 1 )(门户系统中_已存放_教务系统的密码)用户登录门户系统后,第一步,门户系统在服务端将预先存放的教务系统账号 /密码发给教务系统鉴权;第二步,教务系统自行完成鉴权。 显然,前者更优,做到了真正意义上的单点登录,免去主定期同步从系统账号 /密码的麻烦。具体到你说的场景中,抓取的 jiaowu.xxx.edu.cn/login.do?sessionid=xxxx ,我猜测也是采用的第一种实现方式, sessionid 等同于 token ,所以,如果你要通过爬虫访问教务系统,只要把登录门户后下发给客户端的 sessionid 提取出来,拼装进 jiaowu.xxx.edu.cn/login.do?sessionid=xxxx 后提交,然后提取教务系统鉴权完成后下发给客户端的 set-cookie ,后续的任何教务系统页面请求均带上该 set-cookie 即可。 |
22
yangyanggnu 2016-09-12 15:05:17 +08:00
昏,已经解决了哇,白码字了 :-(
|
23
wenxw1997 OP @yangyanggnu 是这样没错。只不过我之前没认真检查,把显而易见的 token 忽略了。
|
24
chezs66 2016-09-12 20:57:44 +08:00 via iPhone
借楼问问: sessionId 直接放在 url 里好吗?为何不在 header 里呢?
|
26
yangyanggnu 2016-09-13 14:21:15 +08:00
|
27
chezs66 2016-09-13 19:22:12 +08:00 via iPhone
@yangyanggnu
按理说, get 方法时 session ID 也能放在 header 里。 |
28
chezs66 2016-09-13 19:50:05 +08:00
|