Python Tech

用Python登录正方系统获取课表

没想到毕业之后还会折腾这破玩意。大学时用RGSS语言完成过一个类似的功能(虽然最近才知道它和Ruby语言有关),但没用Python写过。其实代码完全没难度,但这套系统很讨厌,它用.NET语言写成,出现最多的是页面是“当前访问人数过多,请稍后访问”,系统开发者最擅长的是制作登录界面,一口气做了5个(这得多闲啊……)。其中的default3.aspx不需要验证码。登录时必须带一个叫__VIEWSTATE参数,推测是系统自动生成,每隔一段时间会更换。

所以与其说我是分享Python代码,不如说我是分享正方系统的彩蛋来得准确。但好歹功能代码是Python的,总之都是非常基础的功能,包括:

  • urllib和urllib2的使用
  • 登录之后保存cookie
  • 用BeautifulSoup(新版是bs4)分析页面内容
    • 以上,直接贴代码:

      
      import random
      import urllib
      import urllib2
      import cookielib
      from BeautifulSoup import BeautifulSoup
      
      _xh = '学号'
      _pw = '密码'
      login_url = 'http://网址/default3.aspx'
      #课表的网址
      timetable_url = 'http://网址/xskbcx.aspx?xh=%s'% _xh 
      student_cookie = cookielib.CookieJar()
      opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(student_cookie)) # Login
      
      data = '__VIEWSTATE='+VIEWSTATE+'&TextBox1='+_xh+'&TextBox2='+_pw+'&ddl_js=%D1%A7%C9%FA&Button1=+%B5%C7+%C2%BC+'
      login_request = urllib2.Request(login_url, data, {
                          'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
                          'Accept-Charset': 'UTF-8,*;q=0.5',
                          'User-Agent': USER_AGENT, 
                          'Content-Type': 'application/x-www-form-urlencoded',
                          'Connection': 'keep-alive',
                          'HOST': '网址',
                          'Origin':  'http://网址',
                          'Referer': 'http://网址/default3.aspx'})
      opener.open(login_request, data)
      
      html = opener.open(timetable_url).read()
      

      获得html之后用BeautifulSoup解析,先找到table标签,然后通过id获取DOM:

      
      soup = BeautifulSoup(html, fromEncoding='gbk')
      table = soup.find("table", {"id": "Table1"})
      

      搞定了,欢迎各位以此为基础制作各种选课程序。= =v

0 0 投票数
文章评分
订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

8 评论
最新
最旧 最多投票
内联反馈
查看所有评论
jwfy
jwfy
10 年 前

这里如何获取那个_VIEWSTATE的值,代码里面太长了,而且还是不一样的,虽然每个人自身都是固定的,但是每个人之间都是不一样的

Silent_Voyage
10 年 前

用viewstate hacker可以看viewstate是什么内容,结果发现就是一个xml表单 = =!

张卫同学
11 年 前

这里提示 NameError: name ‘VIEWSTATE’ is not defined 是怎么个情况?

张卫同学
11 年 前
回复给  Perchouli

我知道这个参数,它在一小段时间里是固定的,这个参数能自动获得吗?