利用python实现软考成绩实时监控+查询提醒

2022上半年软考成绩迟迟还没出,软考办的办事效率实在让人~~  与其在各大软考群里听大伙聊天吹水各种内鬼,在电脑面前苦逼地按着F5刷来刷去,不如解放双手,让python来帮你实时关注软考成绩发布情况!

 脚本原理大致讲解一下:最近网上出现了蛮多关于软考自动查询成绩的脚本,软考官网也是制定出了一定的防爬机制。所以我打算使用selenium进行网页的自动化操作+smtplib实现邮件定时发送。通过爬取软考成绩查询界面源码中是否出现“2022年上半年”关键字来判断成绩是否可以查询。

一.Selenium浏览器自动化操作

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。

首先下载一下Selenium库,一样可以通过pip install来安装(管理员身份运行CMD,输入下列代码)

pip install selenium

浏览器这边选用Chrome谷歌浏览器 

对应的要安装一下Chromedriver

下载地址:https://registry.npmmirror.com/binary.html?path=chromedriver/

这边要注意一下下载的driver和浏览器版本要对应上

谷歌浏览器版本查看方法:设置→关于Chrome

下载完之后将解压出来的chromedriver.exe剪切到python.exe目录下(这边怎么找到python.exe就不赘述了,自行百度一下)

 

前期浏览器准备工作完成后,开始码代码

导入

from selenium import webdriver
from selenium.webdriver.common.by import By
import time

 浏览器自动化操作

def main():
	global driver   #定义driver为全局变量,不然浏览器会闪退
	opt = webdriver.ChromeOptions()     #创建浏览器参数对象
	driver = webdriver.Chrome(options=opt)   #创建无界面对象
	driver.get('https://query.ruankao.org.cn/')  #访问软考成绩查询首页
	driver.find_element(By.LINK_TEXT, '成绩查询').click()  #点击“成绩查询”按钮
if __name__ == "__main__":
    main()

 成功打开

 到这里可能有小伙伴会提问:为什么不直接get考试成绩查询的界面,反而要去点击一下“成绩查询”的按钮呢?

实际情况是由于防爬机制,直接get https://query.ruankao.org.cn/score/main是行不通的。

由于打开了两个网页,如果按顺序运行下去的话driver操作会始终停留在首页,而我们需要对新打开的网页进行操作,这边就需要获取新弹出网页的“句柄”(可以理解为窗口的编号)并将driver切换至新弹出的网页。


	handles = driver.window_handles    #获取当前所有窗口的句柄
	handle2 = handles[-1]           #获取最新窗口的句柄
	driver.switch_to.window(handles[-1])     #切换至最新窗口

 这边可以通过两次title看出区别

接下来我们通过网站的源码中是否增添了“2022年上半年”的选项来判断成绩是否可以查询。

response = driver.page_source  #获取网站源码

 通过源码我们可以找到关键节点,如果成绩可以查询则节点中会增添一行2022年上半年的字眼

 由此可以设立关键字2022作为判断条件,如果出现关键字则发送自动发送邮件通知“可以查询成绩啦”;如果不行则发送“还不能查询成绩哦”。

二.smtplib邮件发送

依旧首先导入相应的库,没有的就pip install

这边主要用到smtplib、email

smtplib负责发送邮件,email负责构造邮件

import smtplib    
from email.mime.multipart import MIMEMultipart    
from email.mime.text import MIMEText    
from email.mime.image import MIMEImage 
from email.header import Header
import schedule

 在开始码代码前,我们需要拿到QQ邮箱的授权码(下面要用到)

具体步骤:QQ邮箱首页→设置→账户→开启pop3/smtp服务,然后你会拿到一串授权码

代码部分

	key=('2022')   #设定关键字
	if key in response:
		driver.quit()   #完全退出浏览器
		smtpserver = 'smtp.qq.com'      #指定qq邮箱发送 
		username = '*****@qq.com'       #发件人用户名
		password='******'               #这边填授权码,不是填密码
		sender='*******@qq.com'       #发件人用户名
		receiver='*****@qq.com'         #接收人
		subject = '可以查成绩了!!'     #邮件的主题
		msg = MIMEMultipart('mixed')    
		msg['Subject'] = subject        
		msg['From'] = '******@qq.com <******@qq.com>'  #邮件发送人
        msg['To'] = '******@163.com'                   #邮件收件人
		text = "巴拉巴拉"                               #正文内容
		text_plain = MIMEText(text,'plain', 'utf-8')   #保证兼容性
		try:
			smtp = smtplib.SMTP()
			smtp.connect('smtp.qq.com')
			smtp.login(username, password)    
			smtp.sendmail(sender, receiver, msg.as_string())
			print ("邮件发送成功")         
		except smtplib.SMTPException:
			print ("邮件发送失败")
	else:
		driver.quit()   #完全退出浏览器
		smtpserver = 'smtp.qq.com'      #指定qq邮箱发送 
		username = '*****@qq.com'       #发件人用户名
		password='******'               #这边填授权码,不是填密码
		sender='*********@qq.com'       #发件人用户名
		receiver='*****@qq.com'         #接收人
		subject = '还不可以查成绩哦'     #邮件的主题
		msg = MIMEMultipart('mixed')    
		msg['Subject'] = subject        
		msg['From'] = '******@qq.com <******@qq.com>'  #邮件发送人
        msg['To'] = '******@163.com'                   #邮件收件人
		text = "巴拉巴拉"                               #正文内容
		text_plain = MIMEText(text,'plain', 'utf-8')   #保证兼容性
		try:
			smtp = smtplib.SMTP()
			smtp.connect('smtp.qq.com')
			smtp.login(username, password)    
			smtp.sendmail(sender, receiver, msg.as_string())
			print ("邮件发送成功")         
		except smtplib.SMTPException:
			print ("邮件发送失败")

 

至此就可以在邮箱里收到邮件啦!

三.schedule定时任务

我们想实时监控成绩是否可以查询,就需要脚本定时重复的工作,这边就用到schedule来帮我们实现。

这边我们需要新建一个.py的文件(例如dingshi.py),和上文的py文件(chengji.py)放在一起。

代码如下:

import schedule
import time
from chengji import main   #上文的py文件我命名为chengji.py 函数名为main



schedule.every(5).minutes.do(main)   #每5分钟执行一次任务
while True:                          #校验
    schedule.run_pending()
    time.sleep(1)

 接着我们每次只需要打开schedule所在的py文件就行啦。

四.完整代码如下

chengji.py

from selenium import webdriver
from selenium.webdriver.common.by import By
import time
import smtplib    
from email.mime.multipart import MIMEMultipart    
from email.mime.text import MIMEText    
from email.mime.image import MIMEImage 
from email.header import Header

def main():
	global driver 
	browser = webdriver.Chrome()
	opt = webdriver.ChromeOptions()                 
	driver = webdriver.Chrome(options=opt)
	driver.get('https://query.ruankao.org.cn/')
	driver.find_element(By.LINK_TEXT, '成绩查询').click()
	time.sleep(2)
	handles = driver.window_handles
	handle2 = handles[-1]
	driver.switch_to.window(handles[-1])
	response = driver.page_source
	key=('2022')
	if key in response:
		driver.quit()
		smtpserver = 'smtp.qq.com'
		username = '*******@qq.com'
		password='*******'
		sender='*******@qq.com'
		receiver=['*******@126.com']
		subject = '可以查成绩了!!'
		msg = MIMEMultipart('mixed')
		msg['Subject'] = subject
		msg['From'] = '*******@qq.com <*******@qq.com>'
		msg['To'] = '*******@qq.com'
		text = "巴拉巴拉" 
		text_plain = MIMEText(text,'plain', 'utf-8') 
		try:
			smtp = smtplib.SMTP()
			smtp.connect('smtp.qq.com')
			smtp.login(username, password)    
			smtp.sendmail(sender, receiver, msg.as_string())
			print ("邮件发送成功")
		except smtplib.SMTPException:
			print ("邮件发送失败")
	else:
		driver.quit()
		smtpserver = 'smtp.qq.com'
		username = '*******@qq.com'
		password='********'
		sender='*******@qq.com'
		receiver=['*******@126.com']
		subject = '还不可以查成绩噢'
		msg = MIMEMultipart('mixed')
		msg['Subject'] = subject
		msg['From'] = '*******@qq.com <*******@qq.com>'
		msg['To'] = '*******@qq.com'
		text = "巴拉巴拉" 
		text_plain = MIMEText(text,'plain', 'utf-8') 
		try:
			smtp = smtplib.SMTP()
			smtp.connect('smtp.qq.com')
			smtp.login(username, password)    
			smtp.sendmail(sender, receiver, msg.as_string())
			print ("邮件发送成功")
		except smtplib.SMTPException:
			print ("邮件发送失败")

if __name__ == "__main__":
    main()

dingshi.py

import schedule
import time
from chengji import main   #上文的py文件我命名为chengji.py 函数名为main



schedule.every(5).minutes.do(main)   #每5分钟执行一次任务
while True:                          #校验
    schedule.run_pending()
    time.sleep(1)

参考链接:

python自动发送邮件_数据会说话的博客-CSDN博客

python模拟登录并操作网页_你的小胜利的博客-CSDN博客_python模拟网页操作

python 定时任务schedule_parhats的博客-CSDN博客_python schedule函数

selenium中的三种切换:Windows窗口,iframe,alert弹窗_进击的小陈的博客-CSDN博客_selenium切换到弹出窗口

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w9241212

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值