范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python爬虫实战三之计算大学本学期绩点

  本篇目标1. 模拟登录学生成绩管理系统
  2. 抓取本学期成绩界面
  3. 计算打印本学期成绩1.URL 的获取
  恩,博主来自山东大学~先贴一个 URL,让大家知道我们学校学生信息系统的网站构架,主页是 http://jwxt.sdu.edu.cn:7890/zhxt_bks/zhxt_bks.html,山东大学学生个人信息系统,进去之后,Oh 不,他竟然用了 frame,一个多么古老的而又任性的写法,真是惊出一身冷汗~算了,就算他是 frame 又能拿我怎么样?我们点到登录界面,审查一下元素,先看看登录界面的 URL 是怎样的?
  恩,看到了右侧的 frame 名称,src="xk_login.html",可以分析出完整的登录界面的网址为 http://jwxt.sdu.edu.cn:7890/zhxt_bks/xk_login.html,点进去看看,真是棒棒哒,他喵的竟然是清华大学选课系统,醉了,你说你抄袭就抄袭吧,改改名字也不错啊~算了,就不和他计较了。现在,我们登录一下,用浏览器监听网络。 我用的是猎豹浏览器,审查元素时会有一个网络的选项,如果大家用的 Chrome,也有相对应的功能,Firefox 需要装插件 HttpFox,同样可以实现。 这个网络监听功能可以监听表单的传送以及请求头,响应头等等的信息。截个图看一下,恩,我偷偷把密码隐藏了,你看不到~大家看到的是登录之后出现的信息以及 NetWork 监听,显示了 hearders 的详细信息。
  最主要的内容,我们可以发现有一个表单提交的过程,提交方式为 POST,两个参数分别为 stuid 和 pwd。 请求的 URL 为 http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login,没错,找到表单数据和目标地址就是这么简单。 在这里注意,刚才的 http://jwxt.sdu.edu.cn:7890/zhxt_bks/xk_login.html 只是登录界面的地址,刚刚得到的这个地址才是登录索要提交到的真正的 URL。希望大家这里不要混淆。 不知道山大这个系统有没有做 headers 的检查,我们先不管这么多,先尝试一下模拟登录并保存 Cookie。 2. 模拟登录
  好,通过以上信息,我们已经找到了登录的目标地址为 http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login 有一个表单提交到这个 URL,表单的两个内容分别为 stuid 和 pwd,学号和密码,没有其他的隐藏信息,提交方式为 POST。 好,现在我们首先构造以下代码来完成登录。看看会不会获取到登录之后的提示页面。 __author__ = "CQC" # -*- coding:utf-8 -*-  import urllib import urllib2 import cookielib import re  #山东大学绩点运算 class SDU:      def __init__(self):         self.loginUrl = "http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login"         self.cookies = cookielib.CookieJar()         self.postdata = urllib.urlencode({             "stuid":"201200131012",             "pwd":"xxxxxx"          })         self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))      def getPage(self):         request  = urllib2.Request(             url = self.loginUrl,             data = self.postdata)         result = self.opener.open(request)         #打印登录内容         print result.read().decode("gbk")   sdu = SDU() sdu.getPage()
  测试一下,竟然成功了,山大这网竟然没有做 headers 检查,很顺利就登录进去了。 说明一下,在这里我们利用了前面所说的 cookie,用到了 CookieJar 这个对象来保存 cookies,另外通过构建 opener,利用 open 方法实现了登录。如果大家觉得这里有疑惑,请看 Python 爬虫入门六之 Cookie 的使用,这篇文章说得比较详细。 好,我们看一下运行结果
  酸爽啊,接下来我们只要再获取到本学期成绩界面然后把成绩抓取出来就好了。 3. 抓取本学期成绩
  让我们先在浏览器中找到本学期成绩界面,点击左边的本学期成绩。
  重新审查元素,你会发现这个 frame 的 src 还是没有变,仍然是 xk_login.html,引起这个页面变化的原因是在左边的本学期成绩这个超链接设置了一个目标 frame,所以,那个页面就显示在右侧了。 所以,让我们再审查一下本学期成绩这个超链接的内容是什么~
  恩,找到它了,本学期成绩 那么,完整的 URL 就是 http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre,好,URL 已经找到了,我们继续完善一下代码,获取这个页面。 __author__ = "CQC" # -*- coding:utf-8 -*-  import urllib import urllib2 import cookielib import re  #山东大学绩点运算 class SDU:      def __init__(self):         #登录URL         self.loginUrl = "http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login"         #本学期成绩URL         self.gradeUrl = "http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre"         self.cookies = cookielib.CookieJar()         self.postdata = urllib.urlencode({             "stuid":"201200131012",             "pwd":"xxxxxx"          })         #构建opener         self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies))      #获取本学期成绩页面     def getPage(self):         request  = urllib2.Request(             url = self.loginUrl,             data = self.postdata)         result = self.opener.open(request)         result = self.opener.open(self.gradeUrl)         #打印登录内容         print result.read().decode("gbk")   sdu = SDU() sdu.getPage()
  上面的代码,我们最主要的是增加了 result = self.opener.open(self.gradeUrl)
  这句代码,用原来的 opener 访问一个本学期成绩的 URL 即可。运行结果如下
  恩,本学期成绩的页面已经被我们抓取下来了,接下来用正则表达式提取一下,然后计算学分即可 4. 抓取有效信息
  接下来我们就把页面内容提取一下,最主要的便是学分以及分数了。 平均绩点 = ∑(每科学分 * 每科分数)/ 总学分 所以我们把每科的学分以及分数抓取下来就好了,对于有些课打了良好或者优秀等级的,我们不进行抓取。 我们可以发现每一科都是 TR 标签,然后是一系列的 td 标签  

0133201310

面向对象技术

1

2.5

20150112

94

必修   我们用下面的正则表达式进行提取即可,部分代码如下 page = self.getPage() myItems = re.findall(".*?(.*?).*?(.*?).*?",page,re.S) for item in myItems: self.credit.append(item[0].encode("gbk")) self.grades.append(item[1].encode("gbk"))   主要利用了 findall 方法,这个方法在此就不多介绍了,前面我们已经用过多次了。 得到的学分和分数我们都用列表 list 进行存储,所以用了 append 方法,每获取到一个信息就把它加进去。 5. 整理计算最后绩点   恩,像上面那样把学分绩点都保存到列表 list 中了,所以我们最后用一个公式来计算学分绩点就好了,最后整理后的代码如下: # -*- coding: utf-8 -*- import urllib import urllib2 import cookielib import re import string #绩点运算 class SDU: #类的初始化 def __init__(self): #登录URL self.loginUrl = "http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bks_login2.login" #成绩URL self.gradeUrl = "http://jwxt.sdu.edu.cn:7890/pls/wwwbks/bkscjcx.curscopre" #CookieJar对象 self.cookies = cookielib.CookieJar() #表单数据 self.postdata = urllib.urlencode({ "stuid":"201200131012", "pwd":"xxxxx" }) #构建opener self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookies)) #学分list self.credit = [] #成绩list self.grades = [] def getPage(self): req = urllib2.Request( url = self.loginUrl, data = self.postdata) result = self.opener.open(req) result = self.opener.open(self.gradeUrl) #返回本学期成绩页面 return result.read().decode("gbk") def getGrades(self): #获得本学期成绩页面 page = self.getPage() #正则匹配 myItems = re.findall(".*?(.*?).*?(.*?).*?",page,re.S) for item in myItems: self.credit.append(item[0].encode("gbk")) self.grades.append(item[1].encode("gbk")) self.getGrade() def getGrade(self): #计算总绩点 sum = 0.0 weight = 0.0 for i in range(len(self.credit)): if(self.grades[i].isdigit()): sum += string.atof(self.credit[i])*string.atof(self.grades[i]) weight += string.atof(self.credit[i]) print u"本学期绩点为:",sum/weight sdu = SDU() sdu.getGrades()   好了,最后就会打印输出本学期绩点是多少,小伙伴们最主要的了解上面的编程思路就好。 最主要的内容就是 Cookie 的使用,模拟登录的功能。


力必拓科技参展2018第十届国际物联网博览会,获业界一致好评7月31日8月2日,第十届国际物联网博览会夏季展(以下简称IOTE2018)于深圳会展中心隆重举办。本次展会由中国物联网产业应用联盟深圳市智慧零售协会深圳市零售商业行业协会联合主办苹果iphone13开售被秒光,真有那么香吗?别急,先看完本文2021年9月17日晚间,新款iphone13系列正式开售,用户直接把官网买崩了,iphone13首批售罄连夜补货,新手机热度远远大于预期。iphone13真的有那么香吗?值得买吗新一届中国移动全球合作伙伴大会,到底有多炸?万物智联时代,数智化发展开启了加速模式。近日,中国移动在广州召开了新一届中国移动全球合作伙伴大会,以一场宏大的云上盛典向大众全面诠释中国移动数智化转型战略。本次大会落地于广州保利世苹果ipad9只是最低程度的升级,依然胜过其他竞争对手?伴随iphone13一同上市的ipad9,如今也已经陆续到货了。相比上一代,ipad9只做了最低程度的升级,各方面的变化都很小,但在网上的好评度却非常高,外媒甚至评价道ipad9即苹果iphone13陆续到货,哪一款更值得购买?还没入手的朋友看过来距离iphone13开售已经过了接近一个月时间,许多用户已经陆陆续续收到货并且在使用了,有人说真香,也有人懊悔。几款手机的具体使用体验如何?都有哪些优点缺点?结合上手体验,极客君带Model3性价比最高的豪车,34万加速3。4秒,双电机配四驱MedelY的上市让我们忽略了Model3的高性能版新车的推出,比起2020款的高性能版车型,新车肉眼可见的改变是价格下浮了8万元,由原本的41。98万元变为如今的33。99万元,奔奔Estar2。98万起步,长安也有国民代步车,续航更长空间更大各大城市纷纷推出限行政策,但是新能源车除外。这就促使了新能源车将被越来越多的城市通勤者所选择。开车的首要目的便是带来便捷的出行,随着汽车的越发的普及,城市的拥堵也越来越成问题,若是起亚K5高开低走,2。0T配8AT卖17万叫板雅阁,如今销量大跌几个月前,全新一代起亚K5的热度还是较高的,但是上市至今热度越来越低,如今的销量想必也不是当时的所预期的效果,从K5的销量报表上可以看出,新车上市后,销量最高峰是4300辆,而多数子弹头复活!现代新MPV曝光,造型科幻流线型设计,最多拉11人市场上可选择的MPV车型并不多,这也就意味着这一市场并不饱和,如此一来,一款具有相对实力的MPV车型便具有很强的竞争力高端市场有埃尔法塞纳价格相对便宜的有GL8,更接地气的还有宋M豪华入门新选择,2。0T8AT配四驱,XC40入门23万起商品讲求一个品牌力,在购车这件事上也不例外。一般来说,发展历史更长的合资品牌比自主品牌受信任豪华品牌比普通品牌受欢迎尤其是对于当下一代年轻消费者来说,有限预算内一款来自豪华品牌的车最便宜的奔驰,配1。3T7速双离合,卖20多万销量还不错如今的汽车市场竞争愈发激烈,各种车型层出不穷,若是没有出色的产品力表现或者绝对的价格优势再或是难以攀比的品牌力,新车很难出圈。年轻一代消费者的消费观总体偏向品牌靠向颜值,一款具有强
TANCHJIMDarling三单元圈铁,一种别样的张狂有些老爷车,是真的漂亮,那是一种张狂与精致并存的美感,每个细节都透着属于特定时代的自信与激昂。就包括Mini这种身上带有充分经典印记的现代作品,走在街上的回头率也是明显偏高的,所以199元的塞子做到这个样子还要啥自行车?锐可余音SG01锐可余音这条SG01,包装看起来少说像是三五百块的产品拆开之后一看这金属腔体可换线插头以及绝不拉胯的做工和配件,判断它具备千元塞的设定和卖相听了一耳朵发现素质还不错,500左右的水HIDIZSS3Pro这么个可爱又优秀的小家伙,卖你439软妹币,不算贵吧这篇文章的开头,是老生常谈1iPhone4面世之后,到iPhone7诞生之前的那几年,是音频行业最幸福的岁月,彼时所有手机都有3。5耳机口,而且Beats为代表的品牌让消费者意识到途昂新对手,标配3。5L发动机,31万起售,纯进口品质为你和家人,做坚实的守护者。9月10日,现代进口汽车帕里斯帝(PALISADE)举办线上发布会,以一场视听盛宴解密帕里斯帝(PALISADE),开启大型SUV聚焦家庭出行的新时代。乞版车型卖到32万,广汽丰田赛那还妄想插翅飞?在广汽丰田公布赛那SIENNA预售价之后,相信刚刚遭遇了一波疯狂吐槽的第四代嘉华总算是松了一口气,毕竟赛那3242万元的预售价格直接将自己送上了风口浪尖且不说未来终端是否真的能够买上汽大通MAXUSD90Pro2021款500Nm动力,透明底盘,不到20万?心之所至,探索四方。7月15日,专业级SUV标杆上汽大通MAXUSD90Pro2021款智勇登场。基于C2B智能定制模式,D90Pro2021款可为越野爱好者实现私人定制,蜘蛛定制专业音响空间的组建标准有哪些声拓电子音爵士专业音响空间的组建标准有哪些声拓电子音爵士专业音响设备和普通音响设备的不同之处就在于它的专业性,因为在不同的空间人们发出的声音都是不一样的,音响也是一样的在不同的空间,音响都有自己盖世小鸡X2游戏手柄,玩PSPSP无所不能,连NS都拿下游戏手柄这个产品相信大家都不会陌生,无论是主机游戏PC游戏或是掌机游戏,都离不开手柄。有手柄的支持,玩起游戏也会更加的爽快。而来到智能手机风靡的年代,手游铺天盖地,手游手柄更是火了2021宏碁全球秋季发布会推出抗菌家族,共筑健康屏障2021年10月13日晚9点以因你而生未你而来为主题的宏碁2021全球秋季新品发布会召开,在当前全新的生活方式也唤起了用户对于个人健康的注意,宏碁持续关注并回应用户面对生活挑战的转提升时尚品味就这么简单,韩国大宇手持挂烫机,开启精致小资生活相信很多女生购买衣服,都有这样的经历在店里,试穿挂版的衣服,美美的,品味气质十足。高高兴兴的,营业员从仓库中取出全新的衣服,拿回家中,穿上去,却总感觉哪里不对。在网上买衣服,上身效助力西部安全产业发展,腾讯携手西安院校发布云安全优才计划助力西部安全产业发展,腾讯携手西安院校发布云安全优才计划9月26日,由腾讯安全腾讯安全云鼎实验室陕西省计算机学会联合主办的2021首届西部云安全峰会在西安顺利召开。本次峰会以聚焦云