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

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

    通常使用 GET 方法就放在 URL 中,使用 POST 方法就放在 header 或者 body 中。
    chezs66
        27
    chezs66  
       2016 年 9 月 13 日 via iPhone
    @yangyanggnu
    按理说, get 方法时 session ID 也能放在 header 里。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2649 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 11:30 PVG 19:30 LAX 03:30 JFK 06:30
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86