Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5824
  • 博文数量: 8
  • 博客积分: 495
  • 博客等级: 下士
  • 技术积分: 85
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-01 19:48
文章分类

全部博文(8)

文章存档

2010年(8)

我的朋友
最近访客

分类: Python/Ruby

2010-05-25 17:50:33

考完试后就总是会不自觉得登上学校的选课系统去查询成绩,可是老是要打开浏览器去登陆系统也是比较麻烦的事,就思索着自己写一个脚本来查询成绩。刚好这些天在看python,用它来实现这方面的应用还是比较简单的。

其实总的说来就是要获取到查看成绩的那个页面,然后再分析得到里面的相关数据并显示出来。

抓取页面涉及到登陆跟cookie的问题,这里用的是urllib2和cookie这两个模块。

由于要保存登陆后的cookie,所以需要先提取出来。

Python语言:
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)

这样通过urllib2来模仿登陆后就能获得相应的cookie了,这时才能接着下一步去获取对应的成绩页面。

因为我们需要登陆后才能获得相应的页面。这时候就用到urllib2模块了,用它可以实现向url发送一些数据,其实在网站上登陆也就是把相应的数据发送到服务器上,然后通过验证后再获得对应的cookie,这样下次发出请求时服务器就能通过cookie识别出用户并做出应答。

Python语言:
url = ''
values = {'name' : 'Michael Foord',
'location' : 'Northampton',
'language' : 'Python' }

data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()

上面代码就是向服务器发送数据的代码。values这个字典变量保存了我们所填取的数据,如你所知都是一些键值对,键值就是所填的表单的名字,然后发送时要经过标准方式编码,这是由urllib.urlencode()完成的。

接下去用urllib2获取相关页面时就会自动替换头部中cookie的值,这样就能够得到应答了。

获取到成绩页面后,其实得到的也就是一个HTML文档,这时候还得通过分析来提取出我们相要的那些数据。

为了从HTML文档中提取数据,要将SGMLParser类进行子类化,然后对想要捕捉的标记或实体定义方法。

Python语言:
01 class URLLister1(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给封掉了(=_=!幸好过些时间就解封了)。

阅读(126) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~