Python实现校园通知自动抓取与多端提醒系统
本文详细介绍如何使用Python编写校园通知监控脚本。通过urllib和re库抓取教务处、图书馆等网站的新通知,利用Twilio发送短信、smtplib发送邮箱提醒。文中还涵盖了处理编码异常、多收件人发送、Windows中文环境兼容性及使用PyInstaller打包为exe可执行文件的完整流程与常见故障排除。
项目背景与概述
前言
该项目实际上在一个月前就已开发完毕,期间一直计划撰写博客以总结开发过程中的经验与问题。由于近期工作繁忙,直到此刻才完成整理并发布。
项目的初衷源于个人习惯:闲暇时,我习惯逐一访问学校主页、教务处、图书馆及学院官网,查看是否有新通知发布,尽管多数通知与个人无关。恰逢近期正在学习Python,常听人提及Python编写爬虫非常简单,但本人此前并未接触过相关技术。因此,抱着尝试的心态阅读了多篇Python爬虫教程,发现实现难度确实不高。随后,结合官方文档与网络博客,最终完成了个人首个爬虫项目。
简介
系统核心逻辑是利用urllib.request库获取目标URL(即各网站“更多通知”页面)的源代码,随后使用Python的re库进行正则表达式匹配,提取通知的关键信息。提取后的数据会与本地文件中存储的上一次爬取结果进行对比。
一旦检测到存在新通知,系统将触发两种提醒机制:一是利用twilio库向指定的手机号码发送SMS短信;二是利用smtplib库向指定的邮箱地址发送提醒邮件。
此外,程序还具备记录运行日志及异常日志的功能,便于后续排查问题。
当前版本仅支持本校相关通知的监控与提醒,未来计划逐步优化代码结构,以提高项目的通用性和适配性。
源码:
Github地址:School_Notice
环境准备与依赖安装
准备工作
安装twilio库:pip install twilio
注册twilio账号:Twilio
验证手机号:用来接收短信提醒的号码必须在twilio上进行验证
开发过程中的常见问题与解决方案
遇到的问题
邮件发送
在使用变量msg保存邮件文本时,msg['From']和msg['To']必须设置为实际的邮箱地址,否则可能引发SMTPDataError(code, resp)异常。例如,必须明确指定msg['From'] = 'xxxxx@qq.com'。本文示例使用的是QQ邮箱,其他邮箱服务商的具体要求可能有所不同。
原本计划通过for循环实现多人发送,后发现smtplib库的sendmail方法本身支持向多个收件人发送,只需将参数设置为列表(list)即可。因此,可以使用str.split(',')将逗号分隔的字符串转换为列表。
在Windows系统下运行Python程序时,若计算机名为中文字符,可能会导致程序运行异常。解决方法是右键点击“此电脑”选择“属性”,将计算机名修改为英文或数字。
程序代码中使用的邮箱密码并非登录密码,而是需要在邮箱设置中的“账户”->“SMTP服务”处获取的授权码。
其他问题
有时会出现接收不到Twilio发送短信的情况,即使联系运营商10086也无法查明原因。推测可能是短信内容中包含敏感词汇(如学校名称),修改短信内容后问题得以解决。
对上述几个网站的源码使用re.findall后,返回的列表中每个元组内的元素顺序均为“时间、标题、链接”。然而,对学生处网站的源码进行正则匹配后,元素顺序并不一致。因此需要单独调整顺序。直接修改元组中的元素会引发error:tuple' object does not support item assignment异常,因为元组是不可变对象。
解决方法是:
if(subject_EN == 'snnu_xsc'):
new_data = []
for item in data:
temp = (item[1], item[2], item[0])
new_data.append(temp)
data = new_data
Python3中的print函数默认自动换行。若需要取消自动换行,可以写作:print(str,end='')
不同网站的编码格式可能不同,必须按照各自的编码方式进行解码。若统一使用utf-8方式,可能会出现编码错误,例如:
UnicodeDecodeError: ‘utf-8' codec can't decode byte 0xc9 in position 167
解决方法是:
if find1 == -1 & find2 == -1:
Coding = 'utf-8'
else:
# 教务处网页源码编码格式为为gbk
# 学生处网页源码编码格式为gb2312
Coding = 'gbk'
data = response.read().decode(Coding)
程序打包与部署指南
Python程序打包为exe(Pyinstaller)
安装及使用
使用pip install pywin32安装pywin32
使用pip install PyInstaller安装Pyinstaller
使用pyinstaller -F main.py即可将Python程序打包为exe程序
注意事项
打包之前应将用到的第三方库(此项目仅用到Twilio)复制到与要打包的py文件同一目录下。
可使用pyinstaller -F -i logo.ico main.py,为生成的exe程序添加图标
使用的ico文件像素不能过小,否则有可能出现:打包后的程序图标只有在资源管理器中设置为以小图标查看的情况下才显示的是自己的图标,其他情况仍未默认图标
使用截图



以上这篇用Python实现校园通知更新提醒功能就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持本站。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













