自动查询成绩的小玩意
时间:2010-05-25 来源:colaghost
考完试后就总是会不自觉得登上学校的选课系统去查询成绩,可是老是要打开浏览器去登陆系统也是比较麻烦的事,就思索着自己写一个脚本来查询成绩。刚好这些天在看python,用它来实现这方面的应用还是比较简单的。
其实总的说来就是要获取到查看成绩的那个页面,然后再分析得到里面的相关数据并显示出来。
抓取页面涉及到登陆跟cookie的问题,这里用的是urllib2和cookie这两个模块。
由于要保存登陆后的cookie,所以需要先提取出来。
2 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
3 urllib2.install_opener(opener)
这样通过urllib2来模仿登陆后就能获得相应的cookie了,这时才能接着下一步去获取对应的成绩页面。
因为我们需要登陆后才能获得相应的页面。这时候就用到urllib2模块了,用它可以实现向url发送一些数据,其实在网站上登陆也就是把相应的数据发送到服务器上,然后通过验证后再获得对应的cookie,这样下次发出请求时服务器就能通过cookie识别出用户并做出应答。
2 values = {'name' : 'Michael Foord',
3 'location' : 'Northampton',
4 'language' : 'Python' }
5
6 data = urllib.urlencode(values)
7 req = urllib2.Request(url, data)
8 response = urllib2.urlopen(req)
9 the_page = response.read()
上面代码就是向服务器发送数据的代码。values这个字典变量保存了我们所填取的数据,如你所知都是一些键值对,键值就是所填的表单的名字,然后发送时要经过标准方式编码,这是由urllib.urlencode()完成的。
接下去用urllib2获取相关页面时就会自动替换头部中cookie的值,这样就能够得到应答了。
获取到成绩页面后,其实得到的也就是一个HTML文档,这时候还得通过分析来提取出我们相要的那些数据。
为了从HTML文档中提取数据,要将SGMLParser类进行子类化,然后对想要捕捉的标记或实体定义方法。
02 def reset(self):
03 SGMLParser.reset(self)
04 self.result = []
05 self.open = False
06 def start_tr(self, attrs):
07 id = [v for k, v in attrs if k=='class']
08 if 'alt' in id:
09 self.open = True
10 def handle_data(self, text):
11 if self.open:
12 self.result.append(text)
经过分析提取后,最后得到的才是我们想要的那些成绩的数据。
这是查询成绩的显示,没有经过格式化,懒得去搞了,能看就行了。
其实整个过程并不顺利,因为在抓取页面时一些网站会分析协议包的头部,要是Referer的值不是指向它的网站的URL时,就不会做出应答。我们学校的网站就是这样,就因为这个小小的问题不断地在试,有好几次还因为忘了替换User-Agent的值,被学校的服务器误以为是在对它做IPC$攻击,还把我的IP给封掉了(=_=!幸好过些时间就解封了)。