pyhon3 爬取河海大学URP教务系统,爬取个人成绩,和本学期的成绩GPA,保存到excel

现在不想写,中间有些坑,过几天来聊聊

1.利用百度的ocr,对教务系统的验证码进行识别;
2. 利用urllib库进行模拟登陆和爬取
3. 利用 beautifulSoup对网页进行解析,获取所需数据
4. 利用 xlwt,xlrd,xlutils进行excel的新建和读取和修改

一、爬虫环境搭建

cmd命令pip安装下列模块

pip install bs4
pip install lxml
pip install xlwt
pip install xlrd
pip install xlutils
pip install baidu-aip
pip install pillow

在当前路径下新建一个文件夹data

二、爬虫代码

将学号和密码改成你的

HohaiUrpSpider.py


# encoding: utf-8
'''
@author: weiyang_tang
@contact: weiyang_tang@126.com
@file: HohaiUrpSpider_01.py
@time: 2019-02-18 16:03
@desc: 1.利用百度的ocr,对教务系统的验证码进行识别;2. 利用urllib库进行模拟登陆和爬取3. 利用 beautifulSoup对网页进行解析,获取所需数据4. 利用 xlwt,xlrd,xlutils进行excel的新建和读取和修改
'''import urllib.request, urllib.parse, urllib.error
import http.cookiejar
from BaiduOcr import getVcode
from bs4 import BeautifulSoup
import xlwt
import xlrd
from xlutils.copy import copySNO = '你的学号'  # 学号
pwd = '你的密码'  # 密码
SName = ''  # 学生姓名不用写capurl = "http://jwurp.hhuc.edu.cn/validateCodeAction.do"  # 验证码地址
loginUrl = "http://jwurp.hhuc.edu.cn/loginAction.do"  # 登陆地址logInMaxTryTimes = 10  # 识别验证码最多多少次试错机会,若超过一个阈值则认为学号和密码不符,停止爬虫
getPersonalInfoTimes = 0  # 识别验证码次数,若超过一个阈值则认为学号和密码不符,停止爬虫
getGradesTimes = 0#保存登陆成功的Cookies
cookie_jar = http.cookiejar.CookieJar()
cookie_jar_handler = urllib.request.HTTPCookieProcessor(cookiejar=cookie_jar)
opener = urllib.request.build_opener(cookie_jar_handler)picPath = 'D:/image.jpg'  # 验证码存放的位置# 登陆教务系统
def AutomaticLogin():  # 利用百度ocr识别验证码,为了弥补识别可能出错的缺陷,识别错误多次识别,若多次识别仍是错误,则认为是学号和密码不符picture = opener.open(capurl).read()local = open(picPath, 'wb')local.write(picture)  # 将验证码写入本地local.close()headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.67 Safari/537.36','Host': 'jwurp.hhuc.edu.cn','Origin': 'http://jwurp.hhuc.edu.cn','Referer': 'http://jwurp.hhuc.edu.cn/loginAction.do'}code = getVcode()print(code)postdatas = {'zjh': SNO, 'mm': pwd, 'v_yzm': code}# 模拟登陆教务处data = urllib.parse.urlencode(postdatas).encode(encoding='gb2312')request = urllib.request.Request(loginUrl, data, headers)try:response = opener.open(request)html = response.read().decode('gb2312')# print(html)soup = BeautifulSoup(html, 'lxml')print(soup.title.string)title = soup.title.stringif (title.__contains__('错误信息')):# print('登录失败')AutomaticLogin()except urllib.error.HTTPError as e:print(e.code)def getGrades():global getGradesTimesscoreList = []  # 存放成绩的AutomaticLogin()# 获取成绩gradeUrl = 'http://jwurp.hhuc.edu.cn/bxqcjcxAction.do'gradeRequest = urllib.request.Request(gradeUrl)responseGrade = opener.open(gradeRequest).read().decode('gb2312')# print(responseGrade)soup = BeautifulSoup(responseGrade, 'lxml')if (soup.title.string != None):title = soup.title.stringif (title.__contains__('错误信息')):getGradesTimes = getGradesTimes + 1if (getGradesTimes <= logInMaxTryTimes):getGrades()return Noneelse:print('请检查账号和密码是否正确')return None# print(soup.title.string)try:old_excel = xlrd.open_workbook('data/' + SNO + '_' + SName + '.xls', formatting_info=True)except Exception:getPersonalInfo()getGrades()return Nonenew_excel = copy(old_excel)ws = new_excel.add_sheet('本学期成绩')rowIndex = 0colIndex = 0for th in soup.find_all(name='th'):ws.write(rowIndex, colIndex, th.string.strip())colIndex = colIndex + 1print('%-60s' % th.string.strip(), end=' ')print()rowIndex = 1for tr in soup.find_all(class_='odd'):scoreList.append([])colIndex = 0for td in tr.find_all(name='td'):scoreList[rowIndex - 1].append(td.string.strip())ws.write(rowIndex, colIndex, td.string.strip())colIndex = colIndex + 1print('%-60s' % td.string.strip(), end=' ')rowIndex = rowIndex + 1print()gpa = getGPA(scoreList)ws.write(rowIndex + 2, colIndex, '本学期平均绩点为' + str(gpa))print(scoreList)new_excel.save('data/' + SNO + '_' + SName + '.xls')def getPersonalInfo():global getPersonalInfoTimespersonalInfo = []AutomaticLogin()personalInfoUrl = 'http://jwurp.hhuc.edu.cn/xjInfoAction.do?oper=xjxx'  # 个人信息的urlgradeRequest = urllib.request.Request(personalInfoUrl)responseGrade = opener.open(gradeRequest).read().decode('gb2312')myWorkbook = xlwt.Workbook()mySheet = myWorkbook.add_sheet('个人信息')rowIndex = 0soup = BeautifulSoup(responseGrade, 'lxml')if (soup.title.string != None):title = soup.title.stringif (title.__contains__('错误信息')):getPersonalInfoTimes = getPersonalInfoTimes + 1if (getPersonalInfoTimes <= logInMaxTryTimes):getPersonalInfo()return Noneelse:return Nonefor table in soup.find_all(id='tblView'):for tr in table.find_all(name='tr'):personalInfo.append([])colIndex = 0for td in tr.find_all(name='td'):if td.string != None:personalInfo[rowIndex].append(td.string.strip())mySheet.write(rowIndex, colIndex, td.string.strip())colIndex = colIndex + 1print(td.string.strip(), end='')rowIndex = rowIndex + 1print()global SNameSName = personalInfo[0][3]myWorkbook.save('data/' + SNO + '_' + SName + '.xls')'''
计算本学期的平均绩点
'''def getGPA(scoreList):sumCredit = 0sumPA = 0.0for rowIndex in range(len(scoreList)):if scoreList[rowIndex][5] == '必修':sumCredit = sumCredit + float(scoreList[rowIndex][4])sumPA = sumPA + getPA(scoreList[rowIndex][9]) * float(scoreList[rowIndex][4])try:avgPA = sumPA / sumCreditprint('本学期平均绩点为' + str(avgPA))return avgPAexcept Exception:passdef getPA(score):if score == "优秀": return 5.0if score == "良好": return 4.5if score == "中等": return 3.5if score == "及格": return 2.5if score == "不及格": return 0.0if float(score) >= 90 and float(score) <= 100: return 5.0if float(score) >= 85 and float(score) <= 89: return 4.5if float(score) >= 80 and float(score) <= 84: return 4.0if float(score) >= 75 and float(score) <= 79: return 3.5if float(score) >= 70 and float(score) <= 74: return 3.0if float(score) >= 65 and float(score) <= 69: return 2.5if float(score) >= 60 and float(score) <= 65: return 2.0if float(score) <= 59: return 0.0if __name__ == '__main__':getPersonalInfo()getGrades()

BaiduOcr.py
利用百度AI的文字识别的API进行验证码识别

# encoding: utf-8
'''
@author: weiyang_tang
@contact: weiyang_tang@126.com
@file: BaiduOcr.py
@time: 2019-02-09 15:10
@desc:  基于百度ocr所做的验证码识别
'''
from aip import AipOcr
from PIL import Image# 定义常量
APP_ID = '15537967'
API_KEY = 'WfwAe7nwLBiLRiEThmQcrsG4'
SECRET_KEY = 'G3kHHD2QhvsfVk3jtLmvlR7O5qASXp5l'# 初始化AipFace对象
aipOcr = AipOcr(APP_ID, API_KEY, SECRET_KEY)# 读取图片
filePath = "D:/image.jpg"def get_file_content(filePath):# im = Image.open('D:/image.jpg')  # 1.打开图片# im.show()with open(filePath, 'rb') as fp:return fp.read()def getVcode():# 定义参数变量options = {'detect_direction': 'true','language_type': 'CHN_ENG',}# 调用通用文字识别接口result = aipOcr.basicGeneral(get_file_content(filePath), options)print(result)keyWord = ''try:if (result["words_result"] != None and result["words_result"] != ''):keyWord = result["words_result"][0]['words'].replace(' ', '')except Exception:passreturn keyWordif __name__ == '__main__':code = getVcode()print(code)

三、爬虫成果

pyhon3 爬取河海大学URP教务系统,爬取个人成绩,和本学期的成绩GPA,保存到excel相关推荐

  1. Python爬取URP教务系统课程表并保存到excel

    Python爬取URP教务系统课程表并保存到excel 爬取URP教务系统课程表最终结果如图所示: 接下来开始操作: 首先打开教务系统->按F12->点击Network->刷新一下界 ...

  2. go语言爬取新版正方教务系统数据

    go语言爬取新版正方教务系统数据 学完go语言的基础之后已经过了一个多月了,开始想试着利用些时间写写博客,就打算将半个月前练着写的一个go爬虫小项目翻出来写写.由于之前对go爬虫的一些基础知识不熟悉, ...

  3. Python selenium自动获取URP教务系统课表并以图片形式保存

    之前写过一篇也是爬URP的(Python爬取URP教务系统课程表并保存到excel),不过用的是request+post请求,中间就借用了一下selenium获取验证码链接,所以这次我就写了一个单单用 ...

  4. Crawler:基于BeautifulSoup库+requests库+伪装浏览器的方式实现爬取14年所有的福彩网页的福彩3D相关信息,并将其保存到Excel表格中

    Crawler:Python爬取14年所有的福彩信息,利用requests库和BeautifulSoup模块来抓取中彩网页福彩3D相关的信息,并将其保存到Excel表格中 目录 输出结果 核心代码 输 ...

  5. 豆瓣电影Top250信息爬取并保存到excel文件中

    豆瓣电影Top250下载并保存到excel文件中 效果图 前言 确定目标网页url 爬取过程 导入相关库 页面内容的获取 页面解析 数据提取 主函数的编写 函数调用 数据存储 完整代码 结语 效果图 ...

  6. Python爬取中国大学排名,并且保存到excel中

    前言 以下文章来源于数据分析和Python ,作者冈坂日川 今天发的是python爬虫爬取中国大学排名,并且保存到excel中,当然这个代码很简单,我用了半小时就写完了,我的整体框架非常清晰,可以直接 ...

  7. python爬虫爬取豆瓣电影排行榜并通过pandas保存到Excel文件当中

    我们的需求是利用python爬虫爬取豆瓣电影排行榜数据,并将数据通过pandas保存到Excel文件当中(步骤详细) 我们用到的第三方库如下所示: import requests import pan ...

  8. 【Android+OkHttp3+Jsoup】 模拟登录教务系统 抓取课表和成绩

    原文链接:https://blog.csdn.net/u013347241/article/details/52711018 今天这篇文章为大家带来的是模拟登录教务系统并抓取课表和成绩的详细实现过程. ...

  9. 爬取网易云在线课程并保存到Excel

    一.准备工作 1.打开网易云课堂,搜索Python相关课程,选择全部查看 2.打开谷歌浏览器,使用检查功能(F12)分析页面,在NetWork-XHR中发现所有课程信息都保存在"studyc ...

  10. 利用xpath爬取链家租房房源数据并利用pandas保存到Excel文件中

    我们的需求是利用xpath爬取链家租房房源数据,并将数据通过pandas保存到Excel文件当中 下面我们看一下链家官网的房源信息(以北京为例) 如图所示,我们通过筛选得到北京租房信息 那么我们需要将 ...

最新文章

  1. 04、数据绑定控件 ListBox 的一个 Bug
  2. usb传输标准和接口标准
  3. 无序数组求第k大的数 python_整数无序数组求第K大数
  4. 【python数字信号处理】——scipy库设计滤波器(IIR为例)、绘制滤波器频谱响应、IIR滤波器滤波、读写wav音频文件
  5. 【三维深度学习】点云上采样网络PU-Net 代码分析
  6. Spark的分布式存储系统BlockManager全解析
  7. 高斯拟合 vc++代码_使用python+sklearn实现核岭回归和高斯回归的比较
  8. 人工智能(13)---智能锁
  9. C++ 实现把非静态成员函数作为回调函数(非static)
  10. jQuery slideToggler() 方法 -《狗嗨默示录》-
  11. LCA树两个节点最低公共祖先
  12. MyEclipse安装插件egit并上传项目到码云
  13. ITIL4,全球IT行业抢手的资格认证之一
  14. 《黑客X档案2007配套光盘》2007年上半年合集(6期)
  15. 人脸识别最全知识图谱,中国学者数量全球第三—清华大学出品
  16. 以程序员的方式解决武汉公积金用户注册页面无法点击下一步问题
  17. 算法设计——荷马史诗(K叉哈夫曼 贪心)
  18. WBS-Work Breakdown Structure工作分解结构
  19. 许晓斌_Maven实战(七)——常用Maven插件介绍(上)
  20. 欠债还钱,天经地义(二)

热门文章

  1. Unity开发手机游戏从第一行代码到Taptap上线,我经历了什么
  2. Java POI word常用方法 在Cell插入子表格
  3. 【CVPR2022】论文列表与下载——PartFour
  4. linux查看数据区块大小,Linux显示指定区块大小为1048576字节
  5. PHP爬虫微博某个话题的所有内容,GitHub - wansho/sina_weibo_crawl: 爬取新浪微博某一话题的数据,可以替代微博搜索接口...
  6. Sql Server 随机抽样方法
  7. 数据库实验-- 更新语句
  8. 什么是MySQL索引?
  9. 吉哥系列故事——礼尚往来
  10. 计算机考试表格中的透视图怎么弄,职称计算机考试:创建数据透视表