chapter12-实战成绩通知短信系统(下)

2024-01-22 09:52

本文主要是介绍chapter12-实战成绩通知短信系统(下),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

注意!成绩短息通知服务的源码共分为两种:第一种为线性的程序,逻辑简单,但是格式杂乱;第二种为以类作为基础,封装了各种函数,逻辑较为复杂,但是格式清晰。建议新手先学习第一种代码风格,了解代码逻辑后,尝试自己完成第二种开发
上节课,我们成功的登录了某方的教务系统,同时已经得到了我们想要获取的成绩页面。这节课,我们将首先提取成绩页面中的有效信息,然后将相关信息保存至数据库中,最后,使用短信接口发送成绩通知。相关的代码,你仍然可以在本课程对应的Github页面获取,欢迎各位同学在讨论区进行讨论!

提取信息

首先让我们分析一下成绩页面的HTML格式:

<table class="datelist" cellspacing="0" cellpadding="3" border="0" id="Datagrid1" width="100%"><tr class="datelisthead"><td>学年</td><td>学期</td><td>课程代码</td><td>课程名称</td><td>课程性质</td><td>课程归属</td><td>学分</td><td>绩点</td><td>成绩</td><td>辅修标记</td><td>补考成绩</td><td>重修成绩</td><td>学院名称</td><td>备注</td><td>重修标记</td></tr><tr><td>2016-2017</td><td>2</td><td>1310040</td><td>ASP.NET应用开发1</td><td>专业选修课</td><td> </td><td>3.5</td><td>1.9</td><td>69</td><td>0</td><td> </td><td> </td><td>计算机与软件工程学院</td><td> </td><td>0</td></tr><tr><td>2016-2017</td><td>2</td><td>2011536</td><td>形势与政策Ⅵ</td><td>通识必修课</td><td> </td><td>0.0</td><td>3.5</td><td>良好</td><td>0</td><td> </td><td> </td><td>马克思主义学院</td><td> </td><td>0</td></tr>
</table>

从上面的HTML源码中,我们可以清晰的看到,所有的信息都存在于id为Datagrid1的表格中。因此,我们首先要提取Datagrid1表格中的所有tr

soup = BeautifulSoup(score_text.content, "lxml",from_encoding="gb18030")
trs = soup.find(id="Datagrid1").findAll("tr")

上述代码和我们之前遇到的用法不太一样,因此我们要详细说明一下上述代码中的相应参数:

soup = BeautifulSoup(score_text.content, "lxml",from_encoding="gb18030")

首先是score_text.content,在以前的开发中,我们使用的是text方式获取网页信息,这里我们使用了’content’方式的原因是,某方返回的数据是gb2312格式的内容,因此我们需要直接用二进制的方式来传递内容,同时,我们也通过from_encoding来进一步的向BeautifulSoup说明我们的原始参数。
接下来我们要解析tr中的所有数据:

Grades = []
for tr in trs:tds = tr.findAll("td")tds = tds[:2] + tds[3:5] + tds[6:9]oneGradeKeys = ["year", "term", "name", "type", "credit","gradePonit","grade"]oneGradeValues = []for td in tds:oneGradeValues.append(td.string)oneGrade = dict((key, value) for key, value in zip(oneGradeKeys, oneGradeValues))Grades.append(oneGrade)

上述代码中,我们遍历了所有tr中的td内容。需要指出的是,我们获取成绩,仅仅需要成绩所对应的年份学期,课程名,课程性质,学分,绩点,成绩。因此在获取到td中的数据库后,我们需要剔除一些无用的数据。具体的,原始数据为:

[<td>2016-2017</td>, <td>2</td>, <td>1310040</td>, <td>ASP.NET应用开发1</td>, <td>专业选修课</td>, <td> </td>, <td>3.5</td>, <td>3.7</td>, <td>87</td>, <td>0</td>, <td> </td>, <td> </td>, <td>计算机与软件工程学院</td>, <td> </td>, <td>0</td>]

整理后的数据为:

[<td>2016-2017</td>, <td>2</td>, <td>ASP.NET应用开发1</td>, <td>专业选修课</td>, <td>3.5</td>, <td>3.7</td>, <td>87</td>]

接下来,让我们打印一下我们的成果

注意:因为传递的内容编码为gb2312格式,因此我们需要定义python程序的默认格式

# coding=gbk
for score in Grades:year = score["year"]term = score["term"]gradepoint = score["gradePonit"]grade = score['grade']print(gradepoint,end='\t')print(grade,end='\t')name = score["name"]print(name)

在这里插入图片描述

Bingo!我们已经获取到了相关的成绩信息!接下来让我们将数据存入数据库中

保存数据到数据库

因为数据库的操作,我们在之前的章节中就已经学习过,因此本文直接给出对应的代码。

  1. 创建数据表
CREATE TABLE SCORE(
id INT AUTO_INCREMENT PRIMARY KEY,
year_ varchar(12),
term_ VARCHAR(12),
name_ VARCHAR(12),
type_ VARCHAR(10),
credit_ VARCHAR(10),
gradePoint_ VARCHAR(10),
grade_ VARCHAR(10)
)ENGINE=INNODB;
  1. 在Python操作数据库
import pymysql
db = pymysql.connect("localhost","root","654321","mysql" )
cursor = db.cursor()
def insert_info(year, term, name, type, credit,gradePonit,grade):sql = "INSERT INTO score(year_, term_, name_, type_, credit_,gradePoint_,grade_) VALUES('"+str(year)+"','"+str(term)+"','"+str(name)+"','"+str(type)+"','"+str(credit)+"','"+str(gradePonit)+"','"+str(grade)+"')"print(sql)cursor.execute(sql)db.commit()

####判别是否发送短信
3. 从数据库中判断
为了精确的发送短信,我们在获取到信息之后,从数据库中查询是否存在对应的课程名称,如果存在,则不发送;如果数据库中不存在该门课程的信息,则发送短息:

 int result = select_info(name)if result!=0:time.sleep(60*60)else:send_mail(year,term,name,type,credit,gradePoint,grade)
  1. 从数组中判断
    从数据库中获取信息,经过数据库连接、数据库关闭等操作,不仅浪费了时间,而且还消耗了大量的系统资源。因此,我们可以定义一个全局变量,将相关信息保存在变量中。判断新的课程是否存在变量中:
juage=[]
if name not in juage:send_mail(year, term, name, type, credit, gradePoint, grade)juage.append(name)
else:print("已经存在,不发送短信")

####发送短信
发送短息我们已经学习了很多的方法。因此本文并不指定大家选择哪个方法。课题提供的代码中,使用的是通过139信箱发送短信,大家可以使用其他的方法进行操作。
####系统说明
5. 为了保证该系统全天为我们服务,我们可以将主函数一直运行,每次运行后使用time.sleep()函数,使服务休眠1小时或者你指定的时间;
6. 因为验证码目前需要手动输入,因此建议使用Windows服务器配置环境。(后续将会提供自动识别验证码服务,大家以后可以迁移至Linux服务中)

系统测试

在运行之前,请确你已经配置好下面的参数:

  • 用户名

  • 用户密码

  • 教务网地址

  • 教务网验证码地址

  • 查询成绩地址

  • 数据库连接相关信息

  • 邮件发送的相关信息
    配置好上述参数的信息后,你的手机肯定会收到这样一条短信:
    在这里插入图片描述

    没错!你已经完成了成绩通短信通知服务!那么,为什么不参考之前文章中的知识,让它在云服务器中为你服务呢?

    总结
  1. 本文存在着大量的编码转化、数据存储操作。希望大家有问题一定要去讨论区进行讨论,我会第一时间为大家解答;
  2. 还是要提醒大家:项目需要配置的信息很多,希望同学们能够静下心来,耐心的跟着文章学习;
  3. 自动识别验证码目前的准确率已经达到了90%,我将会尽快更新相关代码。可能你看到这篇文章的时候,就不需要人工识别验证码了。

这篇关于chapter12-实战成绩通知短信系统(下)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/632627

相关文章

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用

Ubuntu系统怎么安装Warp? 新一代AI 终端神器安装使用方法

《Ubuntu系统怎么安装Warp?新一代AI终端神器安装使用方法》Warp是一款使用Rust开发的现代化AI终端工具,该怎么再Ubuntu系统中安装使用呢?下面我们就来看看详细教程... Warp Terminal 是一款使用 Rust 开发的现代化「AI 终端」工具。最初它只支持 MACOS,但在 20

windows系统下shutdown重启关机命令超详细教程

《windows系统下shutdown重启关机命令超详细教程》shutdown命令是一个强大的工具,允许你通过命令行快速完成关机、重启或注销操作,本文将为你详细解析shutdown命令的使用方法,并提... 目录一、shutdown 命令简介二、shutdown 命令的基本用法三、远程关机与重启四、实际应用

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1