人生苦短,我用Python(一)— 爬取大连理工大学教务系统获取成绩

前面的前面

之前租了搬瓦工的VPS,申请了域名,搭建了WP博客。由于维护起来成本比较大,自己又很懒不经常写博客,就打算弃用WP换成第三方CSDN,VPS用来跑点服务、脚本神马的,所以特地花了两天时间把仅有的几篇博文搬运过来。

写在前面

这几天忙交换生学分兑换的事情,隔三差五就要上教务看下成绩信息,但最近一次登陆发现竟然要填对老师的教学评价才能看成绩和课表。话说课都没上完,而且有的课连老师都没见过你让我怎么评价嘛!

本着对老师教学负责的态度,博主向来是坚决不能容忍20个逗号完成教学评价任务这种行为的……
你确定你是认真的?
而且,作为一只合格程序猿,教务用填教学评价的方式阻止你看成绩,你能轻易妥协吗?所以我们选择用我们的方式,跳过填写过程,直接获取自己的成绩。

!!!敲黑板,敲黑板,运行环境为Python 2.7版本,代码你直接复制、粘贴去用可能会有问题,缩进、标签神马的,所以可以看完教程去文末的GitHub链接下载工程。其实一共就20来行代码,还是自己敲吧……

言归正传,虽然代码量很少,注释也很详细,但Python小白仔细读一读还是能学到知识的。相信如果是有心人,通过这个小例子对加深Cookie的理解和使用还是很有帮助的。

什么是Cookie?

Cookie(Cookies)百度百科定义:某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。

Cookies最典型的应用是判定注册用户是否已经登录网站。

个人理解:Cookie就是浏览器记录的少量用户信息,比如,账号、密码。当你用一些软件清理垃圾的时候,它可能会提醒你是否要清除浏览器cookie,如果你清理掉,下次再登陆这个网页加载会变慢,而且需要重输账号、密码。(如果你经常玩网页版三国杀又喜欢定期清理电脑垃圾,懂了吧……)

为什么要使用Cookie?

举个简单例子,你的女神借用你的电脑登陆了一下qq空间,如果你能获取到这个期间的登陆状态(也就是Cookie),再利用保存的cookie就可以达到抓取女神qq空间、腾讯微博以及所有需要qq账号、密码的页面数据,而在登陆之前,想要获取这些数据是被拒绝的,或者你只能爬出空白的登陆页面。(Ps:都是理论上,毕竟没有女神借用过我的电脑……)

直接上代码,注释很详细了

# coding:utf-8

import urllib
import urllib2
import cookielib

filename = 'cookie.txt'
#声名一个MozillaCookieJar对象实例来保存cookie,之后写入文件
cookie = cookielib.MozillaCookieJar(filename)
#构造可以处理cookie的opener,基本的urlopen()已经不能满足要求了
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#构建 ‘学号-密码’ 数据字典,自己的学号密码
postdata = urllib.urlencode({'zjh':'xxxxxxxxx','mm':'xxxxxxxx'})
#登陆教务系统URL,获取方法在下面
loginUrl = 'http://zhjw.dlut.edu.cn/loginAction.do'
#模拟登陆,并把cookie保存到变量
result = opener.open(loginUrl, postdata)
#保存到.txt文件
cookie.save(ignore_discard=True, ignore_expires=True)

#利用cookie请求访问另一个网址:成绩查询网址
#大工教务用的是iframe框架,获取方法简单粗暴,往下看
gradeFrame = 'http://zhjw.dlut.edu.cn/gradeLnAllAction.do?type=ln&oper=fainfo&fajhh=6745'
result = opener.open(gradeFrame)
#将爬取的数据写入文件
fout = open('Grade.html','w')
fout.write(result.read())
fout.close()

有几点还是特别提醒一下

  • loginUrl的获取方法
    loginUrl的获取方法

    1. 这是登陆之后利用F12或者右键审查元素查到的,如果写成 loginUrl = ‘http://zhjw.dlut.edu.cn’(登录页面的url)是得不到cookie的,想想就知道,你都没登陆,怎么去获得登录的状态。
    2. From Data 告诉了我们数据字典的键名(key),如果你想试试别的网站,记得去改这个。
    3. 跑代码之前要换成自己的学号密码,别以为我傻~
  • gradeFrame的获取方法
    gradeFrame的获取方法
    前面提到过,大工教务用的全是iframe框架。对于不会前端、刚写爬虫的小白来说,爬这上面的数据真是各种难受得要死。所以干脆简单粗暴,找到要爬的frame,审查元素从Request URL读出url,把它当成一个新的网页去爬取。如果你想爬课表、学费等信息,这些都是一个个的frame,道理大同小异。

成果展示

后退zb
liyan_grade
yue_grade
前边是我的(成绩就不藏了,不怕丢人( ̄▽ ̄)”),后边是舍友大神的,毕竟看学分就知道比我优秀许多(●ˇ∀ˇ●)!

才不会告诉你劳资翘了一年的课……

后记

通过这个例子,主要是练习利用cookie去模拟网站用户的登陆,从而爬取登陆之前爬不到的数据,并非绕过密码登陆。

基本步骤复习一下:

  1. 创建一个可以处理cookie的opener;
  2. 在访问loginUrl时,将登录后的cookie保存下来;
  3. 利用保存cookie来访问其他网址,gradeFrame。

很简单,代码量也很少,这也是Python爬虫的强大之处,通过urllib2和cookielib两个库的配合使用,轻松访问和抓取Internet资源。特别提一下urllib2这个强大的库,正是它封装的各种方法构成了爬虫的核心——网页下载器;至于cookielib,作用是提供可存储cookie的对象,如CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。

针对iframe框架的网页爬虫其实有专门的策略(博主这样直接找url的方式其实有点耍赖了),Selenium+Phantomjs和switch_to.frame()方法,原理就是模拟一个浏览器,在其中模仿用户操作,然后巴拉巴拉(还没学,讲不下去了/(ㄒoㄒ)/~~)

细心的同学可能发现了,这样做并不合理,因为frame框架下会有翻页等情况出现,所以你用这套代码去爬女神的qq空间、微博神马的就省省吧,而且成熟的网站还有各种验证问题。

整个工程还没有结束,以后还会继续学习更新版本,增加功能。比如翻页、验证等,不过具体更新时间就不得而知了……不过,还是附上GitHub地址,毕竟有后续更新的可能:https://github.com/lyandut/CrawlerJiaowu.git


反正应该不会有太多人看,权当自娱自乐,想到什么就胡乱写一会吧……

前段时间揅笑晏晏崩掉了,具体崩了多久我也不清楚,原因是域名被封禁了,只好重新申请了一个。其实我申请这个域名纯粹是为了建博客练练手,总觉得花钱买的服务器只用来搭建SS翻墙可惜了不是……而且自己一直对前端不太感冒,各种标签、PHP神马乱七八糟的,wordpress用起来也完全没有网上说的那种行云流水、信手拈来的感觉。本站点是搭在国外的服务器上,域名是申请的免费的,所以不够专业就导致访问起来各种卡、慢。加速插件安装了,谷歌字体也禁用了,出了问题调试起来还是卡的不行,因此也就没了耐心。

而且感觉我这个人太不能坚持了,上一篇博客我都记不起是何时更新的了。至于下一篇的更新,希望不会托太久吧。最近工作有点多,实验室班会展示工作成果、职场英语还要做苦逼的presentation、软件工程有许多新的工具软件等着学、设计基础提交最后一次手绘作业、综合楼学长交给的数据挖掘项目我也搁置两周了……倒是只有每周的训练不曾缺席,呵呵~

不过进阶大佬的过程就像追女生,你死缠烂打、软磨硬泡对方总会心软的。所以天天敲几行代码、做点工作总有一天会看到成效的,只不过过程是孤独的、寂寞的。

凡事,坚持下去,如果没看到希望,再咬牙等一会。共勉~

C309
2017.11.02晚

发布了13 篇原创文章 · 获赞 11 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/llllllyyy/article/details/81613245