刚开学时班长发了每个人的身份证号码,被别有用心的boy存到了本地。教务处密码是身份证后六位,然后我就悄悄地(偷偷地)制作了一张均分排名(⊙v⊙)。

过程中学习了模拟登陆以及正则表达式的基本应用。本来是用库urllib的,结果遇到重定向302问题不会提取响应报文,然后就用了第三方库requests(顺便解决了编码问题). 还加入了第三方库xlrd用来读取本地的excel.

代码如下:

  1 # -*- coding: utf-8 -*-
  2 import re
  3 import xlrd
  4 change_sum = 0 #用以存储密码修改的人数
  5 grade_course = ['*************'] 用以存储计算均分的科目
  6 class course():
  7     '''the class of course'''
  8     def __init__(self,L):
  9         self.name = L[2] #学科名称
 10         self.credit = L[3]  #学科学分
 11         self.grade = L[8] #学科分数
 12         self.rank = L[9] #学科排名
 13 class person():
 14     '''the class of person'''
 15     def __init__(self,name,S):
 16         self.name = name
 17         self.courses = S
 18         Grade = 0
 19         Credit = 0
 20         for key,value in S.items():
 21             global grade_course
 22             if key in grade_course:
 23                 try:
 24                     t = float(value.grade)
 25                     Credit += float(value.credit)
 26                     Grade += t*float(value.credit)
 27                 except:
 28                     pass
 29         self.average = Grade/Credit #均分
 30 def save(Path,Data):
 31     '''save Data in Path'''
 32     file_obj = open(Path,'a')
 33     try:
 34         file_obj.write(Data)
 35     finally:
 36         file_obj.close()
 37 def gettext(username,password):
 38     '''input username & password, return marks text'''
 39     import requests
 40
 41     def getlt(data):
 42         '''获取学校教务处hidden的参数lt'''
 43         cer = re.findall('(?<=name=\"lt\" value=\").+?(?=\")',data)
 44         return cer[0]
 45     def getexecution(data):
 46         '''获取学校教务处hidden的参数execution'''
 47         cer = re.findall('(?<=name=\"execution\" value=\").+?(?=\")', data)
 48         return cer[0]
 49
 50     header = { #伪装浏览器
 51         'Connection' : 'Keep-Alive',
 52         'Accept-Language' : 'zh-CN',
 53         'Accept' : 'image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*',
 54         'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; WOW64; Trident/7.0; .NET4.0E; .NET4.0C; .NET CLR 3.5.30729; .NET CLR 2.0.50727; .NET CLR 3.0.30729; InfoPath.2; Tablet PC 2.0; GWX:DOWNLOADED; GWX:RESERVED; GWX:QUALIFIED; SMJB)',
 55         'Accept-Encoding' : 'gzip, deflate',
 56         'Host' : '*********',
 57         'DNT': '1'
 58     }
 59
 60     url = '**********' #学校教务处网址
 61     s = requests.session() #保存cookies
 62     r = s.get(url,headers=header)
 63
 64     lt = getlt(r.text)
 65     execution = getexecution(r.text)
 66     payload = { #构造请求头
 67         'username' : username,
 68         'password': password,
 69         'submit' : '',
 70         'lt' : lt,
 71         'execution' : execution,
 72         '_eventId' : 'submit',
 73         'rmShown' : '1'
 74     }
 75
 76     login = s.post(url,data=payload,headers=header)
 77
 78     if login.status_code == 200:
 79         print('%s login success!'%name)
 80         temp = s.get('**************',headers=header)
 81         preurl = '**************'
 82         dox = '************' #存放成绩的地址
 83         newurl = preurl + dox
 84         temp = s.get(newurl,headers=header)
 85         return temp.text
 86     else:
 87         print('%s login failed, login.status_code:'%name+login.status_code)
 88         return ''
 89 def textanal(name,text):
 90     '''analysis the text of name, and save its grades'''
 91     if text :
 92         prepath = '***********' #保存个人成绩的地址
 93         path = prepath + name +'.txt'
 94
 95         #从网页中获取成绩
 96         marks = text.split('''<tr class="odd" onMouseOut="this.className='even';" onMouseOver="this.className='evenfocus';">''')
 97         courses = {}
 98         n = 0
 99         for cours in marks:
100             if n > 0 :
101                 L = re.findall('(?<=\s)[^<|\s][^>]*?(?=\s)',cours)
102                 if len(L) >= 10 :
103                     while len(L) > 10 :
104                         del L[3]
105                     key = L[2]
106                     value = course(L)
107                     save(path,' '.join(L)+'\n')
108                     courses[key] = value
109                 elif len(L) != 10 :
110                     print('Error : wrong course')
111             n += 1
112         if courses :
113             one = person(name,courses)
114             path = prepath + 'allmarks.txt'
115             save(path,name+' '+str(one.average)+'\n') #记录此人均分
116         else :
117             global change_sum
118             change_sum += 1
119             print('%s password changed or exist verification code!'%name)
120
121 #读取每个人的username和password
122 book = xlrd.open_workbook('************')
123 sheet = book.sheet_by_index(0)
124 nrows = sheet.nrows
125 for x in range(nrows):
126     row = sheet.row_values(x)
127     name = row[5]
128     username = row[2]
129     password = row[15][-6:]
130     text = gettext(username,password)
131     textanal(name,text)
132 print(change_sum) #输出修改密码的人的个数

最后用excel处理下数据就好啦!

然而最后发现修改了密码的人好少= =只有个位数

转载于:https://www.cnblogs.com/barrier/p/5716209.html

模拟登陆教务处获取成绩相关推荐

  1. 人生苦短,我用Python--爬虫模拟登陆教务处并且保存数据到本地

    刚开始接触Python,看很多人玩爬虫我也想玩,找来找去发现很多人用网络爬虫干的第一件事就是模拟登陆,增加点难度就是模拟登陆后在获取数据,但是网上好少有Python 3.x的模拟登陆Demo可以参考, ...

  2. html模仿微信好友列表,微信的模拟登陆及获取好友列表

    最近没事写了个微信模拟登陆的代码,测试可以到今天2013年11月4日为止是可以登陆的 登陆是用的jsoup实现的,一个简单又强大的工具.不懂的可以@红薯站长去 Connection.Response ...

  3. Java模拟登陆微博获取cookie+使用微博图床api上传图片

    前言 Wbp4j 前排安利以下使用java完成的基于微博图床api实现的一个上传图片的小轮子,然后里面也有完整的代码可以查看,欢迎戳一下~ 传送门 目的 因为最近个人小项目里需要上传图片,看着自己的1 ...

  4. 如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用

    public static string GetCookie(string requestUrlString, Encoding encoding, ref CookieContainer cooki ...

  5. selenium模拟登陆豆瓣并获取cookies

    验证码处理与模拟登陆豆瓣,首先我们看到豆瓣没有cookies,我们需要用程序来模拟登陆获取cookies(当前有些情况下自己手动登陆后复制粘贴cookies也能登陆),该文主要讲方法,如何用selen ...

  6. 爬取知乎壁纸:selenium模拟登陆获取cookies,再将cookies传递给requests

    selenium很好用,但是爬取大量数据时速度较慢. 通过selenium模拟登陆,获取cookies,再将cookies传递给requests,通过requests爬取加快速度. 以为知乎网爬取壁纸 ...

  7. Scrapy框架的学习(10.Scrapy中的模拟登陆(使用cookie模拟登陆))

    1. 为什么需要模拟登陆? 获取cookie,能够爬取登陆后的页面的数据 2.使用cookie模拟登陆的场景 (1) cookie过期时间很长,常见于一些不规范的网站 (2) 能在cookie过期之前 ...

  8. 豆瓣网络爬虫-java网络爬虫[验证码模拟登陆]详细介绍

    目录 抓包介绍 解决验证码的思路 验证码地址拼接 爬虫实战 爬虫架构 model main 解析htmlparse 数据库操作程序db 近期,有人将本人博客,复制下来,直接上传到百度文库等平台. 本文 ...

  9. 自媒体平台数据统计分析爬虫之【趣头条】模拟登陆分析详解及数据统计接口详解

    声明:本文仅用于学习研究,实现对自己账号的数据统计和分析 目录 1.登录流程 1.1 登录字段DES加密算法 1.2 模拟登陆,获取token 2.视频内容数据 2.1 全部 2.2 待审核 2.3 ...

最新文章

  1. 二、如何保存MNIST数据集中train和test的图片?
  2. 此问题可能是由配置更改或安装另一个扩展导致的
  3. lepus mysql 复制监控_sql_mode=ONLY_FULL_GROUP_BY 导致lepus监控mysql5.7报错
  4. Jquery加载dom元素
  5. 利用计算机进行自动控制 控制对象主要指,计算机试卷10
  6. python3 装饰器_python3装饰器
  7. uitextfield 键盘类型_iOS输入类型-文本字段(Text Fields) | 菜鸟教程
  8. Redis的key和value大小限制
  9. 【转】matlab与C/C++混合编程——在Windows/Linux上调用Matlab编译的动态库文件
  10. fstatfs/statfs详解
  11. html语言空格怎么写,html的空格代码怎么写?
  12. 翻译: Octave 入门教程
  13. PM经验谈 项目管理工具必备的5个功能
  14. HTML5是不是解决跨平台问题的终极密钥
  15. 指纹识别 源代码中带有大量注解
  16. ie浏览器html页面怎么清缓存,Web项目中,清理浏览器缓存的几种方式
  17. MATLAB天牛须搜索算法求解数据拟合和多参数优化问题代码实例
  18. html5 dom video,HTML5 / HTML5 video - 使用 DOM 进行控制 - 汇智网
  19. 星起航:亚马逊卖家利用一件代发模式实现跨境电商飞速发展
  20. 解决ubuntu无法显示中文拼音

热门文章

  1. 1027. 打印沙漏(20)-PAT乙级真题
  2. new blob文件设置编码_前端下载文件amp;下载进度
  3. Linux修改主机名称
  4. Oracle 当前用户给另一个用户授权查询指定表或视图的权,否则另一个用户提示不存在视图或表
  5. 多年心路历程见证从技术小白到收获BAT等大厂研发offer,分享一些经验和感悟...
  6. MySQL的odbc驱动 下载及安装
  7. Linux Shell脚本之利用mysqldump备份MySQL数据库(详细注解)
  8. 修改UCenter用户名长度限制的方法php程序和数据库修改
  9. JSONObject以及json(转)
  10. CentOS6.4 xen4.2 虚拟机 桥接网络设置