V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
wenxw1997
V2EX  ›  Python

模拟登录学校教务系统遇到的问题

  •  
  •   wenxw1997 · 2016-09-12 10:24:08 +08:00 via Android · 3955 次点击
    这是一个创建于 2755 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我用浏览器登录学校教务系统查成绩的流程是这样的:
    登录信息门户 xinxi.xxx.edu.cn
    访问教务系统查成绩页面 jiaowu.xxx.edu.cn

    目前用 request 或 cookielib 模拟登录信息门户没问题,信息门户上的东西都能采集,但是访问教务系统显示未登录

    教务系统没有专门的登录入口
    用 firebug 抓包的结果是
    访问信息门户的页面时会抓到一个请求
    jiaowu.xxx.edu.cn/login.do?sessionid=xxxxx(一长串数字),每次登录都不一样

    这种情况下应该怎么模拟登录教务系统呢
    28 条回复    2016-09-13 19:50:05 +08:00
    testpachong
        1
    testpachong  
       2016-09-12 10:27:36 +08:00
    虽然我不懂。但是你用 session
    ss = requests.Session()
    ss.get()
    popok
        2
    popok  
       2016-09-12 10:27:38 +08:00
    那你就找到这个 sessionid 是怎么得到的,是 js 还是 set-cookie 呢,照着他的流程模拟呗
    whwq2012
        3
    whwq2012  
       2016-09-12 11:13:03 +08:00 via Android
    那就先找到这个 session id 是从哪里来的啊
    jpyl0423
        4
    jpyl0423  
       2016-09-12 11:18:21 +08:00
    试试 Fiddler, 应该可以抓到这个 session id 从哪个请求返回的.
    jpyl0423
        5
    jpyl0423  
       2016-09-12 11:19:45 +08:00
    @jpyl0423
    忘了说了, 如果网站是 https 的话, Fiddler 不支持 win10, 只能装个 win7 的虚拟机抓包.
    killerv
        6
    killerv  
       2016-09-12 11:29:31 +08:00
    把整个流程分析一遍,用 chrome 就可以,那个 sessionId 无非是来自 js 、 cookie 这些东西
    hinkal
        7
    hinkal  
       2016-09-12 12:13:38 +08:00
    为什么每个月都有人要爬教务系统然后遇到问题来发帖的?是什么神秘组织的投名状还是什么地方看到的实战练习题吗?不大相信这么多学生不约而同要爬教务系统所以我问问
    smilekung
        8
    smilekung  
       2016-09-12 12:21:04 +08:00
    @hinkal 因为中国高校的教务系统太烂了,爬教务不仅练技术还方便大众啊……还能抓不少学生数据
    a87150
        9
    a87150  
       2016-09-12 12:21:37 +08:00   ❤️ 1
    @hinkal http://cuiqingcai.com/997.html Python 爬虫实战七之计算大学本学期绩点
    大概是这个。
    wenxw1997
        10
    wenxw1997  
    OP
       2016-09-12 12:27:45 +08:00 via Android
    @hinka 我是因为觉得简单啊。我就是想算个平均绩点而已。其实直接在网页上复制到 excel 就可以了,但我还是想试试能不能用 Python 写一个程序,只要输入用户密码就能拿到成绩信息。
    wintercoder
        11
    wintercoder  
       2016-09-12 12:33:24 +08:00
    访问一次首页就会有 302 跳转到那个 sessionid...的链接,你可以在响应的 header 里看到有个链接,通过 header 获得 sessionid....,需要在代码里禁止 302 跳转
    solonF
        12
    solonF  
       2016-09-12 12:40:16 +08:00
    @hinkal 其实我觉得不约而同爬教务系统的现象可能是正常的,比如我就一直(蓄势待发?)((其实是想做但是又不会,其实还蛮希望您所说的神秘组织存在以及完成的哥们做一个完整的 tutorial 来造福以下我这种菜鸟的 XD ))
    ahjsrhj
        13
    ahjsrhj  
       2016-09-12 12:55:07 +08:00 via Android
    我也尝试过爬过 以失败告终
    kylinking
        14
    kylinking  
       2016-09-12 13:00:27 +08:00
    可以用 burp 抓包,请求信息都能列出来
    另外,可以参考这个的模拟登录 https://github.com/kylingit/URP_instructional_evaluation
    practicer
        15
    practicer  
       2016-09-12 13:15:50 +08:00
    如果实在搞不定登录的话,就用 selenium 大法吧,给公司刚写完一个 selenium+phantomjs 的爬虫,用来解决 ajax 网页加载和 304 的问题,楼主可以尝试一下
    zonghua
        16
    zonghua  
       2016-09-12 13:47:57 +08:00 via iPhone
    那个 session 可能是安全狗的设置,需要携带 cookie 才能访问
    zonghua
        17
    zonghua  
       2016-09-12 13:48:59 +08:00 via iPhone
    @ahjsrhj python 字符串编码头疼
    Rememberautumn
        18
    Rememberautumn  
       2016-09-12 14:18:29 +08:00
    是需要跨站登陆,用 Chrome 看一下登陆过程
    mikii
        19
    mikii  
       2016-09-12 14:36:23 +08:00
    @jpyl0423 win10 可以用 fiddler 。
    wenxw1997
        20
    wenxw1997  
    OP
       2016-09-12 14:52:58 +08:00
    没办法一个个 @了,总之感谢以上各位。
    我傻逼了!
    我傻逼了!
    我傻逼了!

    原来 sessionid 是存在 html 源码里的,我之前看了好几次源码都没发现!!!(因为没有把滚动条往右拉)
    总之只要拿到这个 302 前的地址访问一次, cookie 就搞定了,就可以访问成绩页面了。
    yangyanggnu
        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 即可。
    yangyanggnu
        22
    yangyanggnu  
       2016-09-12 15:05:17 +08:00
    昏,已经解决了哇,白码字了 :-(
    wenxw1997
        23
    wenxw1997  
    OP
       2016-09-12 15:08:14 +08:00 via Android
    @yangyanggnu 是这样没错。只不过我之前没认真检查,把显而易见的 token 忽略了。
    chezs66
        24
    chezs66  
       2016-09-12 20:57:44 +08:00 via iPhone
    借楼问问: sessionId 直接放在 url 里好吗?为何不在 header 里呢?
    mingyun
        25
    mingyun  
       2016-09-12 23:03:48 +08:00
    @kylinking
    @zonghua 用 python3
    yangyanggnu
        26
    yangyanggnu  
       2016-09-13 14:21:15 +08:00
    @chezs66

    通常使用 GET 方法就放在 URL 中,使用 POST 方法就放在 header 或者 body 中。
    chezs66
        27
    chezs66  
       2016-09-13 19:22:12 +08:00 via iPhone
    @yangyanggnu
    按理说, get 方法时 session ID 也能放在 header 里。
    chezs66
        28
    chezs66  
       2016-09-13 19:50:05 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5431 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 06:54 · PVG 14:54 · LAX 23:54 · JFK 02:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.