程序介绍
该程序原理 : 爬取福建工程学院官网的通知,查看最新通知是否有"福建理工大学” "更名" ,如果有则官方发出通知,程序发送邮件。
可以将此程序运行到服务器上,程序会每小时爬取官网一次,建议各位不要把时间间隔更改太小,学校服务器吃不消
完整代码
下面有完整代码,不想复制粘贴,可以访问下方 github
GitHub - linjie111/FJUT_rename
run at main.py
Congratulations
spider.py
import time
from urllib.request import Request
from urllib.request import urlopen
import urllib.parse
import datetime
from bs4 import BeautifulSoup
def get_new_notice(website: str):
# 直接使用 urlopen('网址') 返回 404 错误,对方网站设置有反爬虫机制
requst = Request(website)
requst.add_header('User-Agent', 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)') # 添加请求头,模仿人使用浏览器访问页面
response = urlopen(requst)
# 一、获取该网址的源代码
html = response.read()
# 二、解析源代码
bs = BeautifulSoup(html, 'html.parser') # 爬取该网址的 HTML 源代码
# print(bs)
now = time.localtime()
now_time = time.strftime("%Y-%m-%d", now)
date_list = []
# 三、使用 find 方法找到页面上的通知
# 这里我用最简单的方式,把第一页的所有数据找到,最新的通知一般不会超过第一页,我的功能只是一个提醒,只要有数据提醒就行,并无大碍
# find 返回的是单个 find_all 返回的是多个 - list
date_list1 = bs.find('li', {'class': 'list_item i1'})
date_list.append(date_list1)
name_list2 = bs.find('li', {'class': 'list_item i2'})
date_list.append(name_list2)
name_list3 = bs.find('li', {'class': 'list_item i3'})
date_list.append(name_list3)
name_list4 = bs.find('li', {'class': 'list_item i4'})
date_list.append(name_list4)
name_list5 = bs.find('li', {'class': 'list_item i5'})
date_list.append(name_list5)
name_list6 = bs.find('li', {'class': 'list_item i6'}) #
date_list.append(name_list6)
name_list7 = bs.find('li', {'class': 'list_item i7'}) #
date_list.append(name_list7)
name_list8 = bs.find('li', {'class': 'list_item i8'}) #
date_list.append(name_list8)
name_list9 = bs.find('li', {'class': 'list_item i3'}) #
date_list.append(name_list9)
# print(date_list)
for i in date_list:
span_list = i.find_all("span")
span_time = span_list[2].get_text()
cc = span_time
# print(name_list1) # 爬取的的结果存放在列表中,使用时需要加下标,否则会报错
# print(span_time)
# print(now_time)
if span_time == now_time:
# AttributeError: ResultSet object has no attribute 'find_all'.
# print(cc)
span_date = span_list[1].get_text()
# print(span_date)
return span_date
# print("不是今天")
# return span_date
email163.py
import smtplib
from email.mime.text import MIMEText
from email.header import Header
def send_email(text):
# 这里使用的是163.com
mail_host = "smtp.163.com" # 设置服务器 邮箱服务器
mail_user = "15243***065@163.com" # 用户名 邮箱账号
mail_pass = "2997854888" # 口令 邮箱密码
sender = '15243***065@163.com' # 发送邮箱 和上方用户名一致
receivers = ['2997854888@qq.com'] # 接收者的邮箱
message = MIMEText(text, 'plain', 'utf-8')
message['From'] = Header('FJUT')
message['To'] = Header("2997854888") # 填写接收人账号 @ 前 字符串 比如邮箱为 297854888@qq.com 则填写 2997854888
subject = 'Congratulations'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP()
print(1)
smtpObj.connect(mail_host, 25) # 25 为 SMTP 端口号
print(2)
smtpObj.login(mail_user, mail_pass)
print(3)
smtpObj.sendmail(sender, receivers, message.as_string())
print("邮件发送成功")
except smtplib.SMTPException:
print("Error: 无法发送邮件")
main.py
import time
from email163 import send_email
from spider import get_new_notice
import schedule
data_update = get_new_notice("https://www.fjut.edu.cn/561/list.htm")
str1 = "福建理工大学"
str2 = "更名"
str3 = "大学"
def run():
if str1 in data_update or (str2 in data_update and str3 in data_update):
# 或 可以发邮件者 发短信 进行通知可以定时每一个小时访问一次
# print("特\"大\"喜讯!教育部正式批复,我校更名为福建理工大学")
send_email("特\"大\"喜讯!教育部正式批复,我校更名为福建理工大学")
print(time.localtime())
else:
print("No new notifications ")
schedule.every(1).hours.do(run) # 每隔一小时执行一次
# 先执行一次
run()
while True:
# run_pending:运行所有可以运行的任务
schedule.run_pending()